我写
route-nopull
route myexternalip.com 255.255.255.255
在.ovpn
配置文件中,因为它在许多教程中显示。并且myexternalip.com
它运作良好,但对于其他一些网站 - 没有。例如analog.com
, digikey.com
, speedtest.net
,whatismyip.com
可以访问我的真实 IP 地址,但如果我为所有连接打开 VPN,它的性能很好。所以这是我尝试使用的完整路由表
route-nopull
route myexternalip.com 255.255.255.255
route analog.com 255.255.255.255
route speedtest.net 255.255.255.255
route whatismyip.com 255.255.255.255
我想,这是因为这些域有多个 IP 地址,我必须指定它们中的每一个以使其正常工作,或者可能是因为 IPv6 寻址,但我不知道如何解决这个问题。我做错了什么,但不知道到底是什么。
我在 Windows 10 21H1 上运行最新的 OpenVPN Community (2.5.6)
路由永远不会与实际域匹配,只会与 IP 地址匹配。在您的示例中,OpenVPN 必须查找指定域的地址并为这些地址添加路由。
多个地址没什么大不了的。如果主机“speedtest.net”有四个 IPv4 地址(和四个 IPv6),那么 OpenVPN 可以只添加四个 IPv4 路由。(但我不确定它是否确实如此。你应该检查它是否真的添加了这些路线!)
第一个问题是域可以有子域。现在 speedtest.com 指向一组 IP 地址,但如果您访问它,您将被重定向到
www.speedtest.com
,这是一组不同的 IP 地址,不再匹配生成的路由。(由于 Fastly CDN 的工作方式,IP 地址列表甚至会经常更改,因此这些路由可能很快就会过时。)whatismyip.com 也会发生同样的情况(它重定向到“www”子域,然后 ping 另一个子域以进行 IPv6 测试),analog.com 也会发生同样的情况。
因此,由于 OpenVPN 必须预先将域名扩展到地址,它不能只进行通配符匹配;为了使(假设)之类的东西
route *.speedtest.net
起作用,它需要获取所有单个子域的列表,查找每个子域的地址,为所有地址添加路由。但是因为它无法获得子域列表(几乎所有域运营商都阻止了该功能),所以这几乎是一个非首发。(当然,下一个问题是网站不仅限于访问其“主”域。一旦您在www.speedtest.com上开始测试,该网站将直接联系世界各地的各种测试服务器,并且正如浏览器的 DevTools 所显示的那样,这些根本不是的子域
.speedtest.com
——它们实际上是 的子域.prod.hosts.ooklaserver.net
。)仅使用 IP 路由无法使这项工作可靠地工作(除非您确切知道网站向哪些域发出请求);你需要一些在更高层工作的东西,例如在你的服务器上设置一个 HTTP 代理,并将它与一个“代理自动配置”脚本结合起来,告诉浏览器是否应该代理每个域。
(有时更好的选择可能是排除需要绕过 VPN 的站点。例如,如果您需要在 VPN 使用“默认路由”处于活动状态时直接访问特定 IP 范围,请添加“路由 192.0.2.0 255.255。 255.0 net_gateway" 将实现这一目标。)