在iproute2中使用DNS

在我的设置中,我可以根据源地址redirect默认网关。 假设一个用户通过tun0(10.2.0.0/16)被连接到另一个vpn。 这工作正常!

ip rule add from 10.2.0.10 lookup vpn1 

在第二个规则中,如果用户访问某个IP地址,则将默认网关redirect到另一个网关:

 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上的所有请求都应该通过vpn2redirect?

A-Record很有可能parsing为多个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。

google.com和其他大型webfarms有一个循环DNS时尚,以及群集多个IP。

您将不得不为每个RRDNS IP为该特定站点创build一条规则。

或者您可以更新您的本地DNS / HOSTS文件,只有一个google.com地址,并在该IP上应用规则。

简单的答案是你不能在iproute2中使用DNS。 内核中没有设施可以在路由处理过程中进行任何types的名称查找。 他们真的没有办法做到这一点。 暂停一下,考虑一下,这个规则是针对系统转发或发起的每一个数据包进行评估的。 如果该规则导致DNS查找,则会生成数据包,直到DNS查找完成才能被路由。

您可能会使用iptables的MARK工具,因为它可以让您使用DNS创build规则,但即使这样做也行不通。 在添加规则时,Iptables将评估名称,并根据DNSparsing到的IP地址创build规则。 添加规则后,规则永远不会更新。

一个解决scheme不是很好,就是使用其他工具评估名称,这些工具将执行DNS查找并根据结果添加规则。 这个问题,特别是对于Google的规模来说,你在DNS中看到的结果有可能经常改变。

如果站点/networking足够大,实际上它们可以直接从RIR自己分配地址空间,而不仅仅是使用CDN / ISP提供的地址空间,那么您可以使用whois查找他们的networking,并创build规则基于他们的子网。 这个页面应该提供占Google大部分服务的地址。

你可能不得不认真考虑的是build立一个代理,在更高层次上做事。 也许你想要做的事情可以用Squid或其他Web代理来完成。