我有一台运行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是默认网关.
希望这可以帮助别人.