linux – OpenVPN iptables / NAT路由

前端之家收集整理的这篇文章主要介绍了linux – OpenVPN iptables / NAT路由前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试建立一个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

猜你在找的Linux相关文章