今天总算发现一个问题
docker居然没有被屏蔽我发现docker pull总容易出现问题,我的猜测如下
v2ray使用了绕过大陆,然后dns解析后得到ip发现大陆可以ping通
于是果断交给本地路由然而本地路由的dns遭到污染
把facebook的ip指向了我们可怜的dockerhub!导致请求超时time out呜呜呜
搞忘了懒得测了好像docker就是被屏蔽了可怜🥺
解决办法
1.更改本地路由dns,如果可以的话1.1.1.1 8.8.8.8
2.指定docker的流量强制走代理端口
3.更改为全局而不是绕过大陆或在规则中微调
4.指定ip去访问因为实际ip没有阻断
除了docker可能还有各种各样的工具都会有类似的情况
哈哈哈第一次遇见就会觉得蛮头疼的呢。
测试 1:使用 Ubuntu 系统默认 DNS
执行:
dig registry-1.docker.io A观察到的异常结果:
202.160.128.195这个地址与 Meta(Facebook)的地址段有关,而不是我们预期的 Docker Hub 解析结果。
解释:
Ubuntu 默认通过 systemd-resolved 使用路由器提供的 DNS:
Ubuntu
|
v
127.0.0.53
|
v
192.168.1.1
|
v
上游 DNS这说明默认 DNS 查询链路返回了异常结果。
可能原因包括:
DNS 污染。
路由器上游 DNS 异常。
运营商 DNS 劫持。
其他网络设备或代理软件干预。
仅凭这个结果,还不能确定污染发生在哪个环节。
测试 2:指定 Cloudflare DNS
执行:
dig @1.1.1.1 registry-1.docker.io A以及:
dig @8.8.8.8 registry-1.docker.io A当时观察到:查询结果与默认 DNS 返回的 Meta 地址不同,得到的是正常的 Docker Hub 解析结果。
解释:
这说明指定 DNS 与系统默认 DNS 的解析结果不一致。
因此,问题很可能出现在默认 DNS 解析链路,而不是 Docker Hub 的域名本身。
直接访问 Docker Hub 测试
测试 3:绕过 HTTP 代理,直接访问 Docker Hub
执行:
curl --noproxy '*' -4 -Iv \
https://registry-1.docker.io/v2/当时观察到:
* Trying 157.240.15.8:443...随后 TLS 握手没有正常完成,连接一直等待
解释:
--noproxy '*' 的意思是强制不使用 HTTP 代理。
因此这次测试走的是 Ubuntu 自身的网络路由。
如果 DNS 将 Docker Hub 解析成错误 IP,就可能连接到错误服务器。
这次好像是正确的docker服务器被屏蔽了!
之前还出现过 Facebook 证书的情况:
SSL: no alternative certificate subject name
matches target hostname 'registry-1.docker.io'这说明目标服务器提供的证书与 Docker Hub 域名不匹配。
这不是正常的 Docker Hub TLS 响应。
通过 V2RayN HTTP 代理访问
测试 4:指定 10808 代理
执行:
curl -x http://127.0.0.1:10808 -Iv \
https://registry-1.docker.io/v2/当时成功建立连接,关键输出包括:
* Connected to 127.0.0.1
* CONNECT tunnel established
* SSL connection using TLS
* Server certificate:
* subject: CN=*.docker.com
* SSL certificate verify ok.最终:
HTTP/2 401连接成功
解释:
这次测试是整个排查过程中非常关键的一步。
它说明:
本地
10808HTTP 代理可以正常使用。代理能够建立到 Docker Hub 的 CONNECT 隧道。
TLS 证书验证成功。
Docker Hub 返回了 HTTP 401。
为什么 401 反而是成功?
因为访问:
https://registry-1.docker.io/v2/没有提供 Docker Hub 身份认证信息。
Registry 返回 401,通常表示需要身份认证,而不是网络连接失败。
因此:
HTTP 401 在这里代表网络、TLS 和服务器通信都已经成功。
Docker 代理配置检查
你之前检查过 Docker 的配置文件:
cat /etc/docker/daemon.json当时没有显示配置内容。
之后我们检查过 Docker systemd 环境,之前记录的配置是:
HTTP_PROXY=http://127.0.0.1:10808
HTTPS_PROXY=http://127.0.0.1:10808
NO_PROXY=localhost,127.0.0.1,::1所有测试结果汇总
最后解决
原来是装了一个snapdocker然后代理环境为空加上了就可以了
不过事实是不代理的话还是ping不通哈哈哈哈
root@xizxi-B760M-GAMING-WIFI-PLUS:~# mkdir -p /etc/systemd/system/snap.docker.dockerd.service.d
返回为空
cat > /etc/systemd/system/snap.docker.dockerd.service.d/proxy.conf <<'EOF'
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:10808"
Environment="HTTPS_PROXY=http://127.0.0.1:10808"
Environment="NO_PROXY=localhost,127.0.0.1,::1"
EOF
注入代理规则
最后测试!
root@xizxi-B760M-GAMING-WIFI-PLUS:~# docker run --rm hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/