总结一下我的问题,我有一个具有 3 个网络接口的 Linux 路由器:
- 充当 DHCP 服务器的 wlan 接口,我通过它来管理设备,这不在本问题的范围内。
- 一个 LAN 接口,它链接到 eth0 设备(以太网端口),它是非托管的。
- 一个 wan 接口,链接到非托管的 eth1 设备(以太网端口)。
如果有任何变化,我的路由器正在 openwrt 上运行,所以 lan 实际上是 br-lan。
我的目标有两个:
- 我需要将我的设备插在站点(连接到 eth0)和交换机(连接到 eth1)之间的局域网和广域网上,并充当它们之间的透明桥梁。
- 我需要能够向欺骗站点的 Linux 路由器发送数据包以及从该路由器接收数据包。
透明桥接部分可以通过 net.ipv4.ip_forward 轻松完成,并将 eth1 添加到具有 eth0 的虚拟桥接设备中。但是,一旦我将站点的 IP/MAC 分配给 eth1,交换机发往站点的所有流量都会在 eth1 处停止(可以理解)。我可以 ping 交换机,但站点不能,因为 eth1 会保留自己的响应。
为了解决这个问题,我尝试了多种方法,主要是这个问题:iptables 与 tee(直接不起作用,即使我创建了一条通过 eth0 路由站点 IP 流量的路由),iptables 转发(参见此问题), tcpbridge 从 eth1 到 eth0, tc...
但在所有这些情况下,交换机发往站点的数据包都会按预期重定向到 eth0,但现在 Linux 设备没有收到答复,这意味着站点可以 ping 交换机,但当我这样做时,站点会得到响应。(即使 eth1 仍在欺骗站点的 IP/MAC)。
有人知道为什么镜像流量实际上对我而言不起作用吗?
是因为两个接口还是在同一个 vbridge 中?
是否有一个数据包实用程序允许我通过使用自定义 IP/MAC 包装数据包来路由数据包?这将允许我实现透明桥接而无需篡改 eth1 的 IP/MAC。
谢谢!
答案1
好的,我似乎找到了答案,我取消了 2 个接口的桥接,并在每个方向添加了镜像流量控制规则:
tc qdisc add dev eth0 ingress
tc qdisc add dev eth1 ingress
tc filter add dev eth0 parent ffff: protocol all u32 match u32 0 0 action mirred egress mirror dev eth1
tc filter add dev eth1 parent ffff: protocol all u32 match u32 0 0 action mirred egress mirror dev eth0
更多信息这里以及我链接的第一个问题)。
现在我可以 ping 服务器,站点和 Linux 设备都收到响应。可能有一种方法可以过滤哪些数据包真正用于哪些数据包,一些依赖于 tcp 标志或类似功能的实用程序,但我找不到任何方法。