某些端口上的OpenVPN旁路

Modified on: Sun, 18 Aug 2019 09:00:02 +0800

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

我现在已经在互联网上搜索了一段时间,但似乎没有按预期工作。

我不是iptables /网络专家,所以也许我错过了什么......

以下是我的脚本:

在VPN脚本之前

这是在VPN之前启动的脚本,它用于阻止所有流出/流出而不通过VPN,除了一些端口(这里有SSH)。

如果我只启动这个脚本,那就完成了他的工作。我可以通过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脚本

这是通过“route-up”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

OpenVPN配置文件

这是OpenVPN客户端配置文件。

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上升时,我再也无法访问我的服务器了。

我做错了什么?

非常感谢你的帮助!

最佳答案

经过一番搜索后,我发现了这个帖子: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 x.x.x.x table 100
ip route add table 100 to y.y.y.y/y dev ethX
ip route add table 100 default via z.z.z.z

其中x.x.x.x是我服务器的公共IP,y.y.y.y / y是我服务器的公共IP地址的子网,ethX是我服务器的公共以太网接口,z.z.z.z是默认网关。

希望这可以帮助别人。


相关问答

添加新评论