openvpn:如何不对具有多个 IP 地址的域使用 VPN

openvpn:如何不对具有多个 IP 地址的域使用 VPN

我想针对特定域绕过 openvpn。我尝试过:

allow-pull-fqdn
route specificdomain.com 255.255.255.255 net_gateway

但这只是对域进行 DNS 查找,并将获取的任何 IP 添加到路由表以使用默认路由。

问题是,特定域有多个 IP 地址,而且它们似乎不在一个简单的网络上,我只能使用网络掩码。

我也尝试过:

push "route specificdomain.com 255.255.255.255 net_gateway"

尽管我承认通过阅读文档我仍然没有弄清楚它们之间有什么区别 - 虽然在这里它没有出现在我的路由表中并且它不起作用(即使我使用具有单个 IP 地址的域)

有没有办法让 openvpn 不像这样路由具有多个 IP 地址的域,或者 openvpn 在路由中是否太晚知道我们最初请求的域是什么,而我最好的选择是尝试拿出一个当前与该域匹配的 IP 地址集合?

答案1

遗憾的是,你想要的是不可能的。路由基于 IP 地址,而域名根本不存在于 IP 数据包中,因此无法用于制定路由决策。

添加路由时,您可以向特定域名添加路由,但该域名在添加到路由表之前会先由 DNS 解析为 IP 地址。另请注意,如果 DNS 条目中的 IP 地址发生变化,您的路由表将不会更新。

基本上你的选择是:

1:在 VPN 启动时,向所有您要在没有 VPN 的情况下访问的特定主机名添加路由。这些名称将立即得到解析,但这可能并不重要,除非 IP 地址变化非常快。

2:找出目标域使用的所有网络块,并为其设置不带 VPN 的路由。但在某些情况下,找出网络块是不可能的。

3:反转您的路由逻辑:删除“通过 vpn 路由所有内容”规则,仅通过 vpn 路由特定的网络块(您更有可能知道这些网络块,而不是您无法控制的特定域的网络块),并让默认路由将所有非 vpn 流量带到没有 vpn 的互联网。

答案2

正如其他人所解释的那样,理论上这是不可能的,因为路由不知道用于获取目标 IP 地址的目标 DNS 名称。但是,您可以执行 @Bass 所描述的“切碎”DNS。首先,设置您自己的 DNS(我使用 Raspberry Pi 作为 VPN 路由器,因此我拥有 Linux 的所有好处,我建议您不要在 Windows 工作站上这样做 :)。使用禁用 DHCP 的 dnsmasq,首先将其设置为纯缓存 DNS 服务器,dnsmasq.conf 如下:

log-queries          # Logging
log-async            # Async logging    
domain-needed        # Don't forward short names
bogus-priv           # Never forward addresses in the non-routed address spaces.
server=8.8.8.8       # Use Google DNS 1 upstream
server=8.8.4.4       # Use Google DNS 2 upstream

在您设法将自己的 DNS 强制应用于机器(台式机和其他设备,例如 chromecast、电视等)并确认其正常工作后,您就可以开始破解了。运行程序/应用程序或访问您要重定向的网站,然后在路由机器上执行以下操作:

sudo killall -SIGUSR1 dnsmasq
tail /var/log/syslog

现在,您已经获得了最近访问的 IP 地址及其名称的详细转储(任何像样的应用程序都会尝试访问 DNS,我相信没有人会再对 IP 进行硬编码)。

现在您重新启动 dnsmasq 或路由机器(只是为了确保清除缓存)并强制访问绕过 OpenVPN 的 google DNS,例如通过执行以下操作:

sudo route add -net 8.8.8.8 netmask 255.255.255.255 gw 192.168.1.1 dev eth0
sudo route add -net 8.8.4.4 netmask 255.255.255.255 gw 192.168.1.1 dev eth0

需要说明的是,eth0 是连接到我的互联网提供商的网络接口,而 192.168.1.1 是绕过 VPN 的网关地址。现在,您重复此练习,启动应用程序/网站/设备并转储名称和 IP 号码。它们现在应该不同了。

再次重启路由机(去掉上面的临时路由),对每个IP做以下两件事:

  1. 为每个地址在 dnsmasq.conf 中添加地址行,以强制解析为您在第二步中获得的 off-vpn-IP,如下所示:

    地址=/www.avoidvpn.com/off.vpn.ip.obtained

  2. 将特定地址的路由添加到您的路由配置中(每次重启后都需要执行或保存为永久路由)

    sudo route add -net off.vpn.ip.obtained 网络掩码 255.255.255.255 gw 1​​92.168.1.1 dev eth0

再次假设 192.168.1.1 是非 VPN 网关。

注意事项

  1. 这是一个糟糕的解决方案
  2. 这个对我有用
  3. IP 可能随时更改,设置将失效
  4. 幸运的是,如果使用不同的 IP 进行负载平衡或内容限制,则 3 中的情况并不常见(例如,您可以绕过这些机制,但 IP 仍然会起作用)
  5. 不知道维护服务器的人在获得来自不应该存在的 IP 的流量时会怎么想(例如,有人试图将负载转移到其他 IP,而你却愉快地继续访问理论上不应该负载的服务器)。

希望它能有所帮助,但确实,这是一个糟糕的解决方案。玩得开心,祝你好运!

答案3

  allow-pull-fqdn
  push "dhcp-option DNS 10.0.0.1"

  route thehost.com 255.255.255.255 vpn_gateway

答案4

我很高兴我偶然发现了这个帖子,因为我花了很长时间才弄清楚如何做到这一点,很高兴知道我可以放弃。

我的简单解决方案是:使用 Mullvad vpn,并使用两个独立的浏览器 - 一个用于我想要使用 vpn 访问的网站,另一个用于我想要不使用 vpn 访问的网站。

然后我将“非 VPN 站点浏览器”添加到拆分隧道中的排除应用程序(在设置、高级下)。这不是完美的解决方案,但却是我能想到的最好的解决方案。

相关内容