![通过系统调用理解 resolv.conf 名称服务器](https://linux22.com/image/644184/%E9%80%9A%E8%BF%87%E7%B3%BB%E7%BB%9F%E8%B0%83%E7%94%A8%E7%90%86%E8%A7%A3%20resolv.conf%20%E5%90%8D%E7%A7%B0%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我试图了解 /etc/resolv.conf /etc/nsswitch.conf 的具体工作原理以及名称服务器条目 127.0.1.1 的意义
我执行了 strace ping google.com 来了解所涉及的系统调用,其中一部分是:
stat64("/etc/resolv.conf", {st_mode=S_IFREG|0644, st_size=172, ...}) = 0
socket(PF_INET, SOCK_DGRAM|SOCK_NONBLOCK, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.1.1")}, 16) = 0
gettimeofday({1413780874, 913366}, NULL) = 0
poll([{fd=4, events=POLLOUT}], 1, 0) = 1 ([{fd=4, revents=POLLOUT}])
send(4, "\0040\1\0\0\1\0\0\0\0\0\0\6google\3com\0\0\1\0\1", 28, MSG_NOSIGNAL) = 28
poll([{fd=4, events=POLLIN}], 1, 5000) = 1 ([{fd=4, revents=POLLIN}])
ioctl(4, FIONREAD, [204]) = 0
recvfrom(4, "\0040\201\200\0\1\0\v\0\0\0\0\6google\3com\0\0\1\0\1\300\f\0\1"..., 1024, 0, {sa_family=AF_INET, sin_port=htons(53), sin_addr=inet_addr("127.0.1.1")}, [16]) = 204
close(4) = 0
socket(PF_INET, SOCK_DGRAM, IPPROTO_IP) = 4
connect(4, {sa_family=AF_INET, sin_port=htons(1025), sin_addr=inet_addr("173.194.123.36")}, 16) = 0
getsockname(4, {sa_family=AF_INET, sin_port=htons(58830), sin_addr=inet_addr("192.168.1.13")}, [16]) = 0
close(4)
有人能解释一下这里发生了什么吗?特别是连接到 127.0.1.1,因为它是我的 resolv.conf 中的 namsserver 条目。为什么我们需要与 127.0.1.1 建立套接字连接?我们如何从它那里得到响应?
答案1
大概你的resolv.conf
包括nameserver 127.0.1.1
。
在您的示例中ping 时,google.com
首先需要查找此名称,以便ping
知道可以向其发送 ICMP 回显请求数据包的 IP 地址。
为了找到 IP 地址,它会查阅配置的名称服务器,这就是它与 进行通信的127.0.1.1
原因53/udp
。
答案2
127.0.0.1 仍然是一个 IP,因此它会与 127.0.0.1 建立 UDP 套接字连接。
答案3
首先,使用 检查 /etc/resolv.conf 是否存在stat()
。其次,使用 准备用于解析的套接字socket()
。然后使用 将此套接字初始化为connect()
解析器的 IP 地址、udp 协议和端口号 53。然后使用 发送请求send()
并使用 读取答复recvfrom()
。然后使用 关闭套接字close()
。