OpenVPN在一些端口旁路

我有一台服务器运行Debian 7,我想连接到一个VPN,让所有的stream量通过除了一些端口(SSH,托pipe的网站等)的VPN传递。

我已经在互联网上search了一段时间,但似乎没有预期的那样工作。

我不是一个iptables /networking专家,所以也许我错过了一些东西…

这是我的脚本:

在VPN脚本之前

这是在VPN之前启动的脚本,除了一些端口(SSH在这里)外,它用于阻止所有通过VPN传输的stream量。

如果我只开始这个脚本,那么他的工作就完成了。 我可以通过SSH连接到我的服务器,但所有其他端口被阻止,并且服务器无法进入Internet(因为VPN未启动)。

#!/bin/bash # Flush iptables iptables -P INPUT ACCEPT iptables -P FORWARD ACCEPT iptables -P OUTPUT ACCEPT iptables -F iptables -X iptables -t nat -F iptables -t nat -X iptables -t mangle -F iptables -t mangle -X # Default policy iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # Accept packets through VPN iptables -A INPUT -i tun+ -j ACCEPT iptables -A OUTPUT -o tun+ -j ACCEPT # Accept local connections iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Accept connection to/from VPN servers iptables -A INPUT -s xxx.xxx.xxx.xxx -j ACCEPT iptables -A OUTPUT -d xxx.xxx.xxx.xxx -j ACCEPT # Disable Reverse Path Filtering on all network interfaces for i in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 0 > $i done # Open ports on iptable iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT 

路由OpenVPN脚本

这里是通过“路由”OpenVPN的选项调用的脚本。 这是应该使端口绕过VPN的脚本。

 #!/bin/bash WAN_GATEWAY="xxx.xxx.xxx.xxx" echo 1 > /proc/sys/net/ipv4/ip_forward # Delete table 100 and flush all existing rules ip route flush table 100 ip route flush cache iptables -t mangle -F PREROUTING # Table 100 will route all traffic with mark 1 to WAN (no VPN) ip route add default table 100 via $WAN_GATEWAY dev eth0 ip rule add fwmark 1 table 100 ip route flush cache # Mark packets on port 22 iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE 

OpenVPNconfiguration文件

这里是OpenVPN客户端configuration文件。

 client dev tun proto udp resolv-retry infinite nobind tun-mtu 1500 tun-mtu-extra 32 mssfix 1450 persist-key persist-tun comp-lzo verb 3 redirect-gateway def1 user nobody group nogroup script-security 2 auth-user-pass /path/to/config/login.conf route-up /path/to/scripts/vpn_up.sh remote xxx.xxx.xxx.xxx 443 ca /path/to/config/certs/ch.crt 

我的问题是,当VPN上升,我不能访问我的服务器了。

我究竟做错了什么?

非常感谢你的帮助 !

经过多一点search,我发现这个线程: https : //forum.linode.com/viewtopic.php?p=50114&sid=b440414422596bb7dbc96cf7c9ee511f#p50114

我现在修改了我的“路由”OpenVPN脚本如下,它终于工作! 我删除了所有其他杂乱的规则(iptable PREROUTING,MASQUERADE等)。

这是我最后的“路由”脚本:

 ip route flush table 100 ip route flush cache ip rule add from xxxx table 100 ip route add table 100 to yyyy/y dev ethX ip route add table 100 default via zzzz 

xxxx是我服务器的公网IP,yyyy / y是我服务器公网IP地址的子网,ethX是我服务器的公网以太网接口,zzzz是默认网关。

希望这可以帮助别人。

在经历了同样的考验之后,我发现至less有一个路由脚本的问题。

 iptables -t mangle -A PREROUTING ... 

应该:

 iptables -t mangle -A OUTPUT ... 

阅读为什么在这里: http : //www.iptables.info/en/structure-of-iptables.html

我不必打开IP转发。