OpenVPN:仅通过 VPN 路由特定 IP 地址对某些网站不起作用

OpenVPN:仅通过 VPN 路由特定 IP 地址对某些网站不起作用

我写

route-nopull
route myexternalip.com 255.255.255.255

在配置文件中,.ovpn正如许多教程中显示的那样。对于myexternalip.com它运行良好,但对于其他一些网站则不行。例如,,,analog.com可以访问我的真实 IP 地址,但如果我为所有连接打开 VPN,它运行良好。所以这是我尝试使用的完整路由表digikey.comspeedtest.netwhatismyip.com

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 地址,我必须指定每个 IP 地址才能使其正常工作,或者可能是因为 IPv6 寻址,但我不知道如何解决这个问题。我做错了什么,但不知道具体是什么。

我在 Windows 10 21H1 上运行最新的 OpenVPN Community (2.5.6)

答案1

路由永远不会与实际域匹配,只会与 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 范围,则添加“route 192.0.2.0 255.255.255.0 net_gateway”即可实现此目的。)

相关内容