我有一台带有两个网卡的 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,它就可以工作了。