无法将流量从 eth 转发到 TUN/TAP

无法将流量从 eth 转发到 TUN/TAP

我正在尝试将流量从物理接口转发enp5s0到虚拟接口tun0。目标是基本上接收tun0来自 的所有数据包enp5s0

首先,我使用命令启用转发

sudo sysctl -w net.ipv4.ip_forward=1

然后我tun0通过运行创建

sudo ip tuntap add dev tun0 mod tun

我为其分配 IP 地址并打开设备:

sudo ifconfig tun0 10.1.8.5 netmask 255.255.255.0 promisc up

我想让所有数据包从enp5s0tun0,所以我必须使用iptables。我需要制定一条允许从enp5s0to转发的规则tun0,因此命令是

sudo iptables -A FORWARD --in-interface tun0 --out-interface enp5s0 -j ACCEPT

然后我通过运行启用 NAT

sudo iptables -t nat -A POSTROUTING --out-interface enp5s0 -j MASQUERADE

tcp转储显示 上没有流量tun0

另外,我尝试了几乎相同的事情,但使用的是 TAP 设备。我用brctl、 添加tap0和创建了一个桥enp5s0,但没有收到任何数据包,tap0并且一切正常enp5s0default gw 10.1.8.5在 TUN 案例中没有任何效果。哪里有错误?

答案1

您的输入和输出接口在 iptables 命令中是相反的。

他们应该是:

sudo iptables -A FORWARD --in-interface enp5s0 --out-interface tun0 -j ACCEPT

和:

sudo iptables -t nat -A POSTROUTING --out-interface tun0 -j MASQUERADE

答案2

问题是让数据包想要进入该接口。这可以通过路由或 iptables 来完成。

第一个测试:从您自己的主机,ping 类似的内容10.1.8.57。它应该显示在您的 tcpdump 中。如果不这样做,其他任何方法都将不起作用。所以修复它。

从路由开始。在主机上声明 tun0 另一端的网络,我相信您已经创建了该网络10.1.8.0/24。在 enp5s0 链路另一端的主机上放置一个条目,路由到您的主机。从该主机,ping 类似的内容10.1.8.57。这应该显示在您的 tcpdump 中。

转到 iptables。在这种情况下,我认为您想要的是获取通常传输到您的主机的数据包,并将它们转发到 TUN 接口。实现这一点的技巧是 DNAT 规则。我想是这样的:

iptables -t nat -A PREROUTING --in-interface enp5s0 -j DNAT --to-destination 10.1.8.57
iptables -t nat -A OUTPUT --in-interface enp5s0 -j DNAT --to-destination 10.1.8.57

(实际上,这个目标在 PREROUTING 和 OUTPUT 上都有效,而且我在使用它时显然将其放在两者上。我不确定您是否需要两者,或只需要一个,或者它们是否执行不同的情况。)对于早期测试,我建议对重新路由的内容添加额外的限制,例如添加-p tcp -m tcp --dport 5000然后尝试连接到端口 5000。如果您不小心,您可能会将自己完全排除在计算机之外。

相关内容