gethostbyname与DNS

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gethostbyname与DNS相关的知识,希望对你有一定的参考价值。

参考技术A

域名查询(Domain Name Query)在Linux上的执行主要由glibc库函数 gethostbyname 与 gethostbyaddr 来完成,通过 strace 跟踪可知 gethostbyname 的执行流程如下:

注:关于DNS与 dig 命令的介绍请阅读 阮一峰 老师的文章 DNS原理入门 。

先介绍下我的系统环境:

没有 配置 nscd 的服务器上,用 strace 追踪 gethostbyname ,其大致流程摘录如下(省略的部分用 ...... 表示)。库函数 gethostbyname 的使用可参考 该页面 。

要想查看某个程序是否调用 gethostbyname ,只需用 ltrace 命令跟踪一下查看其库函数调用即可:

注:在 man gethostbyname 中有一句:

笔者所在公司的服务器上并没有配置 nscd ,但笔者的阿里云个人服务器上却默认配置了 nscd 。从 man nscd 摘录如下:

Linux服务器上一般都会配置 dnsmasq 服务,用于缓存DNS请求结果,节省应用程序的域名解析时间。笔者的笔记本 Ubuntu 16.04 LTS 也默认配置了 dnsmasq ,同样笔者的 macOS Sierra 上也默认有一个叫 mDNSResponder 的服务。 dnsmasq 简介如下:

dnsmasq 通常会绑定本地 127.0.0.1:53 ,假设配置的DNS服务器是Google Public DNS,则 dnsmasq 的配置 /etc/dnsmasq.conf 一般如下:

这样, /etc/resolv.conf 的配置如下。注意第一项 nameserver 是本地IP 127.0.0.1 ,也就利用上了 dnsmasq 的DNS缓存功能。

网络上广泛使用的DNS服务器通常是 bind ,简介如下:

用 strace 追踪可知, dig 命令是通过读配置文件 /etc/resolv.conf ,然后向其中列出的DNS服务器发出DNS请求。

在日常开发和学习中,遇到问题或对某个东西感到疑惑的时候,对程序进行调用跟踪和对网络进行抓包,是非常有效的分析方式。

用 strace 来跟踪系统函数调用,细节请参考 man strace 。

用 ltrace 来跟踪库函数调用,细节参考 man ltrace 。

用 wireshark (GUI)、 tshark 、 tcpdump 来进行网络抓包,细节参考各自的 man 说明页。

更加强大和复杂的动态追踪技术,请参考 SystemTap 和DTrace( DTrace for Linux 2016 , wikipedia ),我还没尝试过。还可以阅读大神章亦春(春哥)写的文章 动态追踪技术漫谈 。

以上是关于gethostbyname与DNS的主要内容,如果未能解决你的问题,请参考以下文章

gethostbyname()函数详解

windows下gethostbyname 调用失败

(高分)关于 gethostbyname函数的具体使用 谢谢

gethostbyname和gethostbyaddr

gethostbyname()函数

gethostbyname 函数中的 IP 地址顺序