今天总算发现一个问题

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

连接成功

解释:

这次测试是整个排查过程中非常关键的一步。

它说明:

  • 本地 10808 HTTP 代理可以正常使用。

  • 代理能够建立到 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

所有测试结果汇总

测试项目

使用方式

结果

说明

默认 DNS

dig registry-1.docker.io

异常

返回 Meta 相关 IP

Cloudflare DNS

dig @1.1.1.1 ...

正常结果

与默认 DNS 不一致

Google DNS

dig @8.8.8.8 ...

正常结果

与默认 DNS 不一致

curl 直接访问

--noproxy '*'

失败

连接异常、TLS 握手问题

curl 代理访问

-x 127.0.0.1:10808

成功

TLS 验证通过,HTTP 401

Docker 拉取镜像

docker run hello-world

失败

出现 Facebook 证书错误

最后解决

原来是装了一个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/