问题现象:

在Linux机器上,用户自建了一台DNS服务器。然后改动/etc/resolv.conf将其服务器IP地址添加到第一项。将阿里云的内网DNS放到第二位,然而在测试过程中发现telnet,ping以及用户的应用都只会选用排在第二位的DNS服务器。在我们测试机上同样可以复现该问题,也就是配置完成后,无论是telnet还是ping都只会使用第二位的DNS服务器,而忽略了第一位的服务器。

问题初步排查:

  1. 尝试了dig和nslookup都没有问题,都会尝试第一位的DNS服务器。问题总是存在于telnet和ping,甚至客户的应用程序也有问题。
  2. 尝试安装和重启nscd也没有效果。
  3. 启用strace来跟踪telnet的行为,发现telnet的行为确实会打开resolv.conf,但是在进行socket操作的时候连接的是第二位DNS服务器:

重新排序后位置发生了变化,GLIBC库的函数将第二位的IP移动到了第一位

__libc_res_nsend:

if (__builtin_expect ((statp->options & RES_ROTATE) != 0, 0) &&
(statp->options & RES_BLAST) == 0) {
struct sockaddr_in6 *ina;
unsigned int map; n = 0;
while (n < MAXNS && EXT(statp).nsmap[n] == MAXNS)
n++;
if (n < MAXNS) {
ina = EXT(statp).nsaddrs[n];
map = EXT(statp).nsmap[n];
for (;;) {
ns = n + 1;
while (ns < MAXNS
&& EXT(statp).nsmap[ns] == MAXNS)
ns++;
if (ns == MAXNS)
break;
EXT(statp).nsaddrs[n] = EXT(statp).nsaddrs[ns]; -----------> 把第二个IP地址移动到第一个
EXT(statp).nsmap[n] = EXT(statp).nsmap[ns];
n = ns;
}
EXT(statp).nsaddrs[n] = ina;
EXT(statp).nsmap[n] = map;

从整个代码逻辑中可以发现,如果配置rotate轮询选项,__libc_res_nsend会首先使用第二位的IP地址。这一点似乎不和常理。

搜索之后,我们发现该问题已经在RedHat官网上有了说明,但是没有有效的解决方案:

Why option rotate in resolv.conf picks up second nameserver as first every time?
https://access.redhat.com/solutions/1426263

针对该问题我们认为能够规避的方法有两个:

  1. 在resolv.conf去除rotate选项,但是会影响DNS客户端的行为,无法轮询。
  2. 把自建的服务配置在第一位和第二位,把公共服务器配置在第三位。缺点是一旦自建服务器出现问题,DNS需要花更多的时间移动到第三位的公共服务器。

Linux上DNS解析总是选择resolv.conf中第二位的DNS服务器IP地址的更多相关文章

  1. 【转载】resolv.conf中search作用

    原文地址:http://www.oliver.ren/linux/387.html reslov.conf中的search主要是用来补全hostname的,有时候域名太长,可以做一个短域名做主机名字, ...

  2. 免费公共DNS服务器IP地址大全(2017年6月24日)

    收集全球各个常用公共DNS服务器 IP地址,欢迎各位朋友评论补充! 国内常用公共DNS 114 DNS: (114.114.114.114:    114.114.115.115) 114DNS安全版 ...

  3. Linux下扫描服务器IP地址是否冲突(arp-scan)

    部署服务突然发现,连接的服务器断开了,因为服务器用户名密码是一样的,所以重新连接后,发现文件变了,跟之前不一样. 猜想是不是ip地址冲突了,两次连接的服务器不同. 网上查找资料说可以用工具扫描.工具: ...

  4. 常用的公共 DNS 服务器 IP 地址

    转载自:小哈龙 2019-04-12 09:34:42 公共 DNS 服务器 IP 地址 名称 DNS 服务器 IP 地址 阿里 AliDNS 223.5.5.5 223.6.6.6 CNNIC SD ...

  5. 解决Ubuntu系统的每次开机重启后,resolv.conf清空的问题和DNS域名解析问题(图文详解)

    不多说,直接上干货! 问题情况描述如下: 普及知识:   /etc/resolv.conf ,其实是一个Link .它其实指向的是 /run/resolvconf/resolv.conf.  Ubun ...

  6. DNS客户端配置文件/etc/resolv.conf

    本来不应该把DNS客户端配置文件放在这里来说,但由于新手弟兄上网时,虽然能拔号,但不能以域名访问.究其原因是由于没有修改 /etc/resolv.conf 文件: /etc/resolv.conf 里 ...

  7. 全球免费公共 DNS 解析服务器 IP 地址列表推荐 (解决无法上网/加速/防劫持)

    除了宽带提供商的 DNS 以外,像阿里云.腾讯云.Google.百度.IBM.CNNIC 等一些有足够实力的大型互联网公司也非常慷慨地为公众提供了免费的 DNS 解析服务器.异次元这就搜集了全球范围内 ...

  8. 全国DNS服务器IP地址【电信、网通、铁通】

    免费DNS地址: 114DNS:114.114.114.114(推荐国内使用) Google DNS:8.8.8.8(国外) ************************************* ...

  9. 无法在web服务器上启动调试,此项目在使用一个被配置为使用特定IP地址的网站。请在项目URL中指定计算机名称。

    解决方案:IIS服务器管理-default web site 绑定-选择使用的IP-编辑-IP地址:全部未匹配

随机推荐

  1. .Net Core 遇到 “'windows-1252' is not a supported encoding name.”

    最近用 iTextSharp 拆分 Pdf 文档 加水印的时候遇到错误: 'windows-1252' is not a supported encoding name. For informatio ...

  2. C# 7可以在.NET Framework 4上运行吗?

    https://stackoverflow.com/questions/42482520/does-c-sharp-7-0-work-for-net-4-5 To sum up: All of C# ...

  3. Oracle ERP 库存管理(业务流程 核心流程)

    库存核心业务 库存管理的核心是对货物本身的管理,是对货物的数量与相关属性的管理,目的是为销售与采购服务,确保合理的库存保有量,处理库存分类帐目与进出流水帐,以单据的形式基本涵盖仓库的各种进出库业务. ...

  4. 第一册:lesson 135.

    原文:The latest report. question:Is Karen Marsh going to retire,do you think? Are you really going to ...

  5. IGV解读

    复制于:https://www.cnblogs.com/leezx/p/5603481.html 整合基因组浏览器(IGV)是一种高性能的可视化工具,用来交互式地探索大型综合基因组数据.它支持各种数据 ...

  6. flask项目

    虚拟环境需要 pipenv install flask pipenv install flask-sqlalchemy pipenv install python-dotenv pipenv inst ...

  7. 文件上传与下载,PDF与Excel的操作

    1.文件上传 前端代码 <el-upload class="upload-demo" ref="upload" :action="actionU ...

  8. Vue开发之基础路由

    1.router-link和router-view组件 src/App.vie文件内容: <template> <div id="app"> <div ...

  9. nameof 运算符

    0. 目录 C#6 新增特性目录 1. 老版本的代码 1 using System; 2 namespace csharp6 3 { 4 internal class Program 5 { 6 pr ...

  10. CentOS7.5搭建NFS(Network File System)

    NFS(Network File System)即网络文件系统,是由Sun公司开发的一种通过网络方式共享文件系统的通用共享解决方案.可以将远程Linux系统上的文件共享资源挂载到本地主机(Linux客 ...