2019独角兽企业重金招聘Python工程师标准>>>

我们的设备在测试时发现有个别的主机,主程序DNS解释服务器域名失败。
最直接的表现就是 ping 126.com 显示:

对于这个问题,最直接的方式就是打开 /etc/resolv.conf 文件查看DNS服务器是否设置正确。结果该文件显示:

search lan
nameserver 127.0.0.1

博主用 strace ping 126.com 命令,分别比较了好的有问题的设备与没问题的设备。将输出信息用 meld 进行对比,结果看到在这里出现分歧:
可见,ping 命令在解释 "126.com" 域名时,是 connect 127.0.0.1:53 服务。而存在问题的一边,connect这个服务被拒绝了。

于是,博主可以分析得到,好的设备一定有一个服务进程bind了53端口,并提供了 DNS 服务。而有问题的设备一定是没有该进程。
博主在好的设备上运行 netstat -nap 找到了该服务:
同时我们又在问题的设备,执行 netstat -nap,证实,有问题的设备上这个 dnsmasq 服务没有运行起来。

这里,博主查了些资料:

Dnsmasq is a Domain Name System (DNS) forwarder and Dynamic Host Configuration Protocol (DHCP) server for small computer networks, created as free software. Dnsmasq has low requirements for system resources, can run on Linux, BSDs, Android and OS X, and is included in most Linux distributions.

博主归纳一下:dnsmasq就是一个DNS与DHCP的轻量级的服务。

由于OpenWrt本身就是一个路由器的系统,其自带 Dnsmasq 服务向其网络下的子网设备提供 DNS 与 DHCP 服务。而我们OpenWrt自身的程序解析域名时,也就向本地的 dnsmasq 请求解析。


那么,现在的问题是:为什么个别设备它的 dnsmasq 启动不起来? 对比好的设备,执行 ps 是能看到 dnsmasq 进程存在的。执行 /etc/init.d/dnsmasq stop 能停止它。这时候再 ping 126.com 它也是通的。为什么?博主查了一下 /etc/resolv.conf 文件,在停止 dnsmasq 之前,它的内容是:

search lan
nameserver 127.0.0.1

查一旦停止后,它就会变成:

# Interface lan
nameserver 202.96.128.166
nameserver 202.96.134.133
search bad

这是OpenWrt为了防止 dnsmasq 被停后无法解析域名,所以在停止之前,将其已知的域名服务器写入到 /etc/resolv.conf 文件中来。

相对于有问题的设备,其 /etc/resolv.conf 内容为:

search lan
nameserver 127.0.0.1

而 dnsmasq 进程并未被启动过(执行 ps 命令,列表中没有 dnsmasq 进程)。于是博主尝试执行:/etc/init.d/dnsmasq start,然后执行:ps 查看进程。结果,dnsmasq 进程并没有如愿启动起来。 直接执行 dnsmasq 命令就可以启动服务,然后 ping 126.com 也能拼通。

那么问题应该是在 /etc/init.d/dnsmasq 文件中。博主打开 /etc/init.d/dnsmasq 看了一下,太多了,就不想全部贴出来了。相信大家也没有赖心看。下面只是摘要。 /etc/init.d/dnsmasq start 时会执行到:

PROG=/usr/sbin/dnsmasq
CONFIGFILE="/var/etc/dnsmasq.conf"
<略...>
start_service() {include /lib/functionsconfig_load dhcpprocd_open_instanceprocd_set_param command $PROG -C $CONFIGFILE -kprocd_set_param file $CONFIGFILEprocd_set_param respawnprocd_close_instance<略...>
}

可以了解到,真正执行的启动命令是:/usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf -k
手动执行这个命令,看能否启动 dnsmasq 服务:

如上,出错了。/var/etc/dnsmasq.conf 文件的第11行有重复的关键字。
这是一个重要的线索!打开 /var/etc/dnsmasq.conf 文件:

如上,第11行的关键字为 dhcp-leasefile。对比好的设备的该文件。经对比,完全一致。

那问题又在哪儿呢? 是不是把 /var/etc/dnsmasq.conf 文件中的11行删除就可以了呢?尝试如此操作,结果还真是可以启动。 但这没有从根本解决问题。

是不是有别的配置文件,也有 dhcp-leasefile 关键字?
打开 /etc/dnsmasq.conf,这个文件与 /var/etc/dnsmasq.conf 完全一样。但是博主尝试用 /etc/dnsmasq.conf 替代 /var/etc/dnsmasq.conf,如下执行:

/usr/sbin/dnsmasq -C /etc/dnsmasq.conf -k

结果没有问题,而如果指定的配置文件为 /var/etc/dnsmasq.conf 就有问题。博主很不理解。为了确保这两个文件是同一个,于是:

rm /var/etc/dnsmasq.conf
cp /etc/dnsmasq.conf /var/etc/dnsmasq.conf
/usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf -k

结果:

博主只想说:What a fuck!
同样是配置文件,同样的内容,只是路径变了而已。为什么放 /var/etc/dnsmasq.conf 就会出错?
是不是 dnsmasq 默认就加载了 /etc/dnsmasq.conf ?如果有指定其它的配置文件,它就会出错?
于是:

rm /var/etc/dnsmasq.conf
mv /etc/dnsmasq.conf /var/etc/dnsmasq.conf
/usr/sbin/dnsmasq -C /var/etc/dnsmasq.conf -k

结果:

证实一点,dnsmasq 确实默认加载了 /etc/dnsmasq.conf,不然为什么在我们将文件移走了,会报找不到 /etc/dnsmasq.conf 文件。这也说明了为什么我们强制性指定配置文件为 /var/etc/dnsmasq.conf 时会报重复关键字了。因为 /etc/dnsmasq.conf 也被加载了的。

对比好的设备里的 /etc/dnsmasq.conf 内容,结果发现:

# Change the following lines if you want dnsmasq to serve SRV
# records.
# You may add multiple srv-host lines.
# The fields are <name>,<target>,<port>,<priority>,<weight># A SRV record sending LDAP for the example.com domain to
# ldapserver.example.com port 289
#srv-host=_ldap._tcp.example.com,ldapserver.example.com,389# Two SRV records for LDAP, each with different priorities
#srv-host=_ldap._tcp.example.com,ldapserver.example.com,389,1
#srv-host=_ldap._tcp.example.com,ldapserver.example.com,389,2# A SRV record indicating that there is no LDAP server for the domain
# example.com
#srv-host=_ldap._tcp.example.com# The following line shows how to make dnsmasq serve an arbitrary PTR
# record. This is useful for DNS-SD.
# The fields are <name>,<target>
#ptr-record=_http._tcp.dns-sd-services,"New Employee Page._http._tcp.dns-sd-services"# Change the following lines to enable dnsmasq to serve TXT records.
# These are used for things like SPF and zeroconf.
# The fields are <name>,<text>,<text>...#Example SPF.
#txt-record=example.com,"v=spf1 a -all"#Example zeroconf
#txt-record=_http._tcp.example.com,name=value,paper=A4# Provide an alias for a "local" DNS name. Note that this _only_ works
# for targets which are names from DHCP or /etc/hosts. Give host
# "bert" another name, bertrand
# The fields are <cname>,<target>
#cname=bertand,bert

里面没有一个配置项,与其 /var/etc/dnsmasg.conf 完全不一样。

OK,大致找到问题了。坏设备的 /etc/dnsmasg.conf 有了 /var/etc/dnsmasg.conf 一样的内容。所以,当 dnsmasq 加载完了 /etc/dnsmasg.conf 后再来加载 /var/etc/dnsmasg.conf 就出错了。
将 /etc/dnsmasg.conf 清空即可:

rm /etc/dnsmasg.conf
touch /etc/dnsmasg.conf

然后,再 /etc/init.d/dnsmasg start,就成功了。


那为什么坏的主机 /etc/dnsmasg.conf 有内容?而不是像好的设备那样全是注释? 我们去 OpenWrt工程中找答案。 dnsmasg 在工程的如下路径上:package/network/services/dnsmasq/ 目录为:

.
├── files
│   ├── dhcp.conf
│   ├── dnsmasq.conf
│   ├── dnsmasq.hotplug
│   └── dnsmasq.init
├── Makefile
└── patches├── 001-Build-config-add-DNO_GMP-for-use-with-nettle-mini-gm.patch├── 002-fix-race-on-interface-flaps.patch├── 100-fix-dhcp-no-address-warning.patch└── 110-ipset-remove-old-kernel-support.patch2 directories, 9 files

目录下的 files/dnsmasq.conf 文件在安装后就是 /etc/dnsmasg.conf 文件。打开看,其内容就与好的设备上的 /etc/dnsmasq.conf 文件一致。
如果一个纯净的系统固件,是不会出这个问题的。

那么有两种可能:

  • 由于脚本出错,致将 /var/etc/dnsmasg.conf 文件的内容写入到了 /etc/dnsmasg.conf 中
  • 是我们在进行 sysupgrade 过程中,出错的 /etc/dnsmasg.conf 文件被遗留下来了

验证的方法为:断电重启,看 /etc/dnsmasg.conf 是否会再次变成与 /var/etc/dnsmasg.conf 一致。 结果正常。


好了,博主就分析到这里。这个问题算是已经解决了。

转载于:https://my.oschina.net/hevakelcj/blog/700771

OpenWrt DNS问题排查相关推荐

  1. 【好文收藏】k8s中Pod 无法正常解析域名:部署 DNS 调试工具排查

    k8s 中 Pod 无法正常解析域名:部署 DNS 调试工具排查 问题描述 最近将 Kubernetes 升级到 1.18.1 版本,不过升级完后,查看工作节点的部分 Pod 无法启动,查看消息全是 ...

  2. openwrt dns服务器设置

    今天晚上23点,拿到u8800了,是二手淘来的,成色挺不错,前一个买家是从香港带来的,但是玩游戏单单靠触屏木有感觉,就换了其他手机,这个就挂在网上卖了,从他第一次挂上面到现在都近2个月了... ope ...

  3. openwrt校园网无法登录(登录网页打不开)

    问题描述: 自己淘工控板折腾了软路由,刷上openwrt发现联网不弹校园网登录网页,手动打开也不行. 解决方法: 先说解决方法.进入openwrt后台管理,然后菜单栏找网络→DHCP/DNS,把服务器 ...

  4. 5 种最常见的 DNS 故障诊断及问题处理方法

    1 DNS 基础知识 互联网基于 TCP/IP 协议.为了方便管理网络内的主机,整个互联网分为若干个域 (domain),每 个域又可以再分为若干个子域,例如,.com,.org,.edu 都是顶级域 ...

  5. 第33篇:DNS劫持攻击原理讲解及溯源分析的常规步骤

     Part1 前言  在世界杯举办期间,DNS劫持事件估计会和链路劫持事件一样,风险提升很多.上期分享了一篇<第32篇:某运营商链路劫持(被挂博彩页)溯源异常路由节点(上篇)>,本期就讲一 ...

  6. DNS 故障诊断及问题分析示例

    1 DNS 基础知识 互联网基于 TCP/IP 协议.为了方便管理网络内的主机,整个互联网分为若干个域 (domain),每 个域又可以再分为若干个子域,例如,.com,.org,.edu 都是顶级域 ...

  7. 【debug】json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)

    摘要 环境: 编程语言:Python 3.7 操作系统:Win 10 json数据对象:https://kyfw.12306.cn/otn/leftTicket/query?leftTicketDTO ...

  8. openstack常用运维命令_OpenStack运维指南pdf

    OpenStack运维指南 内容简介 本书分两部分,全面介绍如何构建基于参考架构的OpenStack云系统和执行日常管理任务.一部分全面介绍如何充分发挥OpenStack强大的灵活性,通过各种正确决策 ...

  9. 《网络安全应急响应技术实战指南》知识点总结(第10章 流量劫持网络安全应急响应)

    一.流量劫持概述 1.流量劫持简介 是一种通过在应用系统中植入恶意代码.在网络中部署恶意设备.使用恶意软件等手段,控制客户端与服务端之间的流量通信.篡改流量数据或改变流量走向,造成非预期行为的网络攻击 ...

最新文章

  1. Educational Codeforces Round 4 C. Replace To Make Regular Bracket Sequence 栈
  2. checkbox的常见问题
  3. Oracle NVL函数的用法
  4. jvm体系结构_JVM体系结构:JVM中的执行引擎
  5. 【ES】es 冻结的索引如何查询
  6. IntelliJ IDEA 2014 付费版 免费版比较
  7. 又一知名教授在美被捕!饶毅发文声援,中方也回应了!
  8. 浅谈设备驱动的作用与本质,有无操作系统Linux设备驱动的区别
  9. 宝尚简讯-短期震荡在蓄势
  10. 转:驳Moxie关于Web3中“去中心化”、“服务器”和“密码学”的观点
  11. NBT:扩增子及其他测序的最少信息标准和测序规范(MIMARKS)
  12. 虚拟机安装kali linux
  13. Unity关于无法新建项目的可能解决办法
  14. Python基于face-alignment实现2D/3D人脸关键点检测
  15. 【目标检测 论文精读】……YOLO-V2 YOLO9000 ……(YOLO9000: Better, Faster, Stronger)
  16. 2022-11-17 vue移动端卖座电影项目(一) 获取后台数据
  17. 关于python语言中缩进的说法_以下关于Python语言中“缩进”说法正确的是:
  18. leetcode:Number of Islands
  19. 爬取薅羊毛网站百度云资源
  20. SuperVideo - H5视频播放插件

热门文章

  1. LeetCode - Reorder List
  2. linux内核模块编译
  3. 偶得--Unity在asp.net mvc上的基本应用
  4. 银行业务常用基本概念
  5. TP5 封装多业务的发送短信功能(包括国际短信)
  6. HTTP1.0,1.1,2.0,HTTPS
  7. hdu4869 费马小+快速幂
  8. 【错误记录】Android 应用安装后出现两个启动图标 ( 排查应用及依赖库中配置了 android.intent.category.LAUNCHER 的 Activity )
  9. 【C 语言】结构体 ( 结构体偏移量计算 | 代码示例 )
  10. 【开发环境】010 Editor 工具 ( 工具下载 | 二进制文件分析模板模板安装 | 快捷键查看与设置 )