Linux下监听53号端口捕获DNS查询报文
计算机网络课设要求写一个能正常工作的DNS resolver,这就要求写出来的解析器能监听应用程序发出的查询报文。
即当应用程序需要查询某个网址对应的IP地址时,它会先往DNS resolver发送一条查询报文。这个解析器会解析这条报文,然后先在本地高速缓存中寻找有无对应的IP地址,若没有则去其他它知道的DNS服务器进行查找。获取结果后,将报文返回。
在这其中,53号端口就是解析器和服务器监听的端口。
使用sudo netstat -aptn | grep 53
命令可以查看53号端口的占用情况
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 826/systemd-resolve
tcp 0 0 10.122.223.96:53708 54.209.117.64:443 ESTABLISHED 7107/firefox
tcp 0 0 10.122.223.96:58050 10.3.9.4:53 TIME_WAIT -
tcp 0 0 10.122.223.96:53710 54.209.117.64:443 TIME_WAIT -
如上,已经被systemd-resolve
的系统服务占用
强行运行监听程序,会发生如下错误:
Address already in use
为此,应当先停止systemd-resolve
服务
使用systemctl stop systemd-resolved
命令停止该服务
之后,修改/etc/resolv.conf
里面的内容
nameserver 127.0.0.1
# nameserver 127.0.0.53
# options edns0 trust-ad
这个文件是由systemd-resolve
服务自动生成的
监听程序的一个小DEMO:
#include <sys/socket.h>
#