banner
Kerronex

Kerronex

兴趣使然,一个随手记笔记本

Cloudflare代理後訪問超時

由於一些原因,我使用 Cloudflare 來代理我伺服器上的服務,主要是想簡單隱藏伺服器 IP,可能還有加速的效果~但是我遇到了一些費解的問題。

我用 docker 跑了兩個服務,一個打算映射在 8443 端口使用 https;另一個跑在 8002 端口使用了普通的 http,不支持 SSL。

配置好 DNS 後,開始使用域名以 https 訪問 8443 端口,發現超時;然後訪問 8002 時也超時;
一開始以為是服務有問題,排查了一番沒發現有問題,使用 IP 訪問測試發現是正常的。

中間問 ChatGPT 耽誤了好長時間,不管是 ChatGPT 還是 Bing 還是 Bard 回答的原因都是瞎說;AI 果然也不是很靠譜啊。。。耽誤時間

根據我的理解,既然 IP 訪問沒有問題,那麼伺服器配置應該問題不大,應該是 Cloudflare 的配置那裡不對;
HTTPS 訪問 8443 既然超時,那應該是 SSL/TLS 配置有問題,根據文檔很容易理解其 4 種代理方式,最常用的應該是靈活和完全。

  • 當使用 靈活 模式時,無論你使用 http 還是 https 訪問,CF 都會以 http 的方式訪問源站,此時源伺服器不需要 SSL 證書;
  • 使用 完全 模式時,會使用訪問者請求的方案連接到源。也就是如果訪問者使用 http,則 Cloudflare 使用純文本 HTTP 連接到源,反之亦然。
    這種模式不會校驗源站的 SSL 證書,所以可以使用自簽的證書或者 CF 簽發的證書。

我當前配置的是靈活模式,根據描述會以 HTTP 的方式訪問源站,那確實不會通,改為完全模式後,測試 8443 可以正常訪問了。


但是這解釋不了為什麼 8002 端口會超時,8002 是支持 HTTP 的,但是依然無法訪問,當然改成完全模式後 8002 這個就無法使用 HTTPS 了,我換了一個域名,使用靈活模式,依然無法訪問 8002。

最後我在官方文檔的靈活模式解釋部分找到了原因:

靈活模式僅支持在 443 端口(默認端口)上的 HTTPS 連接。使用 HTTPS 的其他端口將回退到完全模式。
https://developers.cloudflare.com/ssl/origin-configuration/ssl-modes/flexible/#limitations

也就是靈活模式這種方式有一個限制,就是僅支持 443 端口的 https 連接,如果使用了其他端口會回退到完全模式。
也就是如果想用 CF 的 HTTPS,就不要自定義端口,把服務端口從 8002 切換到 80 後確實正常了。

但是,我並不想使用 80 端口提供服務,還想上 HTTPS,最後給伺服器上了個 Nginx 來支持 SSL。
但是依然訪問超時。

現在的情況就有點棘手:
Cloudflare 當前處於完全模式,使用 HTTPS 訪問的情況下,8443 正常;8002 超時;
這兩個服務都支持了 SSL,通過 IP 訪問都正常;

如果都超時那可以說是 Cloudflare 配置有問題,現在 IP 訪問都可以,Cloudflare 代理後一個行一個超時,用的是同一套配置,同一個域名,這就很迷。

直覺上肯定是 Cloudflare 有什麼限制或配置,期間一直在問各種 LLM 模型,根據回答排查都沒問題,再問就是亂編的回答了。。。

後來都快放棄了,決定翻翻 Cloudflare 的文檔,也去 Google 了下,最終發現文檔有這麼一篇:

HTTP ports supported by Cloudflare

  • 80
  • 8080
  • 8880
  • 2052
  • 2082
  • 2086
  • 2095

HTTPS ports supported by Cloudflare

  • 443
  • 2053
  • 2083
  • 2087
  • 2096
  • 8443

https://developers.cloudflare.com/fundamentals/get-started/reference/network-ports/

看到這我也是挺無語的,就那麼湊巧碰到了 8443 這個白名單。。。。

既然這樣,8002 看來是沒法用了?
在搜索過程中,發現規則裡有個 Origin Rules ,可以根據主機名進行重寫端口;
那麼可以 DNS 裡新增一個二級域,根據 Origin Rules 匹配,然後重寫端口到源站的 8002,這樣就可以直接使用 443 來進行訪問。
It is working.

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。