假设我有一个域名“my.domain.com”,其 A 记录解析为我的服务器(运行 Ubuntu 20.04)的公共 IPv4 地址(例如 160.200.200.21)
我已经在服务器上安装了 BigBlueButton,几乎一切都很好,除了 BigBlueButton 需要能够从域名或公共 IP 访问自身,但它失败并给出以下错误:
curl: (28) Failed to connect to port 443: Connection timed out
# Error: Could not connect to the configured hostname/IP address
所以我做了以下检查:
- 在远程服务器的端口 80 和 443 上使用
netcat -l
,以确保端口已打开 => 成功
我还运行了以下命令:
~# curl https://my.domain.com
curl: (28) Failed to connect to my.domain.com port 443: Connection timed out
~# curl my.domain.com
curl: (28) Failed to connect to my.domain.com port 80: Connection timed out
~# wget https://my.domain.com
--2023-11-07 20:08:51-- https://my.domain.com/
Resolving my.domain.com (my.domain.com)... 160.200.200.21
Connecting to my.domain.com (my.domain.com)|160.200.200.21|:443... failed: Connection timed out.
Retrying.
但curl http://google.com
有回应!
另请注意,上述命令可以在另一台服务器或计算机上完美运行
~# netstat -anltp | grep :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 4082/nginx: master
tcp 0 0 127.0.0.1:52562 127.0.0.1:8021 ESTABLISHED 13903/node
tcp6 0 0 :::80 :::* LISTEN 4082/nginx: master
tcp6 0 0 :::8021 :::* LISTEN 13262/freeswitch
tcp6 0 0 127.0.0.1:8090 :::* LISTEN 13076/java
tcp6 0 0 127.0.0.1:32800 127.0.0.1:8021 ESTABLISHED 13745/java
tcp6 0 0 127.0.0.1:8021 127.0.0.1:32800 ESTABLISHED 13262/freeswitch
tcp6 0 0 127.0.0.1:8021 127.0.0.1:52562 ESTABLISHED 13262/freeswitch
~# netstat -anltp | grep :443
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 12628/haproxy
tcp6 0 0 :::443 :::* LISTEN 12628/haproxy
此时我不知道要再次检查什么或在哪里寻找问题。该服务器是一个虚拟机,由提供商提供,所以我只有 ssh,根访问提供商说它位于防火墙后面,但由于端口明显打开,我不知道是否可以责怪它们。
因此,发生的情况是 my.domain.com 在服务器外部(在浏览器或 CLI 上)完全可以访问,但在服务器内部却无法访问,即使相关端口已打开。
我发现一件事很奇怪,也许这些信息会很有用:当我netcat -l 80
在我的服务器上执行此操作时,即使 Nginx 在端口 80 上运行netcat -l 443
,它也能工作。失败说端口正在使用中,我必须先关闭使用它的进程,然后才能运行考试。
如果您的虚拟机无法通过外部连接到达自身,您可以修改 /etc/hosts 以将网络适配器 IP 地址之一(甚至是 localhost)映射到计算机的 DNS 名称。这些配置优先于外部 DNS 中的配置。