我正在尝试建立一个OpenVPN VPN,它将通过OpenVPN服务器从客户端传输一些(但不是全部)流量到互联网.
我的OpenVPN服务器在eth0上有一个公共IP,并使用tap0创建一个本地网络192.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,timestamp 559588 0,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 main和ip route show table 200的输出吗?我怀疑你错过了’200’表中的几条路线.您的’200’路由表应该与’main’表具有几乎相同的路由,唯一的区别是默认路由.
我看到你更新了,我相信我的原始建议是正确的.请注意您的主表如何为本地网络和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
如果要编写这些路由的创建脚本,可以使用它.它会将所有“范围链接”路由从主路由表复制到另一个表中.
#!/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