OpenVPN + iptables / NAT路由

我试图build立一个OpenVPN VPN,它将通过OpenVPN服务器将一些(但不是全部)来自客户端的stream量传送到互联网。

我的OpenVPN服务器在eth0上有一个公共IP,并使用tap0创build一个本地networking192.168.2.x. 我有一个客户端,从本地IP 192.168.1.101连接,并获得VPN IP 192.168.2.3。

在服务器上,我跑了:

iptables -A INPUT -i tap+ -j ACCEPT iptables -A FORWARD -i tap+ -j ACCEPT iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE 

在客户端上,默认值仍然是通过192.168.1.1路由。 为了把它指向HTTP的192.168.2.1,我跑了

 ip rule add fwmark 0x50 table 200 ip route add table 200 default via 192.168.2.1 iptables -t mangle -A OUTPUT -j MARK -p tcp --dport 80 --set-mark 80 

现在,如果我尝试访问客户端上的网站(例如,wget google.com),它就会挂在那里。 在服务器上,我可以看到

 $ sudo tcpdump -n -i tap0 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on tap0, link-type EN10MB (Ethernet), capture size 96 bytes 05:39:07.928358 IP 192.168.1.101.34941 > 74.125.67.100.80: S 4254520618:4254520618(0) win 5840 <mss 1334,sackOK,timestamp 558838 0,nop,wscale 5> 05:39:10.751921 IP 192.168.1.101.34941 > 74.125.67.100.80: S 4254520618:4254520618(0) win 5840 <mss 1334,sackOK,timestamp 559588 0,nop,wscale 5> 

其中74.125.67.100是google.com获得的IP。

为什么不是MASQUERADE的工作? 更准确地说,我看到源显示为192.168.1.101 – 不应该有任何东西来表明它来自VPN?

编辑:一些路由[从客户端]

 $ ip route show table main 192.168.2.0/24 dev tap0 proto kernel scope link src 192.168.2.4 192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.101 metric 2 169.254.0.0/16 dev wlan0 scope link metric 1000 default via 192.168.1.1 dev wlan0 proto static $ ip route show table 200 default via 192.168.2.1 dev tap0 

你可以发布ip route show table mainip route show table 200的输出吗? 我怀疑你在“200”表中错过了一对夫妇的路线。 你的'200'路由表应该和'main'表具有几乎相同的路由,唯一的区别就是默认路由。


我看到你更新了,我相信我原来的build议是正确的。 请注意您的主表是如何为您的本地networking和VPN链接的“范围链接”路线? 这些路线也必须添加到“200”表中。

除了您使用的其他命令之外,请尝试运行这些命令。

 ip route add 192.168.2.0/24 dev tap0 proto kernel scope link src 192.168.2.4 table 200 ip route add 192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.101 metric 2 table 200 ip route flush cache 

如果你想脚本创build这些路线,你可以使用这个。 它会将主路由表中的所有“范围链接”路由复制到另一个表中。

 #!/bin/bash IFACE=wlan0 RT=200 /sbin/ip route list scope link table main proto kernel dev ${IFACE} \ | while read ROUTE ; do # and add that route to all the tables mentioned in the rrtables option # in the interfaces file /sbin/ip route add table ${RT} scope link proto kernel dev ${IFACE} ${ROUTE} done 

另一个更新。 我刚刚注意到我错过了一些相当明显的事情。

你的MASQ语句似乎在eth0上工作。 从发布的路由表中,您的输出设备不是eth0。 而不是这个。

 iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE 

你可能应该只使用这样的陈述。

 iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE 

有两件事是错误的:

首先,在客户端,我需要SNAT来源到实际的IP。

其次,反向pathfilter阻止返回数据包,因为它认为它们被欺骗了。 echo 0 > /proc/sys/net/ipv4/conf/tun0/rp_filter固定的

尝试在服务器上:

 echo 1 > /proc/sys/net/ipv4/ip_forward 

我认为,这将暂时启用。 如果有效,请添加:

 net.ipv4.conf.default.forwarding=1 

到你的/etc/sysctl.conf使其永久。