我如何重现该问题...

我如何重现该问题...

这是一个令人困惑的问题,我希望通过写一个 StackOverflow 问题,获得一些新的见解。

简而言之,我试图弄清楚为什么我可以访问https://sts.nih.gov来自主机,但不是来自同一主机上的 docker 容器,而其他网站工作正常

我如何重现该问题...

我有一台基于云的机器(Digital Ocean),它可以顺利地建立到sts.nih.gov

# from host machine
curl -vv -o /tmp/test https://sts.nih.gov

如果我在一个新 Docker 容器上获得 shell,我将无法访问该网站

 # get a shell within a container 
 docker run -ti ubuntu:18.04 /bin/bash

 # attempt same request...
 curl -vv --ipv4 -o /tmp/test https://sts.nih.gov
* Rebuilt URL to: https://sts.nih.gov/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0*   Trying 128.231.243.251...
* TCP_NODELAY set
  0     0    0     0    0     0      0      0 --:--:--  0:00:31 --:--:--     0* connect to 128.231.243.251 port 443 failed: Connection timed out
* Failed to connect to sts.nih.gov port 443: Connection timed out
* Closing connection 0
curl: (7) Failed to connect to sts.nih.gov port 443: Connection timed out

现在有趣的是,如果没有该--ipv4标志,命令就会尝试使用 ipv6 并且失败。

所有对外部主机的访问都会发生这种情况吗?

curl -o /tmp/test https://serverfault.com/不,例如,在docker容器内就可以正常工作。

是 DNS 问题吗?

否,nslookup 能够解析容器内的地址

nslookup sts.nih.gov
Server:     67.207.67.3
Address:    67.207.67.3#53

Non-authoritative answer:
sts.nih.gov canonical name = sts.ha.nih.gov.
Name:   sts.ha.nih.gov
Address: 128.231.243.251
Name:   sts.ha.nih.gov
Address: 2607:f220:404:9124:128:231:243:251

我也可以尝试在请求中使用 IP 地址

curl -vv -o /tmp/test https://128.231.243.251

结果相同——超时。

它是特定于 https 的吗?

不,这似乎是 TCP/IP 问题,而不是 https 协议问题。仅使用 netcat 检查连接失败。

netcat -zvn 128.231.243.251 443
(UNKNOWN) [128.231.243.251] 443 (?) : Connection timed out

这是路由问题吗?

似乎不是——毕竟主机可以访问问题站点,docker 容器也可以访问其他外部网站。

Traceroute 显示 ICMP 数据包至少已到达目标网络

traceroute 128.231.243.251
traceroute to 128.231.243.251 (128.231.243.251), 30 hops max, 60 byte packets
 1  172.17.0.1 (172.17.0.1)  0.063 ms  0.029 ms  0.023 ms
 2  * * *
 3  10.80.5.46 (10.80.5.46)  1.758 ms 10.80.5.48 (10.80.5.48)  1.864 ms 10.80.5.38 (10.80.5.38)  4.499 ms
 4  138.197.249.112 (138.197.249.112)  1.991 ms 138.197.249.122 (138.197.249.122)  2.179 ms 138.197.249.104 (138.197.249.104)  1.961 ms
 5  138.197.251.136 (138.197.251.136)  1.659 ms 138.197.251.142 (138.197.251.142)  1.846 ms 138.197.251.138 (138.197.251.138)  1.799 ms
 6  212.187.195.149 (212.187.195.149)  4.005 ms 212.187.195.85 (212.187.195.85)  1.800 ms  1.743 ms
 7  * * *
 8  4.16.68.166 (4.16.68.166)  76.945 ms  76.901 ms  76.869 ms
 9  bth-tic-core-rt-a-te-0-0-0-0.net.nih.gov (156.40.93.1)  77.783 ms  77.754 ms  77.632 ms
10  156.40.93.170 (156.40.93.170)  76.519 ms  76.473 ms  76.429 ms
11  156.40.93.171 (156.40.93.171)  77.745 ms  76.627 ms  77.020 ms
12  * * *
...
30  * * *

我还可以使用 TCP SYN 包显示良好的跟踪

traceroute --tcp 128.231.243.251
traceroute to 128.231.243.251 (128.231.243.251), 30 hops max, 60 byte packets
 1  172.17.0.1 (172.17.0.1)  0.066 ms  0.017 ms  0.017 ms
 2  * * *
 3  10.80.5.34 (10.80.5.34)  1.881 ms 10.80.5.46 (10.80.5.46)  2.113 ms 10.80.5.36 (10.80.5.36)  1.832 ms
 4  138.197.249.98 (138.197.249.98)  3.127 ms 138.197.249.120 (138.197.249.120)  1.978 ms 138.197.249.106 (138.197.249.106)  1.853 ms
 5  138.197.251.140 (138.197.251.140)  1.784 ms  1.826 ms 138.197.251.132 (138.197.251.132)  1.705 ms
 6  212.187.195.149 (212.187.195.149)  2.859 ms  1.457 ms  1.389 ms
 7  * * *
 8  4.16.68.166 (4.16.68.166)  76.470 ms  76.446 ms  76.520 ms
 9  bth-tic-core-rt-a-te-0-0-0-0.net.nih.gov (156.40.93.1)  77.602 ms  77.582 ms  77.492 ms
10  156.40.93.170 (156.40.93.170)  76.005 ms  76.733 ms  76.459 ms
11  * * *
12  * * *
13  * * *
14  * * *
15  * * *
16  * * *
17  128.231.243.251 (128.231.243.251)  77.268 ms  77.215 ms  76.815 ms

下一步行动?

到目前为止,我不知道如何进一步缩小范围。对我来说,感觉就像某物关于远程端的网络,这很不寻常,但只在 docker 的网络机制中体现出来。

答案1

您需要创建一个新的桥接docker网络并将容器连接到此网络。您应该能够通过这种方式连接。如果不能是因为某些docker服务损坏,只需重新启动docker即可。我也遇到过这个问题。

答案2

有类似的问题。

对我来说,这种行为是由我的主机和 Docker 容器上的默认网络接口的 MTU 值不同引起的。

您可以使用以下方式检查 MTU 值是否配置命令。在我的例子中,我的主机上的 MTU=1143:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1143

并且docker容器内的MTU = 1500:

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500

更改 Docker 容器内的 MTU 值解决了这个问题:

ifconfig eth0 mtu 1143 up

现在您可以检查是否可以到达终点。

容器重启后,网络接口配置将被重置。有关如何使更改持久化以及该问题的更详细说明,请参见此处: https://www.civo.com/learn/fixing-networking-for-docker

相关内容