![无法获取我的服务器,但curl 可以工作](https://linux22.com/image/205417/%E6%97%A0%E6%B3%95%E8%8E%B7%E5%8F%96%E6%88%91%E7%9A%84%E6%9C%8D%E5%8A%A1%E5%99%A8%EF%BC%8C%E4%BD%86curl%20%E5%8F%AF%E4%BB%A5%E5%B7%A5%E4%BD%9C.png)
我可以通过curl
浏览器访问我的服务器
但我无法通过 访问它wget
。它被卡在
Loaded CA certificate '/etc/ssl/certs/ca-certificates.crt'
Resolving ***
Connecting to ***:443...
wget
但可以与其他类似的服务器一起使用。
我已经尝试过wget --debug
,但它并没有真正显示更多;卡住的最后一行仍然是Connecting to ...
.解析到的IPwget
是正确的。
如果我将网络切换到智能手机的热点,我就可以毫无问题地使用 wget。重新启动路由器没有帮助。
它在两个 manjaro 安装(wget 版本 1.21.3)上失败。但适用于实时 xubuntu USB 棒,wget 版本 1.21。我还可以在运行 ubuntu 的其他服务器中使用 wget。
对我来说,node.js 的 https 模块的行为方式与 wget 相同。
知道我可以在哪里继续寻找问题吗?
这是 wget2 的输出:
wget2 https://foo.***.com -vd
02.132709.170 Local URI encoding = 'UTF-8'
02.132709.170 Input URI encoding = 'UTF-8'
02.132709.170 Fetched HSTS data from '/home/vs-mango/.local/share/wget/.wget-hsts'
02.132709.170 Fetched HPKP data from '/home/vs-mango/.local/share/wget/.wget-hpkp'
02.132709.170 Fetched OCSP hosts from '/home/vs-mango/.local/share/wget/.wget-ocsp_hosts'
02.132709.170 Fetched OCSP fingerprints from '/home/vs-mango/.local/share/wget/.wget-ocsp'
02.132709.170 set_exit_status(0)
02.132709.170 *url =
02.132709.170 *3 https://foo.***.com
02.132709.170 local filename = 'index.html'
02.132709.170 host_add_job: job fname index.html
02.132709.170 host_add_job: 0x5626fc4850c0 https://foo.***.com
02.132709.170 host_add_job: qsize 1 host-qsize=1
02.132709.170 queue_size: qsize=1
02.132709.170 queue_size: qsize=1
02.132709.170 queue_size: qsize=1
02.132709.170 [0] action=1 pending=0 host=0x0
02.132709.170 dequeue job https://foo.***.com
02.132709.170 resolving foo.***.com:443...
02.132709.174 has ***ipv6:443
02.132709.174 has ***ipv4:443
02.132709.174 trying ***ipv6:443...
02.132709.174 GnuTLS init
02.132709.189 GnuTLS system certificate store is empty
02.132709.189 Certificates loaded: 153
02.132709.189 GnuTLS init done
02.132709.189 TLS False Start requested
02.132709.189 ALPN offering h2
02.132709.189 ALPN offering http/1.1
SSL 模式:
openssl s_client ✔ 2m 9s
140269842409280:error:0200206F:system library:connect:Connection refused:crypto/bio/b_sock2.c:110:
140269842409280:error:2008A067:BIO routines:BIO_connect:connect error:crypto/bio/b_sock2.c:111:
140269842409280:error:0200206F:system library:connect:Connection refused:crypto/bio/b_sock2.c:110:
140269842409280:error:2008A067:BIO routines:BIO_connect:connect error:crypto/bio/b_sock2.c:111:
connect:errno=111
其发生故障的一种特殊情况的摘要:
- 我在 Wi-Fi 中(热点可用)
- 在 Manjaro 上(ubuntu 工作)
- 使用 wget/node-https/wget2 (curl 和浏览器工作)
答案1
描述
问题似乎是 wget 和 wget2(可能还有其他工具)相继尝试解析的 IP 地址。在您的情况下,第一个解析的 IP 在连接阶段“挂起”(例如由于防火墙/NAT 设置),直到超时。 wget 和 wget2 的默认设置是永远等待。
解决方法
要“解决”此问题,请使用--connect-timeout=N
(N 以秒为单位,允许使用分数,例如1.5
)。您可能希望将此选项放入 ~/.wgetrc (单行connect-timeout = N
)或~/.config/wget2rc
or中XDG_CONFIG_HOME/wget2rc
。
因此,这不是 IPv6 与 IPv4 的普遍问题,任何被阻止的 IP 都可能导致此问题。对于您的情况,您还可以调查为什么这种情况确实发生了,并将其修复在不同的层上。
为什么curl没有挂起?
与 IPv6 相比,curl 更喜欢 IPv4或者curl 同时连接到所有 IP,并使用第一个(可能是最快的)连接进行通信。
您可以阅读第二个选项这里。
如果这听起来不错,请随时提出功能请求在 Gitlab 上。
答案2
使用wget https://foo.bar.com -4
它有效
通过智能手机热点 ipv6 似乎根本不起作用,它尝试 ipv4,因此对服务器的请求有效。
看来我们的其他服务器没有配置 ipv6,这就是它们起作用的原因。
通过我们的 wifi,它尝试使用 ipv6 但失败了。
各种在线 ipv6 测试工具均表示我的计算机 ipv6 连接工作正常,因此我假设我们的 ipv6 服务器配置已损坏。
答案3
之所以卷曲作品和获取找不到这个比较由curl的创建者制作。这是因为它实现了快乐的眼球,一种为避免客户端等待失败的 IPv6 路径和协议而创建的算法。
对于这种做法,人们有不同的看法。优点是提高了最终用户体验,缺点是隐藏了网络问题,延迟了IPv6的支持。
只是举我的例子。当我尝试使用仅限 IPv4网站喜欢s3.us-east-1.amazonaws.com和卷曲答案很快:
curl -v https://s3.us-east-1.amazonaws.com/
* Trying 64:ff9b::34d8:22a0:443...
* Trying 52.216.29.166:443...
* Connected to s3.us-east-1.amazonaws.com (52.216.29.166) port 443 (#0)
...
< Content-Length: 0
<
* Connection #0 to host s3.us-east-1.amazonaws.com left intact
real 0m0,855s
user 0m0,095s
sys 0m0,008s
注意卷曲确实尝试过回答的两个地址域名系统, 这IPv6和IPv4一。就我而言,我无法到达那些IPv6地址,它们对应于打破AAAA记录。
另一方面获取答案花了更多时间,因为它首先尝试了所有IPv6返回的地址域名系统:
$ time wget --debug https://s3.us-east-1.amazonaws.com/
...
Resolving s3.us-east-1.amazonaws.com (s3.us-east-1.amazonaws.com)... 64:ff9b::34d8:2460, 64:ff9b::34d8:ddc8, 64:ff9b::34d8:fba6, ...
Caching s3.us-east-1.amazonaws.com => 64:ff9b::34d8:2460 64:ff9b::34d8:ddc8 64:ff9b::34d8:fba6 64:ff9b::36e7:8550 64:ff9b::34d8:d170 64:ff9b::34d9:8578 64:ff9b::34d8:3d40 64:ff9b::36e7:aa98 52.216.209.112 52.216.251.166 54.231.170.152 54.231.133.80 52.216.221.200 52.216.36.96 52.217.133.120 52.216.61.64
Connecting to s3.us-east-1.amazonaws.com (s3.us-east-1.amazonaws.com)|64:ff9b::34d8:2460|:443... Closed fd 3
failed: Connection timed out.
Connecting to s3.us-east-1.amazonaws.com (s3.us-east-1.amazonaws.com)|64:ff9b::34d8:ddc8|:443... Closed fd 3
failed: Connection timed out.
Connecting to s3.us-east-1.amazonaws.com (s3.us-east-1.amazonaws.com)|64:ff9b::34d8:fba6|:443... Closed fd 3
failed: Connection timed out.
Connecting to s3.us-east-1.amazonaws.com (s3.us-east-1.amazonaws.com)|64:ff9b::36e7:8550|:443... Closed fd 3
failed: Connection timed out.
Connecting to s3.us-east-1.amazonaws.com (s3.us-east-1.amazonaws.com)|64:ff9b::34d8:d170|:443... Closed fd 3
failed: Connection timed out.
Connecting to s3.us-east-1.amazonaws.com (s3.us-east-1.amazonaws.com)|64:ff9b::34d9:8578|:443... Closed fd 3
failed: Connection timed out.
Connecting to s3.us-east-1.amazonaws.com (s3.us-east-1.amazonaws.com)|64:ff9b::34d8:3d40|:443... Closed fd 3
failed: Connection timed out.
Connecting to s3.us-east-1.amazonaws.com (s3.us-east-1.amazonaws.com)|64:ff9b::36e7:aa98|:443... Closed fd 3
failed: Connection timed out.
Connecting to s3.us-east-1.amazonaws.com (s3.us-east-1.amazonaws.com)|52.216.209.112|:443... connected.
Created socket 3.
Releasing 0x0000560df7694100 (new refcount 1).
...
real 17m29,487s
user 0m0,022s
sys 0m0,013s
也就是说,这两个工具都有-4
和-6
选项来分别强制使用IPv4
or IPv6
。