GRE接口数据包路由至远程端点的原理及GRE隧道转发流程疑问
GRE接口数据包路由至远程端点的原理及GRE隧道转发流程疑问
咱们先把你的场景和疑问拆解清楚:你在PC(192.168.0.10)和无线路由器(192.168.0.103)之间搭建了二层GRE(gretap)隧道,两端的隧道接口都挂在各自的网桥br0里;客户端从PC的DHCP拿到10.10.10.102,ping网关10.10.10.1能成功,但你疑惑为什么发往这个网关的包会被自动封装成GRE报文——毕竟l2gre0只配置了远程和本地IP,它怎么知道要处理这个包?
首先明确gretap隧道的核心特性
gretap是二层GRE隧道设备,它的本质就是一个「二层帧的封装转发器」:只要有二层帧进入这个接口,它就会严格按照你创建时指定的remote和local参数,把这个帧封装进GRE报文,然后通过三层网络发往远程端点。它不需要判断帧里的IP地址是什么,只认「进入我这个接口的帧,全部封装转发」。
网桥br0的转发决策是关键
你路由器这边的br0把lan0和l2gre0桥接在了一起,网桥工作在二层,靠MAC地址表决定帧的转发路径:
- 客户端要ping网关
10.10.10.1,首先会发送一个二层帧,目的MAC是10.10.10.1对应的接口MAC(这个MAC来自PC侧的接口,会通过GRE隧道被路由器的br0学习到,MAC表中会记录该MAC关联的端口是l2gre0)。 - 当
lan0收到这个帧后,br0查询MAC表,发现目的MAC对应的端口是l2gre0,于是就把这个帧转发到l2gre0接口。
l2gre0的封装与后续转发逻辑
当帧进入l2gre0后,这个隧道设备会自动执行封装操作:
- 用你创建时指定的
local 192.168.0.103作为GRE报文的源IP,remote 192.168.0.10作为目的IP,把原始的二层帧打包进GRE报文中。 - 封装好的GRE报文会被交给路由器的三层协议栈,此时查询路由表:你的路由表显示
192.168.0.0/24是eth0的直连网段,所以GRE报文就从eth0接口发送出去,最终到达PC的enp3s0接口。
结合你的抓包结果验证
你在lan0看到的原始二层帧,是客户端发送的初始报文;在l2gre0看到和lan0一样的帧,这是网桥br0转发的结果;而在eth0看到已经封装好的GRE报文,这就是l2gre0完成封装后,交给eth0发送的三层报文——整个流程是:网桥做二层转发决策 → gretap设备负责二层帧的GRE封装 → 路由表指导封装后三层报文的转发。
备注:内容来源于stack exchange,提问作者Haswell




