Linux上DNS解析总是选择resolv.conf中第二位的DNS服务器IP地址
问题现象:
在Linux机器上,用户自建了一台DNS服务器。然后改动/etc/resolv.conf将其服务器IP地址添加到第一项。将阿里云的内网DNS放到第二位,然而在测试过程中发现telnet,ping以及用户的应用都只会选用排在第二位的DNS服务器。在我们测试机上同样可以复现该问题,也就是配置完成后,无论是telnet还是ping都只会使用第二位的DNS服务器,而忽略了第一位的服务器。
问题初步排查:
- 尝试了dig和nslookup都没有问题,都会尝试第一位的DNS服务器。问题总是存在于telnet和ping,甚至客户的应用程序也有问题。
- 尝试安装和重启nscd也没有效果。
- 启用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
针对该问题我们认为能够规避的方法有两个:
- 在resolv.conf去除rotate选项,但是会影响DNS客户端的行为,无法轮询。
- 把自建的服务配置在第一位和第二位,把公共服务器配置在第三位。缺点是一旦自建服务器出现问题,DNS需要花更多的时间移动到第三位的公共服务器。
Linux上DNS解析总是选择resolv.conf中第二位的DNS服务器IP地址的更多相关文章
- 【转载】resolv.conf中search作用
原文地址:http://www.oliver.ren/linux/387.html reslov.conf中的search主要是用来补全hostname的,有时候域名太长,可以做一个短域名做主机名字, ...
- 免费公共DNS服务器IP地址大全(2017年6月24日)
收集全球各个常用公共DNS服务器 IP地址,欢迎各位朋友评论补充! 国内常用公共DNS 114 DNS: (114.114.114.114: 114.114.115.115) 114DNS安全版 ...
- Linux下扫描服务器IP地址是否冲突(arp-scan)
部署服务突然发现,连接的服务器断开了,因为服务器用户名密码是一样的,所以重新连接后,发现文件变了,跟之前不一样. 猜想是不是ip地址冲突了,两次连接的服务器不同. 网上查找资料说可以用工具扫描.工具: ...
- 常用的公共 DNS 服务器 IP 地址
转载自:小哈龙 2019-04-12 09:34:42 公共 DNS 服务器 IP 地址 名称 DNS 服务器 IP 地址 阿里 AliDNS 223.5.5.5 223.6.6.6 CNNIC SD ...
- 解决Ubuntu系统的每次开机重启后,resolv.conf清空的问题和DNS域名解析问题(图文详解)
不多说,直接上干货! 问题情况描述如下: 普及知识: /etc/resolv.conf ,其实是一个Link .它其实指向的是 /run/resolvconf/resolv.conf. Ubun ...
- DNS客户端配置文件/etc/resolv.conf
本来不应该把DNS客户端配置文件放在这里来说,但由于新手弟兄上网时,虽然能拔号,但不能以域名访问.究其原因是由于没有修改 /etc/resolv.conf 文件: /etc/resolv.conf 里 ...
- 全球免费公共 DNS 解析服务器 IP 地址列表推荐 (解决无法上网/加速/防劫持)
除了宽带提供商的 DNS 以外,像阿里云.腾讯云.Google.百度.IBM.CNNIC 等一些有足够实力的大型互联网公司也非常慷慨地为公众提供了免费的 DNS 解析服务器.异次元这就搜集了全球范围内 ...
- 全国DNS服务器IP地址【电信、网通、铁通】
免费DNS地址: 114DNS:114.114.114.114(推荐国内使用) Google DNS:8.8.8.8(国外) ************************************* ...
- 无法在web服务器上启动调试,此项目在使用一个被配置为使用特定IP地址的网站。请在项目URL中指定计算机名称。
解决方案:IIS服务器管理-default web site 绑定-选择使用的IP-编辑-IP地址:全部未匹配
随机推荐
- .net core web api 默认的模型验证
转载自 https://www.codercto.com/a/45938.html
- 渐进增强(progressive enhancement)、优雅降级(graceful degradation)
渐进增强 progressive enhancement: 针对低版本浏览器进行构建页面,保证最基本的功能,然后再针对高级浏览器进行效果.交互等改进和追加功能达到更好的用户体验. 优雅降级 grace ...
- [转]C++类成员修饰const和mutable
const:常量,不变的 mutable:易变的 从意思上理解,可见const和mutable是一对反义词,它们都是C++的关键字. const成员函数不能修改调用它的对象.类的成员函数可以被声明为c ...
- 面试题:什么叫B树
B是balanced的意思 是在二叉查找树 树的基础上增加了平衡的性质 导致它不是 二叉树了,变成了多叉树,但是叉几路又有了限制 否则怎么平衡呢 一棵m阶B树(balanced tree o ...
- Java集合学习(3):HashSet
一.概述 HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. HashSet是基于Has ...
- spring data jpa 表关联设置用户表关联角色表配置
User 表: @ManyToMany(cascade = { CascadeType.MERGE }) @JsonIgnore @JoinTable(name = "UserRole&qu ...
- python正则表达式(3)--match方法
1.re.match函数 re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match()就返回None. (1)函数语法: re.match(pattern, st ...
- C#程序保存dump文件
作用 程序异常崩溃前使用此类为进程创建DUMP文件,之后可以使用WinDbg等工具进行分析. 辅助类代码 using System; using System.Diagnostics; using S ...
- MyBatis框架之入门(三)
使用原始dao层进行开发 UserMapper层接口 public interface UserMapper { /** * 通过id查询用户 * @param id * @return */ Use ...
- Intellij IDEA运行报Command line is too long解法
修改项目下 .idea\workspace.xml,找到标签 <component name="PropertiesComponent"> , 在标签里加一行 < ...