问题
我在一台 Linux 机器上有多个互联网连接,我希望每个互联网连接都使用一个特定的 DNS 名称服务器。 /etc/resolv.conf
这是一个难题,因为它对所有开放的互联网连接使用一个全局名称服务器。
请注意,所有连接均处于打开状态并被同时使用。
我需要的?
对 Linux 说出以下内容的一种方式:
使用 DNS 名称服务器 A 进行互联网连接 1
使用 DNS 名称服务器 B 进行互联网连接 2
使用 DNS 名称服务器 C 进行互联网连接 3
问题是/etc/resolv.conf
所有连接都使用相同的名称服务器。
我必须坚持上述确切要求。
自该应用程序以来,我一直在努力测量 ISP 性能和 DNS 响应时间。
使用 OpenDNS 对我没有任何好处。
至于 DHCP,我已经从 ISP 自动获取 DNS,但在 resolve.conf 中仅使用最后的 DNS 服务器覆盖先前的名称服务器。
需要帮忙。
答案1
本质上你有两个问题:
- 默认解析器行为
- 数据包路由
如果您开发自己的测试代码,第一个问题相对容易解决。最终用户程序几乎总是会使用,libresolv
并且其中的res_init()
函数负责读取/etc/resolv.conf
和设置 DNS 服务器以供该程序进行后续查询。在您自己的代码中,可以非常轻松地在每个程序实例上明确重置 DNS 服务器。
第二个问题需要进行网络级别的更改。您可能有三个默认路由,并且没有针对每个 ISP 的特定路由表条目。您需要找出三个 ISP 的名称服务器位于哪个子网,然后向该子网添加一条路由,以强制流量通过正确的 ISP 退出。
例如,如果 ISP 使用 192.168.1.1 作为 DNS 服务器,则您需要:
# route add -net 192.168.1.0/24 gw w.x.y.z
其中 wxyz 是面向该特定 ISP 的下一跳地址。
请注意,所有这些都将是很多如果您没有尝试从同一台机器同时测试三个 ISP,那么会更简单!
我已经搞定了DNS 服务器的批量测试并拒绝尝试一次性将它们全部连接起来 - 一次完成一个要容易得多。
答案2
为什么不使用挖进行测试吗?
这样就简单多了:
#using local resolver (with cache)
dig +noall +stats www.google.com | grep ";; Query time"
;; Query time: 3 msec
#using opendns
dig +noall +stats google.com @208.67.222.222 | grep ";; Query time"
;; Query time: 28 msec
#using my isp dns
dig +noall +stats google.com @212.27.40.240 | grep ";; Query time"
;; Query time: 20 msec
答案3
通常,路由决策“使用哪条路由/通过哪个 ISP 发送连接”是基于目标 IP 地址做出的。除非您发出 DNS 请求将目标主机名映射到目标 IP 地址,否则您不会获得目标 IP 地址。
如果您的配置不是“典型”,则需要提供更多详细信息。
在此之前,您面临的是先有鸡还是先有蛋的问题。在知道要使用哪个 ISP 之前,您无法决定使用哪个 DNS 服务器,并且(除非您在此处尚未描述某些特殊情况)在执行 DNS 查找并获取目标 IP 地址之前,您不知道要使用哪个 ISP。
您提到您正在开发一款应用程序来测量 ISP 性能和 DNS 响应时间。最简单的方法可能是一次监控一个 ISP。
您提供的详细信息可能会带来更详细、更相关的答案。
答案4
另外,您甚至可以忽略您的 ISP 的 DNS 服务器并使用 OpenDNS(除非您的 ISP 愚蠢到阻止对外部 DNS 服务器的 DNS 请求)。