问题
我在一台 linux 机器上有多个 Internet 连接,我希望每个 Internet 连接都使用特定的 DNS 名称服务器。 /etc/resolv.conf
是一个问题,因为它为所有打开的 Internet 连接使用全局名称服务器。
请注意,所有连接都处于打开状态并同时被使用。
我需要的?
一种对 linux 说的方式:
使用 DNS 名称服务器 A 进行 Internet 连接 1
使用 DNS 名称服务器 B 进行 Internet 连接 2
使用 DNS 名称服务器 C 进行 Internet 连接 3
问题是/etc/resolv.conf
所有连接都使用相同的名称服务器。
我必须坚持上面的确切要求。
由于我正在研究测量的 ISP 性能和 DNS 响应时间的应用程序。
使用 OpenDNS 对我没有任何好处。
至于 DHCP,我已经从 ISP 自动获取了 DNS,但是在 resolve.conf 中只使用了最后一个 DNS 服务器来覆盖以前的名称服务器。
需要帮忙。
本质上,您有两个问题:
如果您开发自己的测试代码,第一个相对容易解决。最终用户程序几乎总是最终使用
libresolv
,并且res_init()
其中的功能负责读取/etc/resolv.conf
和设置 DNS 服务器以供该程序进行后续查询。在您自己的代码中显式重置每个程序实例上的 DNS 服务器非常容易。第二个问题需要更改网络级别。您可能拥有三个默认路由,并且每个 ISP 都没有特定的路由表条目。您需要找出您的三个 ISP 的名称服务器在哪个子网中,然后添加一条到该子网的路由,强制流量通过正确的 ISP 退出。
例如,如果 ISP 使用 192.168.1.1 作为 DNS 服务器,那么您需要:
其中 wxyz 是面向特定 ISP 的下一跳的地址。
请注意,如果您不尝试在同一台机器上同时测试三个 ISP,所有这一切都会简单得多!
我已经对 DNS 服务器进行了批量测试,但拒绝尝试将它们全部连接在一起 - 一次做一个要容易得多。
为什么不使用dig进行测试?
这会更容易:
通常,“使用哪个路由/通过哪个 ISP 发送连接”的路由决策是基于目标 IP 地址完成的。在您发出 DNS 请求以将目标主机名映射到目标 IP 地址之前,您没有目标 IP 地址。
如果您的配置不是“典型”,则需要提供更多详细信息。
在那之前,你有一个鸡/蛋的情况。在您知道您将使用哪个 ISP 之前,您无法决定使用哪个 DNS 服务器,并且(除非您在此处尚未描述的特殊内容)您不知道您将使用哪个 ISP,直到您已经执行了 DNS 查找并获得了目标 IP 地址。
您提到您正在开发一个应用程序来测量 ISP 性能和 DNS 响应时间。您最简单的赌注可能是一次监控一个 ISP。
您提供的更多详细信息可能会提供更详细、相关的答案。
使用来自 ISP 的 DHCP 并以这种方式自动获取 DNS 服务器而不是硬编码它们不是更有意义吗?
作为替代方案,您甚至可以忽略 ISP 的 DNS 服务器并使用 OpenDNS(除非您的 ISP 愚蠢到可以阻止对外部 DNS 服务器的 DNS 请求)。
也许 resolvconf 或 openresolv 是您正在寻找的:
我认为 Benoit 给了你正确的答案。你不应该尝试在 CentOS 中解决这个问题。如果你编写一个应用程序来测量互联网连接的性能,那么这个应用程序应该选择 DNS 服务器(而不是 CentOS 本身)。
如果您使用 dig 进行性能测试或直接在您的应用程序中进行,这取决于您。但无论哪种方式,您都可以直接指定要使用的 DNS 服务器。
另一个悬而未决的问题是:您如何进行流量整形和路由?那些仅仅是静态的吗?
您可以尝试在 /etc/sysconfig/network-scripts/ifcfg-eth{0,1,2} 文件中添加如下 DNS 行。但是,我不确定这是否会真正实现您想要的。
这就是我要做的。
1) 在单独的 NIC 上设置每个 ISP。这允许更容易的路由。
2) 设置静态路由,强制查询到 isp A 的 dns 服务器以使用 isp A 的接口/网关。对其他 isp 重复此操作(B 的 dns 通过接口 b 等)。
3) 使用 dig 测试 dns 服务器。您添加的路由应确保查询从正确的接口发出到正确的 isp。