问题现象:

在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需要花更多的时间移动到第三位的公共服务器。

最新文章

  1. Workflow笔记1——工作流介绍
  2. Windows Server 2012重复数据删除技术体验
  3. 协作图 Collaboration diagram
  4. Effective C++ 学习笔记[2]
  5. jQuery中each的用法之退出循环和结束本次循环
  6. Java循环语句 while
  7. php中getimagesize函数的用法
  8. nodejs微信开发获取token,ticket-1
  9. MySQL技术内幕读书笔记(六)——索引与算法之全文索引
  10. idea创建maven项目速度慢?别急,这有三种方案
  11. Linux&#160;下Shell变量,环境变量的联系与区别
  12. 使用KeePass管理两步验证
  13. 如何让.NET Core支持GB2312和GBK
  14. SSIS 变量、参数和表达式
  15. day5模块学习 -- time、datetime时间模块
  16. Win10双网卡不双待攻略
  17. [bzoj 1594]猜数游戏
  18. Vivado设计二:zynq的PS访问PL中的自带IP核(基于zybo)
  19. TensorFlow实现CNN
  20. 【Leetcode】【Easy】Remove Duplicates from Sorted Array

热门文章

  1. Jackson动态JSON处理
  2. js事件【续】(事件类型)
  3. js如何保留两位小数,并进行四舍五入
  4. 原生aJax跨域
  5. 你可能还不知道的关于JavaScript类型的细节?
  6. 【GitHub】源代码管理工具初识
  7. 机器学习笔记4:SVM支持向量积的推导过程
  8. Linux运维技术之yum与rpm的基本使用要点
  9. Linux创建目录和文件的默认权限设置
  10. 如何显示隐藏的文件在win7系统中