以下问题只是我遇到的一个较大的解决方案中的一部分。到目前为止,所有其他元素似乎都起作用,因此,我将尝试描述我遇到问题的很小的部分。
我有一台Linux计算机,带有tun0(隧道接口)和eth0(女巫是我连接互联网的默认网关)。
目标:我的目标是接收从tun0传入的数据包,并将其转发到默认网关。所以实际上是一个非常简单的NAT案例,我想与伪造物理接口的tun0“共享” Internet。
Tun已使用创建
sudo openvpn --mktun --dev tun0 --user USER
sudo ip addr add 10.2.0.1/24 dev tun0
sudo ip link set tun0 up
因此,我可以启动它并运行它,可以对其进行ping操作。此外,我还具有连接到此TUN设备的C ++应用程序,可以对其进行读写。(fti:这是我关注的教程:http : //backreference.org/2010/03/26/tuntap-interface-tutorial/)
我将对8.8.8.8提出的一些正确的ICMP(ping)请求转储到C ++中的字节数组中。现在,使用我的程序将其写入tun0设备。ICMP请求具有
- 源(10.2.0.10)-因此内核知道返回的路由(同一子网)
- 目的地(8.8.8.8)-Google的DNS
- 正确的校验和等。(在Wireshark / TShark中,它正确显示在tun0上)
然后,我有以下路线:
iptables -F # flush
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface tun0 -j ACCEPT
在这里我卡住了:(数据包没有转发到默认的gw(tshark仅在收到的tun0上看到它,我认为这是正确的)
少了什么东西?也许可以采用其他方法(但是必须使用tun设备完成,而且我必须能够读写它)。附加信息:
- 转发已启用(/ proc / sys / net / ipv4 / ip_forward)
- 可以通过eth0到达8.8.8.8(来自本地)
- 默认网关是正确的(通过eth0从ISP)
- 我试过关闭rp_tables(echo 0> / proc / sys / net / ipv4 / conf / eth5 / rp_filter)
- 还有很多其他...
预先感谢您的任何提示!