在我的设置中,我可以根据源地址重定向默认网关。假设用户通过 tun0 (10.2.0.0/16) 连接,重定向到另一个 vpn。这样就很好了!
ip rule add from 10.2.0.10 lookup vpn1
在第二条规则中,如果用户访问某个 IP 地址,我将默认网关重定向到另一个网关:
ip rule add from 10.2.0.10 to 94.142.154.71 lookup vpn2
如果我访问 94.142.154.71 (myip.is) 上的页面,则用户路由正确,我可以看到第二个 vpn 的 ip。在任何其他页面上,都会显示 vpn1 的 ip 地址。
但是我如何告诉 iproute2 所有对 google.com 的请求都应该通过 vpn2 重定向?
答案1
A 记录很有可能解析为多个 IP 地址:
% dig +short google.com
209.85.148.101
209.85.148.102
209.85.148.113
209.85.148.138
209.85.148.139
209.85.148.100
因此,您必须循环遍历它们并为每条规则添加一条规则,如下所示
dig +short google.com | while read IP; do
ip rule add from 10.2.0.10 to "$IP" lookup vpn2
done
您还应该考虑刷新 cronjob。
答案2
简短的回答是,您不能在 iproute2 中使用 DNS。内核中没有在路由处理期间执行任何类型的名称查找的工具。这样做也确实没有意义。暂停一下并考虑一下,此规则针对系统转发或发起的每个数据包进行评估。如果该规则导致 DNS 查找,它会生成数据包,这些数据包在 DNS 查找完成之前无法路由。
您可能想使用MARK
iptables 的功能,因为它允许您使用 DNS 创建规则,但即使这样也行不通。添加规则时,iptables 会评估名称,并根据 DNS 解析到的 IP 地址创建规则。添加规则后,规则永远不会更新。
一个不太好的解决方案是使用其他工具来评估名称,这些工具将执行 DNS 查找并根据结果添加规则。这种方法的问题在于,您在 DNS 中看到的结果可能会经常发生变化,尤其是对于像 Google 这样规模的公司而言。
如果站点/网络足够大,以至于他们实际上直接从 RIR 获得自己的地址空间分配,而不仅仅是使用 CDN/ISP 提供的地址空间,那么您可以在 whois 中查找他们的网络,并根据他们的子网创建规则。 这一页应该提供占 Google 服务很大一部分的地址。
您可能需要认真考虑的是设置某种代理,以在更高级别执行操作。也许您尝试执行的操作可以通过 Squid 或其他 Web 代理完成。
答案3
google.com 和其他大型网络场采用循环 DNS 方式和集群方式拥有多个 IP。
您必须为他们为该特定站点使用的每个 RRDNS IP 创建一条规则。
或者您可以更新本地 DNS/HOSTS 文件以仅包含一个 google.com 地址并在该 IP 上应用规则。