连接到集线器时转发所有流量

连接到集线器时转发所有流量

我有一台带有两个网卡的 Ubuntu。eth0 连接到集线器,eth1 连接到互联网。eth1 用于使用 openVPN 进行点对点 VPN。所以我有一个 tun0 接口。VPN 隧道端点是 10.9.0.1(绑定在 eth1 上)和 10.9.0.2(远程对等体)。我想将 eth0(集线器端)上收到的所有流量转发/镜像到 VPN 对等体 10.9.0.2。为此,我创建了以下 iptables 规则。

sudo iptables -t mangle -A PREROUTING -i eth0 -j TEE --gateway 10.9.0.2

当然,我将 eth0 设置为混杂模式。

sudo ifconfig eth0 promisc

我甚至激活了 IP 转发

sudo sh -c 'echo 1 > /proc/sys/net/ipv4/ip_forward'

当我嗅探 eth0(集线器端)时,我可以看到所有流量,但当我嗅探 10.9.0.2(远程 VPN 对等端)时,我只看到在 eth0 上接收到的多播流量。我的问题是:为什么非多播或专用单播流量没有镜像/转发?

注意:如果我在 Ubuntu 服务器上嗅探 tun0,我只会看到多播流量和专用单播流量。所以我得出结论,问题不在于 iptables 规则,而在于之前...

感谢你并致以真诚的问候。

答案1

我认为您的问题是,如果目标 MAC 实际上不在您用作路由器的机器上,则您正在执行的转发将不起作用。广播按设计工作。您正在寻找的可能更像是镜像交换机端口。有一个关于如何做到这一点的帖子这里。为了方便后人,我将在此重新发布其要点:

                           SWITCH
                     +---------------+
                     |               |
SOURCE <------------>|<-----+------->|<------------> RCV
                     |      |        |
                     +---------------+
                            | Mirrored port ("tap")
                            | (output only)
                            |
                            |      +------------+
                            +<---->|   ROUTER   |<-------------> MONITOR
                             eth0  +------------+

以下是如何重写传入的 MAC 地址以匹配 eth0。即使桥接器没有其他设备,eth0 也必须绑定到桥接设备。这允许 ebtables 挂接到它。

ifconfig eth0 X.X.X.X
brctl addbr br0
brctl addif br0 eth0
ip link set br0 up (or ifconfig br0 up)
ebtables -t broute -A BROUTING -i eth0 -j redirect --redirect-target DROP
ip route add y.y.y.y dev eth0 (have to do for all expected incoming addresses/subnets)

再说一遍——以上只是引用原始帖子,以确保以后也能消除这个问题。

答案2

我终于找到了解决方案。@MrMajestyk 给出的想法对我有帮助。这是我的解决方案。

首先,需要使用ebtables修改接收数据包的目标 MAC 地址,以便 IP 堆栈的代码接收数据包。如果我不在以太网层执行此操作,则网络层永远不会接收除多播、广播和专用单播之外的帧。如果网络层从未收到所有数据包,则无法使用iptables。但是要使此 ebtables 规则起作用,必须创建一个带有传入(集线器端)接口的桥接接口。

sudo ifconfig eth0 10.9.0.5
sudo brctl addbr br0 
sudo brctl addif br0 eth0 
sudo ifconfig br0 up

然后我们可以创建ebtables規則。

sudo ebtables -t broute -A BROUTING -i eth0 -j redirect --redirect-target DROP

然后,我可以使用 iptables 将我收到的流量镜像到我的 VPN 远程对等点(10.9.0.2)。

sudo iptables -t raw -A PREROUTING -i eth0 -j TEE --gateway 10.9.0.2

请注意,我使用的是隧道接口 (tun),而不是以太网桥 (tap)。之后,我能够在远程对等体 10.9.0.2 上嗅探,并且可以看到所有流量(例如 ARP 除外)。

我甚至可以过滤我的流量,但必须在原始表,预路由链 -j TEE --gateway 规则。例如,查看我的 iptables raw、预路由条目。

-A PREROUTING -p vrrp -j DROP
-A PREROUTING -p ospf -j DROP
-A PREROUTING -d 255.255.255.255/32 -j DROP
-A PREROUTING -p udp --sport 53 -j DROP
-A PREROUTING -p tcp --sport 53 -j DROP
-A PREROUTING -i eth0 -j TEE --gateway 10.9.0.2

感谢您的帮助

答案3

我认为您不需要设置 iptables,只需将 eth1 的 ip 地址设置为 eth0 的网关并在“base”文件中设置 DNS,它就可以工作了。

相关内容