Linux

到 openvpn 伺服器的流量不使用隧道

  • March 28, 2018

我在 Debian 9 伺服器上設置了 OpenVPN 伺服器,一切似乎都執行良好:我可以通過該 VPN 訪問 Internet。但是,我發現任何以伺服器為目標的流量仍在使用eth0wlan0代替tun0. 例如,如果我在不允許 ICMP 的本地網路上:

ping google.com將按預期工作(tun0用作輸出介面)

ping myvpn.com(如果 myvpn.com 是我的 vpn 伺服器)將不起作用,因為它使用 eth0 或 wlan0 作為輸出介面,因此被網路防火牆阻止。

我查看了路由,發現連接時,OpenVPN客戶端正在路由表中添加一個條目:( 1.2.3.4 via 10.0.0.1 dev wlp7s0 proto static metric 600其中1.2.3.4是我的vpn公共IP)

我了解這條路由的用途:當 OpenVPN 客戶端將數據包發送到 OpenVPN 伺服器然後重新路由到 Internet 時,它必須通過物理介面發送它們。但是,我希望當我 ping 或 SSH 到伺服器時,數據包通過 tun0 介面發送。

是否有提供給 OpenVPN 客戶端的選項或iptables規則,以便只有 OpenVPN 生成的數據包通過物理介面發送?

編輯:傳出流量一切正常:它全部通過 VPN,除了目標伺服器本身的流量。我認為問題可能出在客戶端,正在添加到伺服器的路由這裡是伺服器配置文件:

port 443
proto tcp
dev tun

ca /path/to/ca.crt
cert /path/to/server.crt
key /path/to/server.key
dh /path/to/dh.pem

server 10.8.0.0 255.255.255.0
keepalive 10 120
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3

push "redirect-gateway def1 bypass-dhcp"
push "route 10.8.8.0 255.255.255.0"

我試圖修改這一行:

push "redirect-gateway def1 bypass-dhcp"

對此:

push "redirect-gateway autolocal def1 bypass-dhcp"

正如答案中所建議的那樣,但結果仍然相同:我可以 ping google.com 但不能 ping 我的 VPN 公共 IP

最簡單的方法是在客戶端添加一個 iptables 規則,以將目標 myvpn.com:22 的傳出流量重定向到 10.8.0.1 的 vpn 端點

sysctl net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp -d myvpn.com --dport 22 -j DNAT --to-destination 10.8.0.1:22
iptables -t nat -A POSTROUTING -d 10.8.0.1 -p tcp --dport 22 -j SNAT --to myvpn.com:22
iptables -A FORWARD -d 10.8.0.1 -p tcp --dport 22 -j ACCEPT 

接收回复需要 SNAT 規則:沒有它,數據包將被丟棄,因為源 IP 不是我們所期望的(10.8.0.1 而不是 myvpn.com)。

我認為沒有辦法通過將一些選項從 openvpn 伺服器推送到客戶端來強制執行此行為。您需要手動將這些規則添加到您的客戶端。

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