总之,我希望通过另一个具有互联网连接的网络接口来回转发Tun设备流量。虽然我可以看到流量传输到互联网并返回,但它不会路由回我的Tun设备。
这是我的设置:
我有一个非常简单的设置,使用VirtualBox下的Mint Linux 15 VM,Win7作为主机。
在VM中,有两个网络接口 - eth0和tun0。
- eth0接口连接到Internet,分配为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
我的下一步是创建一个ICR请求数据包,其中src = 10.0.5.1,dst = 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请求发出,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请求数据包被设置为source = 10.0.5.1,我希望IPTable在它返回时取消ICMP Reply。这不会发生。
所以我的IPTables设置不正确,或者我只是误解了Tun设备的概念。任何指导将不胜感激。
如果我滥用任何术语,我会道歉。当它涉及网络时我是新手。