訪問伺服器 IP 時,OpenVPN 流量錯誤地路由到隧道外
我的設置包括一個客戶端和一個伺服器,其中客戶端使用 OpenVPN 連接到伺服器。它被配置為通過隧道路由所有流量。這很好用,ip 是伺服器 ip,traceroute 顯示流量是通過伺服器網路路由的。
但是有一個例外,當連接到指向同一伺服器的域時,流量會在 VPN 隧道之外路由,即伺服器顯示客戶端的真實 IP,而 traceroute 顯示通過客戶端 ISP 路由的流量。
我的願望是通過隧道路由所有流量,甚至是最終在伺服器上的流量,並且有必要使用域名而不是伺服器本地 ip。有任何想法嗎?
伺服器執行的是 Windows 10,當在 Windows 10、Linux 和 iOS 上的 OpenVPN Connect 上使用 OpenVPN 時,問題出現在客戶端上。在 Android 上使用 OpenVPN Connect 時不存在此問題。了解它為什麼也適用於 Android 會很有趣。
這是我的伺服器配置:
port 1194 proto udp4 dev tun ca "C:\\Program Files\\OpenVPN\\config\\ca.crt" cert "C:\\Program Files\\OpenVPN\\config\\server.crt" key "C:\\Program Files\\OpenVPN\\config\\server.key" dh "C:\\Program Files\\OpenVPN\\config\\dh2048.pem" server 10.8.0.0 255.255.255.0 ifconfig-pool-persist "C:\\Program Files\\OpenVPN\\log\\ipp.txt" 5 client-config-dir "C:\\Program Files\\OpenVPN\\config\\ccd" push "redirect-gateway def1 bypass-dhcp" push "dhcp-option DNS 208.67.222.222" push "route 255.255.255.0" duplicate-cn keepalive 10 120 cipher AES-256-CBC persist-key persist-tun explicit-exit-notify 1
和客戶端配置:
client dev tun_c_ovpn proto udp4 remote <address> 1194 resolv-retry infinite keepalive 5 10 nobind persist-key persist-tun cipher AES-256-CBC
與您的 Web 伺服器(與您的 OpenVPN 伺服器在同一台電腦上託管)的連接未通過您的 VPN 隧道路由的原因是正常行為。
如果您將通過 OpenVPN 隧道路由發往您的 OpenVPN/Web 伺服器的所有流量,您的封裝流量將永遠無法到達 VPN 伺服器,因為您的系統將嘗試通過已封裝此流量的同一 VPN 隧道路由這些流量。因此,OpenVPN 伺服器變得無法訪問並會斷開連接。
我不能說Android是如何做到這一點的。一種方法可以是基於策略的路由,並且可以使用 iptables/nftables 來標記 OpenVPN 特定的數據包。
基於策略的路由在 Windows 作業系統 (AFAIK) 上不可用!
替代解決方案
另一種解決方案是託管您自己的 DNS 伺服器並將請求轉發到 OpenDNS 伺服器,但您自己定義的某些區域除外。
在您的 DNS 伺服器中創建一個區域,並將您的域指向您
tun
設備的內部 IP 地址。從您的配置看來是10.8.0.1
將您的 DNS 推送選項更改
server.conf
為push "dhcp-option DNS 10.8.0.1
可能需要添加一些 iptable/nftable 規則來允許這些請求。