我有一台运行 Debian 7 的服务器,我想连接到 VPN 并让除某些端口(SSH、托管网站等)之外的所有流量都通过 VPN。
我已经在互联网上搜索了一段时间,但似乎没有任何结果能如预期的那样。
我不是 iptables/网络专家,所以也许我遗漏了一些东西......
这是我的脚本:
VPN脚本之前
这是在 VPN 之前启动的脚本,用于阻止所有不经过 VPN 的出站/入站流量,除了某些端口(此处为 SSH)。
如果我只启动这个脚本,它就会完成它的工作。我可以通过 SSH 连接到我的服务器,但所有其他端口都被阻止,服务器无法接入互联网(因为没有启动 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 启动时,我无法再访问我的服务器。
我究竟做错了什么?
非常感谢你的帮助 !
答案1
经过进一步搜索后,我找到了这个帖子:https://web.archive.org/web/20170315080843/https://forum.linode.com/viewtopic.php?p=50114&sid=b440414422596bb7dbc96cf7c9ee511f
我现在已经按如下方式修改了我的“路由”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
其中 xxxx 是我的服务器的公共 IP,yyyy/y 是我的服务器的公共 IP 地址的子网,ethX 是我的服务器的公共以太网接口,zzzz 是默认网关。
希望这可以帮助别人。
答案2
在经历了同样的磨难之后,我发现路由脚本至少存在一个问题。
iptables -t mangle -A PREROUTING ...
应该:
iptables -t mangle -A OUTPUT ...
了解原因请阅读这里:http://www.iptables.info/en/structure-of-iptables.html
我不需要打开 IP 转发。