问题来源
近来,准备在新服务器上部署一些镜像,便于提供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
看起来是的没错了,那我要怎么寻找这个被解析的未知域名呢
用tcpdump监听
tcpdump -i ens17 -nt -s 500 port domain
ens17是网卡接口名称
port domain用来过滤数据包,表示只抓取使用domain(域名)服务的数据包,即DNS查询和应答报文。
那么,新开一个终端,尝试请求,并且开始监听
抓取到了
可以看到,docker在尝试请求mirrors gs9tpsud.mirror.aliyuncs.com,拉取失败了,然后开始进行auth请求,向官方库production.cloudflare.docker.com获取数据
两个数据包都是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临时转发后,成功拉取镜像