以下问题只是我遇到的更大解决方案的一部分。到目前为止,所有其他元素似乎都有效,因此我将尝试描述我遇到问题的非常小的部分。
我有一台 Linux 机器,tun0(隧道接口)和eth0(这是我的互联网默认网关)。
目标:我的目标是接收来自 tun0 的数据包,并将它们转发到默认网关。因此,这实际上是一个相当简单的 NAT 案例,我想与伪造物理接口的 tun0“共享”互联网。
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 它等等。此外,我有一个 C++ 应用程序,它连接到这个 TUN 设备,可以读取和写入它。(fti:这是我遵循的一个教程:http://backreference.org/2010/03/26/tuntap-interface-tutorial/)
我将一些正确的 ICMP(ping)请求转储到 C++ 中的字节数组中,这些请求发往 8.8.8.8。现在,我使用我的程序将其写入 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
我在这里被困住了 :( 数据包没有转发到默认网关(tshark 仅在 tun0 上看到它,我猜这是正确的)
缺少什么?也许有一些替代方法(但必须使用 tun 设备来完成,并且我必须能够对其进行读写)。附加信息:
- 转发已启用(/proc/sys/net/ipv4/ip_forward)
- 可以通过 eth0 访问 8.8.8.8(从本地)
- 默认网关正确(来自 ISP 通过 eth0)
- 我尝试关闭 rp_tables(echo 0 > /proc/sys/net/ipv4/conf/eth5/rp_filter)
- 以及其他许多人...
提前感谢任何提示!
答案1
替代解决方案是使用bridge
。因此,您可以将 tun0 与 eth0 桥接,并且不需要 nat 或在 tun0 上设置 ip,您只需将来自 eth0 的同一子网和您现在正在使用的同一网关的 IP 放在客户端的隧道接口上。
建立桥接的命令:
# brctl addbr br0
# brctl addif br0 eth0 tun0
www.tldp.org/HOWTO/BRIDGE-STP-HOWTO/set-up-the-bridge
要使用 brctl,您必须安装
bridge-utils
包。
如果您的发行版是 Ubuntu:aptitude install bridge-utils
答案2
我最近遇到了这个问题(按照问题中提到的同一篇文章),经过一番摆弄之后,我发现以下命令可以为 tun 设备启用数据包的本地转发。
echo 1 > /proc/sys/net/ipv4/conf/tun0/accept_local
我知道已经很晚了,我只是在这里发帖,以便任何遇到同样问题的人都可以得到某种帮助。