背景:
我有一台 Linux 桥(Ubuntu 15.10,64 位,名称桥 B) 有两个物理接口,分别为 eth0 和 eth1,桥接接口的名称为 br0。寄一个(Win 10)连接到 eth0,并且接收器C(Win 10)连接到eth1。如下图所示。
发件人A<------> (eth0)桥 B(eth1)<------->接收器C
发件人A的 MAC 地址:D4:EE:07:3F:F9:0D,IP 地址:192.168.1.2
桥 B的 eth0 MAC 地址:B0:51:8E:FF:2F:C8,无 IP 地址
桥 Beth1 的 MAC 地址:B0:51:8E:FF:2F:C9,无 IP 地址
桥 B的br0 MAC地址与eth0相同(自动),IP地址:192.168.1.1
接收器C的 MAC 地址:4C:CC:6A:DC:91:60,IP 地址:192.168.1.3
寄一个发送数据包至接收器C,例如icmp ping。
问题:
在配置 ebtable 规则之前桥 B将数据包重定向到第 3 层,一切正常,接收器C收到寄一个的 ping 数据包的源 MAC 地址为 D4:EE:07:3F:F9:0D,目标 MAC 地址为 4C:CC:6A:DC:91:60,数据包从寄一个。
当我在中设置 ebtable 规则时桥 B将转发的数据包重定向到第 3 层,然后我可以使用 iptables 进行数据包过滤桥 B. 代碼為:
ebtables -t broute -A BROUTING -p IPv4 --logical-in br0 -j redirect
然后问题就发生了。数据包来自寄一个到接收器C通过桥 B在第 3 层,我可以看到接收器C数据包的源 MAC 地址为 B0:51:8E:FF:2F:C8。显然,源 MAC 地址被更改为桥 B的 br0 MAC 地址。
我想知道问题是当数据包从第 2 层重定向到第 3 层,然后通过桥 B在第 3 层,源 MAC 地址将被更改为桥 B的内核。
探索:
我可以做什么或配置什么来保持源 MAC 地址在经过第 3 层过滤后保持不变桥 B?
/etc/网络/接口配置桥 B
auto eth0
iface eth0 inet manual
up ifconfig eth0 up
auto eth1
iface eth1 inet manual
up ifconfig eth1 up
auto br0
iface br0 inet static
address 192.168.1.1
netmask 255.255.255.0
pre-up ip link set eth0 promisc on
pre-up ip link set eth1 promisc on
pre-up echo "1">/proc/sys/net/ipv4/ip_forward
bridge_ports eth0 eth1
CGretski,我阅读了 ebtables 的手册页http://ebtables.netfilter.org/misc/ebtables-man.html我个人的理解是,当使用ebtables“-j重定向”时,重定向目标将改变MAC目标地址到桥接设备,那么数据包就可以发送到桥接接口 br0,如上例所示。因此,来自发件人A到接收器C,目标 mac 地址将被更改为网桥的 mac 地址,没有提到源 mac 地址是否会改变。
经过筛选后桥 B的第 3 层(或者第 3 层没有做任何事情),数据包现在应该被重新路由到接收器C. 那么数据包的目标 mac 地址将被更改为接收器C但同时数据包的源mac地址被改为桥 B的 MAC 地址。
如果我在 ebtables 目标中使用“-j accept”,按照您的建议,数据包将不会被发送到第 3 层,而是透明地通过桥 B,什么都不能改变,包括源和目标 mac 地址。但我无法进行任何第 3 层过滤。
我想保留数据包的第 2 层信息的原因是我不想接收器C感知任何设备的存在发件人A和它本身。另一个重要的原因是,在某些情况下,接收器C(特别是当它是网关时)将在源 mac 和 ip 验证后丢弃数据包。
答案1
丢失第 2 层信息是引入第 3 层路由的预期副作用,也是“-j 重定向”目标的定义。
来自 ebtables 手册页:
重定向目标会将 MAC 目标地址更改为帧到达的桥接设备的 MAC 地址。
您可以尝试“-j accept”,尽管这可能无法将其传递到第 3 层过滤。
维护第 2 层信息您想要实现什么目的?