Linux下使用tcpdump监听DNS查询

道锋潜鳞
2024-02-15 / 0 评论 / 44 阅读 / 正在检测是否收录...

问题来源

近来,准备在新服务器上部署一些镜像,便于提供workspace。这就难免要使用到docker pull来拉取镜像。
结果问题来了,需要用到的这个镜像不知道什么原因,各大镜像站中均无数据

起初不断配置registry mirrors来加速,但是始终没有效果

总是出现如下故障

read tcp 172.16.11.202:42874->104.18.125.25:443: read: connection reset by peer

解决过程

简单查询,发现104.18.125.25是Cloudflare的节点ip,于是想到能否查询一下docker的子域名,看看有没有指向cf的,如果有,直接hosts替换一下说不定就好了
结果通过itdog查询,发现docker.io所有子域名都没有指向Cloudflare服务的

这就奇了怪了

尝试先拉取一个镜像,另外一个shellsession使用ss查询一下连接是否来自dockerd进程

ss -tnp state connected | grep docker

202402150938067913.png

看起来是的没错了,那我要怎么寻找这个被解析的未知域名呢

用tcpdump监听

 tcpdump -i ens17 -nt -s 500 port domain

ens17是网卡接口名称

port domain用来过滤数据包,表示只抓取使用domain(域名)服务的数据包,即DNS查询和应答报文。

那么,新开一个终端,尝试请求,并且开始监听
202402150940458860.png

抓取到了
202402150941487160.png

可以看到,docker在尝试请求mirrors gs9tpsud.mirror.aliyuncs.com,拉取失败了,然后开始进行auth请求,向官方库production.cloudflare.docker.com获取数据

202402150944075548.png

两个数据包都是IP数据报,第一个数据报表示10.0.17.2(本地)向223.5.5.5(DNS服务器)查询production.cloudflare.docker.com的IP地址,53是DNS服务的端口号,“+”表示启用递归查询标志,“A?”表示使用A类型的查询方式,61是该报文的长度(字节)。

第二个数据报表示223.5.5.5向10.0.17.2发送DNS应答报文,2/0/0表示该报文中包含2个应答资源记录,0个授权资源记录和0个额外信息记录,A表示紧随其后的记录是IP地址。

同理,后面还有AAAA请求数据报

到此,查询到了未知的域名,进行hosts临时转发后,成功拉取镜像

0

评论 (0)

取消