到 openvpn 伺服器的流量不使用隧道
我在 Debian 9 伺服器上設置了 OpenVPN 伺服器,一切似乎都執行良好:我可以通過該 VPN 訪問 Internet。但是,我發現任何以伺服器為目標的流量仍在使用
eth0
或wlan0
代替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 伺服器推送到客戶端來強制執行此行為。您需要手動將這些規則添加到您的客戶端。