将来自TUN设备(C ++后端)的stream量转发到默认网关

以下问题只是我遇到问题的一个更大的解决scheme。 所有其他元素似乎工作到目前为止,所以我会尝试描述我有问题的小片。

我有一台linux机器, tun0 (隧道接口)和eth0 (女巫是我的默认网关)。

目标:我的目标是接收来自tun0的数据包,并将它们转发到默认网关。 所以实际上非常简单的NAT情况下,我想与tun0共享互联网,它伪造了物理接口。

Tun已经创build使用

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)请求转到8.8.8.8到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收到,我想这是正确的)

less了什么东西? 也许一些替代方法(但它必须使用tun设备来完成,而且我必须能够使用它)。 附加信息:

  • 转发已启用(/ proc / sys / net / ipv4 / ip_forward)
  • 8.8.8.8可通过eth0(从本地)
  • 默认网关是正确的(从ISP通过eth0)
  • 我试过关掉rp_tables(echo 0> / proc / sys / net / ipv4 / conf / eth5 / rp_filter)
  • 和其他许多人

预先感谢任何提示!

另一种解决scheme是使用bridge 。因此,您可以将eth0连接到eth0,并且不需要在tun0上设置nat或ip,只需将eth0的相同子网中的IP与您现在在客户端的隧道接口上使用的网关。

设置桥梁的命令:

 # brctl addbr br0 # brctl addif br0 eth0 tun0 

http://www.tldp.org/HOWTO/BRIDGE-STP-HOWTO/set-up-the-bridge

要使用brctl,必须安装bridge-utils软件包。
如果你的发行版是Ubuntu: aptitude install bridge-utils