我的设置包括一个客户端和一个服务器,客户端使用 OpenVPN 连接到服务器。它配置为通过隧道路由所有流量。这很有效,ip 是服务器 ip,traceroute 显示流量通过服务器网络路由。
但是有一个例外,当连接到指向同一台服务器的域时,流量会被路由到 VPN 隧道之外,即服务器显示客户端的真实 IP,而 traceroute 显示通过客户端 ISP 路由的流量。
我希望通过隧道路由所有流量,即使是最终到达服务器的流量,也需要使用域名而不是服务器本地 IP。有什么想法吗?
服务器运行的是 Windows 10,在 Windows 10、Linux 和 iOS 上使用 OpenVPN Connect 时,客户端上会出现此问题。问题是不是在 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
答案1
与您的 Web 服务器(与您的 OpenVPN 服务器托管在同一台机器上)的连接不通过您的 VPN 隧道路由的原因是正常行为。
如果您通过 OpenVPN 隧道路由所有发往 OpenVPN/Web 服务器的流量,则封装的流量将永远无法到达 VPN 服务器,因为您的系统将尝试通过已封装此流量的同一 VPN 隧道路由这些流量。因此,OpenVPN 服务器将无法访问并断开连接。
我无法说出 Android 究竟是如何做到这一点的。一种方法可以是基于策略的路由,可以使用 iptables/nftables 来标记 OpenVPN 特定的数据包。
据我所知,基于策略的路由在 Windows 操作系统上不可用!
替代解决方案
另一种解决方案是托管您自己的 DNS 服务器并将请求转发到 OpenDNS 服务器(您自己定义的某些区域除外)。
在您的 DNS 服务器中创建一个区域,并将您的域指向tun
设备的内部 IP 地址。从您的配置来看,它似乎是10.8.0.1
将您的 DNS 推送选项更改server.conf
为push "dhcp-option DNS 10.8.0.1
可能需要添加一些 iptable/nftable 规则来允许这些请求。