跳转到内容
返回

一次域名问题的排查之过

发布:  at  23:01

过程描述

过程很复杂,流程很繁琐,设计到各个方面的配置与交叉验证,所以我不赘述过多细节,只讲讲大致流程。

  1. 出了什么问题

前段时间注册了一个新的域名,现在想启用,我就在 CloudFlare 上配置了 DNS、SSL、CDN 等。 然后在我的阿里云服务器上面部署了我的项目,并将 CloudFlare 的 DNS 解析到了我的阿里云服务器的 IP 地址上。 这一切都很正常,再正常不过了,正常得我都觉得很理所当然。 为什么我会这么觉得呢?因为我现在正在使用中的域名就是这样配置的,它运行得一切正常。

但是新的域名在浏览器上面访问

525 错误

仔细比对了 CloudFlare 上两个 domain 的配置,完全一致。仔细检查并测试了阿里云服务器上的项目,也都正常。 但奇怪的是,我所有的访问在服务器上都没有留下任何痕迹,项目日志没有可以理解,nginx 的访问日志也是空空如也。为此我还特地 debug 了访问流程,证明只要 https 请求触达,日志、代码都可以正常运行。

那么问题就出在前置网络连接与转发上了。

  1. 排查过程

首先我操作的是 CloudFlare,因为它在大陆不是非常稳定,可信度最低。我删除了 CloudFlare 的 domain 配置,直接重新创建,确保配置与正常访问的域名一致。接着我在浏览器上面访问

525 错误。

然后使用域名检测工具,一切正常,但由于解析的 IP 地址是 CloudFlare 的,所以也没发现什么问题。 那么问题肯定就在 CloudFlare 请求阿里云服务器的过程中了。 我问了 Gemini,告诉我很大可能出在 SSL 证书上,导致握手不通过。

我在 CloudFlare 上重新申请了一个 SSL 证书,然后将其配置到了网站项目里。接着我在浏览器上面访问

525 错误。

非常好啊,一样的错误,但是目前来看就应该可以排除 SSL 证书的问题了。 接着,我把 DNS 服务器切换回阿里云,很好,strict-origin-when-cross-origin,只是证书有问题,那就说明请求到网站之前是顺畅的,没有大的问题。那 CloudFlare 为什么会 525 呢? 我又把 CloudFlare 的服务器地址加入了白名单

IPv4 地址范围: https://www.cloudflare.com/ips-v4

IPv6 地址范围: https://www.cloudflare.com/ips-v6

然后切回了 CloudFlare 的域名托管服务,在浏览器上面访问:

This site can’t be reached

mydomain unexpectedly closed the connection.Try:

Checking the connection

Checking the proxy and the firewall

ERR_CONNECTION_CLOSED

Gemini 告诉我这个错误是服务器主动断开的连接:

这个错误的意思是:你的浏览器成功地与你的服务器建立了 TCP 连接(三次握手成功),但在接下来的 SSL/TLS 握手过程中,服务器主动地、突然地关闭了连接。

接着我又做了交叉验证,将现有的可以正常运行的网站的证书复制给新的项目使用:

Your connection is not private

Attackers might be trying to steal your information from mydomain (for example, passwords, messages, or credit cards). Learn more about this warningnet::ERR_CERT_COMMON_NAME_INVALID

这一次可算是接近了,说明了什么?浏览器-> CloudFlare -> 阿里云 -> 主机 -> nginx 这条线路通了,如同我便秘了一天终于有点眉目了,正在兴头上,觉得人生到达了巅峰。

那就让我重新开始吧!CloudFlare 上重新生成了一个 SSL 证书,然后将其配置到了网站项目里,依然证书不可信任。 好家伙,我就想用 CloudFlare 的证书啊!因为它是 15 年的!不需要我维护更新!Let’s Encrypt 只有 3 个月! 我不死心,就要彻底解决证书问题!

curl -vvI https://mydomain

* Host mydomain:443 was resolved.

* IPv6: (none)

* IPv4: 198.18.0.107

*   Trying 198.18.0.107:443...

* Connected to mydomain (198.18.0.107) port 443

* ALPN: curl offers h2,http/1.1

* (304) (OUT), TLS handshake, Client hello (1):

*  CAfile: /etc/ssl/cert.pem

*  CApath: none

* LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to mydomain:443

* Closing connection

curl: (35) LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to m'y'domain:443

IPV4 地址有点问题,也许是代理惹的祸?随机关闭代理,浏览器直接访问:

This site can’t be reached

The connection was reset.Try:

Checking the connection

Checking the proxy and the firewall

ERR_CONNECTION_RESET

再次请教 Gemini:

ERR_CONNECTION_RESET 的意思是:你的电脑成功地向服务器的正确 IP 地址发出了连接请求,但对方(或中间某个网络设备)立即、强制性地发回了一个“重置”信号,主动拒绝建立连接。

考虑到你所在的地理位置(中国大陆),以及这个错误的特性,最大的嫌疑有两个:

你本地网络到 Cloudflare 之间的网络防火墙(例如 GFW)干扰。
Cloudflare 端的安全设置拦截了你的请求。

接着我 dig 了我的域名,全都指向 CloudFlare 的 ip,这是正常的。 curl -vvI https://www.cloudflare.com 检查了一下,http code 200,一切正常。

按照之前的测试,CloudFlare 也确实没有拦截我的访问,因为我压根就没设置防火墙。这就很诡异了,就在纳闷的时候,我又使用浏览器访问,又变成 525 错误了。

诶?这好像不对劲,我翻来覆去到处修改配置,变着花地测试网络连接,它又悄悄 525 了?

接着 Gemini 误导了我,它让我去 https://www.digicert.com/help/ 检查我的主机 ip 并告诉我我的 nginx 配置 SSL 的加密方式有问题,让我修改,折腾了一会后发现对结果没有影响,就舍弃了这条路的探索。

525,525,525…

防火墙、nginx、证书、代理、反向代理……

痛苦在淹没我,一个汉语单词也在跳动跳动,其实它早就出现了,只是被我忽略了,因为我觉得应该不会是它的问题。它就是

备案!!!

是的,经过这一番折腾,我认定了,就是它的问题。我控制了所有的变量,改变了所有可能的配置,都无法解决的问题,那就只能是它了。

正在使用的域名是备案过的,指向了当前主机,运行一切正常。

新的域名未备案,指向了当前主机,运行各种毛病。

目前的唯一变量就在这儿了!

由于找不到便宜主机使用,我现在就只能先备案,成功之后再次部署,下一次肯定成功。

如果还是有 525,那我就……

总结一下

有时候直觉和潜意识挺重要的,在一些模棱两可的经验里,也许就藏着解决方法。反倒是技术方案,它们都很明确,错就是错,对就是对,来回折腾的意义不大,每一步操作都能明确验证一个环节的正确性。

长点记性。



Previous Post
关于社交 APP 的一点想法
下一篇文章
关于我将 adhd 测试的网站升级为测试集站点的说明