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

ask*_*djd 7 networking iptables icmp

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

这是我的设置:

我在 VirtualBox 下使用 Mint Linux 15 VM 进行了非常简单的设置,Win7 作为主机。

在 VM 中,有两个网络接口 - 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
    
    Run Code Online (Sandbox Code Playgroud)

我设置了我的 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
Run Code Online (Sandbox Code Playgroud)

我使用一个简单的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
Run Code Online (Sandbox Code Playgroud)

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

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

    tshark -i eth0
    tshark -i tun0
Run Code Online (Sandbox Code Playgroud)

然后我运行脚本。从 tshark 控制台,我可以看到 ICMP 请求发出,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
Run Code Online (Sandbox Code Playgroud)

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

在我看来,由于 ICMP 请求数据包设置为 source = 10.0.5.1,我希望 IPTable 在返回时取消对 ICMP 回复的处理。这不会发生。

所以要么我的 IPTables 设置不正确,要么我只是误解了 Tun 设备的概念。任何指导将不胜感激。

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

小智 2

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