如何在 Tun 设备和 eth0 之间转发流量?

如何在 Tun 设备和 eth0 之间转发流量?

总之,我希望 Tun 设备流量通过另一个具有互联网连接的网络接口来回转发。虽然我可以看到流量传出到互联网并返回,但它并没有路由回我的 Tun 设备。

这是我的设置:

我有一个非常简单的设置,使用 VirtualBox 下的 Mint Linux 15 VM,以 Win7 作为主机。

在虚拟机中,有两个网络接口 - eth0 和 tun0。

  • eth0 接口连接到互联网,并被指定为192.168.1.115/24
  • tun0 接口被指定为10.0.5.1/24

    ip tuntap add dev tun0 mode tun user askldjd
    ip link set tun0 up
    ip addr add 10.0.5.1/24 dev tun0
    

我设置了 iptables 规则来伪装通过 eth0 发出的所有流量。

    iptables -I FORWARD -i tun0 -o eth0 -s 10.0.5.0/24 -m conntrack --ctstate NEW -j ACCEPT
    iptables -I FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE

我使用一个简单的 测试了该规则ping -I。因此,在某种程度上,我的 iptable 规则正在发挥作用。

    ping -I 10.0.5.1 google.com
    PING google.com (74.125.228.65) from 10.0.5.1 : 56(84) bytes of data.
    64 bytes from iad23s07-in-f1.1e100.net (74.125.228.65): icmp_req=1 ttl=55 time=7.46 ms

我的下一步是创建一个 ICMP 请求数据包,其源地址为 10.0.5.1,目标地址为 74.125.228.6 (google.com)。这是通过 tcpdump 捕获完成的,因此我知道数据包字段/校验和都是有效的。我使用一个非常简单的 Python 脚本将此数据包发送到原始 IP 套接字。

在运行python脚本之前,我设置了tshark来监控eth0和tun0。

    tshark -i eth0
    tshark -i tun0

然后我运行脚本。从 tshark 控制台,我可以看到发出的 ICMP 请求和来自 Google 的 ICMP 回复。

    1811.947250 192.168.1.115 -> 74.125.228.6 ICMP 98 Echo (ping) request  id=0x0990, seq=1/256, ttl=64
    1811.955146 74.125.228.6 -> 192.168.1.115 ICMP 98 Echo (ping) reply    id=0x0990, seq=1/256, ttl=55

从 tun0 tshark 窗口我什么也看不到。

在我看来,由于 ICMP 请求数据包设置为源 = 10.0.5.1,我预计 IPTable 在 ICMP 回复返回时会取消 NAT。但这并没有发生。

因此,要么是我的 IPTables 设置不正确,要么是我误解了 Tun 设备的概念。如能得到任何指导,我将不胜感激。

如果我误用了任何术语,我深表歉意。在网络方面,我是个新手。

答案1

您的主要错误是:假设此类流量将被转发。但事实并非如此。从 VM 的角度来看,这是传出的流量,而不是转发的流量。ICMP 回复到达 eth0 并上升到协议堆栈,因此,您无法在 tun0 设备上看到它们。有关更多详细信息,您可以在此处查看:https://serverfault.com/questions/554477/tap0-not-receiving-traffic/554698

相关内容