Contents
前言
何謂"建站有公有IP卻沒有合法的80、443埠"?這主要指兩個場景:有公網IP的家庭寬頻和沒有備案的雲端主機。
1.有公網IP的家庭寬頻
現在有公網IP的家庭寬頻(主要是IPv6公網位址和少量存量的IPv4公網IP),80和443埠是直接從網路層級封死了的,而一般人存取都是習慣在瀏覽器位址欄輸入網域以後直接回車訪問,很少有人能接受輸入完整連結然後加埠的方式來訪問,例如:http://www.example.com:55555
或者https://www.example.com:55555
(就算有人願意,也會覺得比較沒有逼格。。。),而直接瀏覽器地址欄輸入域名回車就可以訪問的前提就是80和443端口是可用的,所以對於家庭寬帶有公網IP又想用來蓋站的朋友來說,解決80和443埠的問題就是第一個需要解決的問題。
先閒話一番,其實現在新裝的家庭寬頻想有公網IPv4地址是很難的事情了,據成都電信給我的答复,好像是22年開始國家推行什麼強國政策,新裝寬頻IPv4公網地址是不分配的了(除非使用399以上套餐並每月額外給100元的服務費~~~,就問你怕不怕),不過IPv6公網地址可以有。現有的IPv4公網位址基本上都是以前老用戶預設保留下來的,而且如果這些老用戶升級套餐甚至都不能保證公網IPv4地址還有(據說之前工信部投訴可以拿回公網IPv4地址,不過可能要半個月到1個月的時間,我覺得如果真是國家政策,以後投訴有沒有用也難說)。當然,如果不考慮多撥,只從建站的角度來講,IPv6和IPv4倒也沒啥區別,而且其實IPv6公網地址也可以多撥,不過現在還沒普及,使用成本比較高,這個以後有空我會單獨寫一篇文章來講。
2.有雲主機而網域沒有備案
有了雲端主機,就有了固定公網IPv4位址,並且80和443埠在網路層是通的,但是如果你的網域沒有備案的話,即使把網域解析到雲端主機的固定公網IPv4位址上,仍舊無法訪問的,這是因為備案系統的存在。簡單來說,只要是http協議,不管是http(80端口),還是https(443端口),無所不在的監測會查看到你的http請求的host字段,會將其中訪問的域名拿出來和備案地址庫的白名單進行比對,如果是備案過的域名,則允許你正常訪問;如果是沒備案過的域名,則會根據你解析的IP所屬的雲供應商是誰彈出對應該的提示框,例如IP是騰訊雲的主機,會跳出以下提示:
這時候你的訪問請求甚至沒有到達目的地就被強制重定向到這個頁面。值得一提的是,這種檢測和攔截僅僅是針對80和443端口,也就是不加端口的http和https類型訪問,所以如果加其他端口(非80和443)是不受備案系統影響的,當然,正常人也不願意去加這個連接埠。
上面這兩種場景應該是我們最常遇到的,所以無論是想用有公網IP的家庭寬頻建站或是有雲主機有固定公網IP但是不想網域備案而建站的朋友來說,最優先解決的肯定是無法使用80和443埠的問題。
那麼如何解決這個問題呢?要說清楚這個,需要先能理解CDN對應的」源站」這個概念。
CDN的源站
簡單來說,CDN就是一個分散式的大型反向代理,而」來源站」就是配置反向代理時需要指定的後端真實伺服器的存取url,以寶塔linux面板配置的反向代理為例:
CDN的”源站”就是類似反向代理紅框中配置的目標URL。
如果域名是備案過的域名,就可以使用國內雲供應商的CDN服務,以騰訊雲的CDN配置為例看下選項:
可以看到騰訊雲的CDN在源站類型、源站協定、源站位址、回源HOST都是可選的,而最關鍵的是,源站位址可以選IP或者域名,並且端口是可選的,也就是說可以是非標端口(80和443),結合後面可以單獨指定的回源HOST,這個可玩範圍就非常大了,隨便舉個例子:以域名方式指定源站為
source.example.com
,連接埠指個55555,就可以直接把源站指向一個提供類似託管伺服器的機構或個人(例如有公網IP的家庭寬頻),然後只要在這個機構或個人的設備上把你自己的網站網域作為回源HOST正確配置就可以作為CDN的來源站了(我的部落格就是這樣,這就是我稱之為的家庭資料中心的原因)。
可惜的是,cloudflare預設的DNS代理方式不能像騰訊雲CDN這樣指定連接埠:
例如cloudflare的free版:
是說源站位址只能是IP,沒有連接埠選項,也就是說只能標準埠(中國大陸地區是80和443,其他地區還有較多的預設埠),沒有回源HOST,也就是說在這個指定的IP:43.44.45.46的80或者443端口上必須有對應名稱為blog.example.com的站點,而不像騰訊雲CDN配置的回源host那樣可以是其他的站點名稱。
回源站點名稱這個的確是沒有辦法像騰訊雲CDN那樣隨便亂寫(畢竟cloudflare是基於DNS域名工作的),但是源端口真的就只能是80和443了嗎?前面提到的2個主要場景可都是沒有80和443埠的。
其實還是可以解決的,這個就要透過cloudflare的Origin Rules功能來實現了。
Origin Rules
由上圖可知,官方介紹為:”自訂匹配流量的去向以及使用哪些參數。允許主機標頭、SNI、DNS 記錄和目標端口替代”,注意目標端口替代,這個就是可以自定義源站的目標端口。
點選建立規則:
上圖就創造了一個最簡單的回源規則:當傳入請求為https時(cloudlflare本來就會自動套用https),來源站的目標埠改為55555。當然,也可以用and 或or的方式加入規則,例如:
如上圖加了一個and之後,只有訪問
https://www.example.com
這個主機名稱時候來源站埠才是55555,這樣可以不同的主機名稱對應不同的來源站埠了,更靈活了。且條件除了主機名稱、SSL/HTTPS以外,還有許多選項:大家可以依需求進行選擇。
缺點
透過這種方式的確可以解決80,443埠的問題,不過卻有以下2個缺點:
1.必須將網域的DNS解析指向cloudflare
如果網域是在國內DNS供應商買的(例如阿里雲或騰訊雲),需要將DNS指向cloudflare並且進行相應的設定(具體步驟可以參考我另一篇文章:奇技淫巧系列透過國內備案雲主機白嫖cloudflare實現國外快速訪問國內站點)
2.國內訪問速度比較看臉
因為使用cloudflare建站屬於”境外”網站,畢竟沒有經過備案,這種國內是有負優化的,各個省份訪問速度比較看臉。所以如果很在乎國內訪問體驗,還是老實備案把~~。
另:目前使用cloudflare建站,我分別針對有公網IP和無公網IP提供2種方案:無公網IP只能採用tunnel的方式(參見:奇技淫巧系列透過無公網IP的家庭寬頻白嫖cloudflare實現快速建站(通用)),而有公網IP又分有合法80,443埠(參見:奇技淫巧系列透過國內備案雲主機白嫖cloudflare實現國外快速訪問國內站點)和沒有合法80,443埠(就是本文方式),其中,tunnel不管有無公網IP都能採用,是真正的通殺方式,而速度也未見得慢多少,關鍵還更安全(畢竟算是直接穿透到內部環境),所以正常情況下我建議盡量用tunnel方式,只不過請配置好cloudflare提供的DDOS,WAF等安全策略,畢竟這種情況下安全就只能靠cloudflare了。
以下是我用站長工具測試採用不同建站方式的網域的存取速度,供大家參考。
用本文方式直接改源站埠指向家庭寬頻公網IP對應網域的測試結果:
用tunnel方式模擬沒有公網IP的家庭寬頻建置站的對應網域的測試結果:
上面兩種測試結果其實大差不差,因為每次測試結果都不一樣,所以不好比較哪種速度比較快,大家有條件也可以自行測試比較。