将流量从TUN设备(C ++后端)转发到默认网关


10

以下问题只是我遇到的一个较大的解决方案中的一部分。到目前为止,所有其他元素似乎都起作用,因此,我将尝试描述我遇到问题的很小的部分。

我有一台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)
  • 还有很多其他...

预先感谢您的任何提示!


我知道这已经有一年多了,但是您能做到这一点吗?我有完全一样的问题。
hplbsh

Answers:


1

另一种解决方案是使用bridge.so,您可以将tun0与eth0桥接,而无需在tun0上设置nat或设置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


1

最近,我遇到了这个问题(在问题中提到了同一篇文章),经过一番摆弄之后,我发现以下命令为tun设备启用了数据包的本地转发。

echo 1 > /proc/sys/net/ipv4/conf/tun0/accept_local

我知道已经很晚了,我只是在这里发布,这样任何面临相同问题的人都可以得到某种帮助。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.