总之,我希望 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 send_packet.py:http://pastebin.com/Xh5YgsAx
在运行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