Linux

在某些埠上繞過 OpenVPN

  • April 24, 2016

我有一台執行 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是預設網關。

希望這可以幫助別人。

引用自:https://serverfault.com/questions/515272