Linux

訪問伺服器 IP 時,OpenVPN 流量錯誤地路由到隧道外

  • September 19, 2019

我的設置包括一個客戶端和一個伺服器,其中客戶端使用 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.confpush "dhcp-option DNS 10.8.0.1

可能需要添加一些 iptable/nftable 規則來允許這些請求。

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