无法获取我的服务器,但curl 可以工作

无法获取我的服务器,但curl 可以工作

我可以通过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/wget2rcor中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

注意卷曲确实尝试过回答的两个地址域名系统, 这IPv6IPv4一。就我而言,我无法到达那些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选项来分别强制使用IPv4or IPv6

相关内容