我在路由器上设置了 OpenWRT,无线客户端连接在 LAN 上,并连接到 WAN 上的另一个网络。在接口wlan1
上桥接br-lan
,通常转发到 LAN 接口eth0
。
192.168.1.20
我目前正在从LAN 上的客户端 ( ) 向128.112.94.34
WAN 上的服务器 ( ) 发送 TCP/UDP 数据包。当我运行tcpdump -len -i br-lan
(查看接口上的数据包)时br-lan
,我可以看到每个数据包都通过了,如下所示:
22:12:03.055370 58:7f:57:0c:e4:80 > c0:56:27:72:a3:5b, ethertype IPv4 (0x0800), length 73: 192.168.1.20.49437 > 128.112.94.34.12341: Flags [P.], seq 105:112, ack 1, win 4117, options [nop,nop,TS val 581515569 ecr 1500229582], length 7
22:12:04.055378 58:7f:57:0c:e4:80 > c0:56:27:72:a3:5b, ethertype IPv4 (0x0800), length 73: 192.168.1.20.49437 > 128.112.94.34.12341: Flags [P.], seq 112:119, ack 1, win 4117, options [nop,nop,TS val 581516566 ecr 1500230581], length 7
22:12:05.042628 58:7f:57:0c:e4:80 > c0:56:27:72:a3:5b, ethertype IPv4 (0x0800), length 73: 192.168.1.20.49437 > 128.112.94.34.12341: Flags [P.], seq 119:126, ack 1, win 4117, options [nop,nop,TS val 581517541 ecr 1500231577], length 7
eth0
但是,当我在( )上运行命令时tcpdump -len -i eth0
,上面几行都没有出现。我检查了防火墙(已允许从 LAN 到 WAN 的所有连接)、路由表(192.168.1.x
到默认网关的路由),我发现没有任何明显的东西阻止了这种情况。
我的问题是:Linux 内核如何br-lan
在eth0
路由器上路由数据包?
路由器要经过哪些子系统或认证机制才能让数据包通过?
答案1
桥接和路由并不相同。桥接发生在比路由更低的层。本质上,桥接的行为类似于交换机。Linux 桥接代码实现的虚拟交换机将有一个连接到网络堆栈上层的接口以及多个物理接口。因此,如果您的桥接中有两个物理接口,则意味着您有一个虚拟的 3 端口交换机。
发送到已知 MAC 地址的数据包只会发送到已知 MAC 地址所连接的接口 - 出于性能原因,这一点至关重要。因此,当交换机收到带有wlan1
目标 MAC 的数据包时c0:56:27:72:a3:5b
,虚拟交换机知道该目标 MAC 连接到该br-lan
接口,它会将该数据包从 桥接到wlan1
。br-lan
这样它就永远不会接触eth0
接口。