Linux
在某些埠上繞過 OpenVPN
我有一台執行 Debian 7 的伺服器,我想連接到 VPN 並讓所有流量通過 VPN,但某些埠(SSH、託管網站等)除外。
我現在在 Internet 上搜尋了一段時間,但似乎沒有任何效果。
我不是 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 腳本
這是通過“路由”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
其中xxxx是我伺服器的公網IP,yyyy/y是我伺服器公網IP地址的子網,ethX是我伺服器的公網乙太網介面,zzzz是預設網關。
希望這可以幫助別人。