目前國內的大環境來說,公網地址異常緊缺,雖然在ipv6時代來臨後,地址資源已經完全不是事兒了,但是處在ipv4的時代,只能面臨ipv6完全替代ipv4的陣痛,面臨大部分的寬頻都是透過nat共享來的。但是智慧的力量是無窮的,ngrok/frp/n2n等各種內網穿透的方案層出不窮,總有一款適合你,那麼,作為一個有理想,有追求,有道德,無節操,愛折騰的人,在折騰屬於自己的伺服器,無論是nas/軟路由還是部落格系統/遊戲伺服器等等的時候,應該怎麼選擇那?本文的主要目的,在於結合當下流行的直接或者間接的服務暴露方案,比較其適合場景,優劣特性,作出正確的選擇。

一。 公網地址那些事

獲取方式

網際網路上每一個服務,將服務暴露出去唯一的方式,就是有一個公網地址的埠可以對映到你的服務上,然而國內現狀,預設情況下,99%的情況運營商是不會分配給你地址的。在大環境如此的情況下,獲取到公網ip的方法有如下三種:

打電話給運營商,據理力爭,說我家裡需要搭建監控,或者我是一個開發人員,需要把開發號的產品展示給客戶,需要公網ip。總之軟磨硬泡死纏爛打一點。

利用購買具有公網ip的雲主機或者vps,自建ngrok,frp之類的埠對映服務。可以購買阿里雲或者騰訊雲的機器或者國外的vps,這是其次的方案。

透過網上提供的ngrok, frp的公共伺服器,獲取一個公網ip的對映埠。

限制

家庭寬頻預設情況下是禁用80/443/8080埠的。而且ip不固定,優點在於家庭寬頻的頻寬比較好,而提供服務時,主要依靠上行頻寬,例如本人家中100m的頻寬,上行頻寬35m左右。基本上可以滿足各種需求場景。所以這其實是最優解,至於埠限制,還有動態ip,其實都是有解決方案的。

vps或者雲主機的方式,如果受限於雲主機和vps的頻寬,例如那種10塊錢每月的乞丐版雲主機頻寬只有1m,稍微有流量需求的場景這點頻寬會讓你懷疑人生。如果用國外的vps,網路延遲優會比較大。體驗會很差。香港的網路質量會好一點。延遲沒那麼高。

內網埠對映: 這種方式所有流量都要走ngrok或者frp的服務端,訪問質量取決於服務端頻寬,免費的伺服器穩定性和頻寬都難保障,收費服務價格也並不便宜而且大多服務端由私人維護,跑路風險高。埠對映服務可以在自有的vps或者雲主機上自建。

二。 相關技術

科普

域名:想要建立對外的服務,使用ip的話當然是可以的,但是IP很難被記住,而且ip的變更頻次比較高,所以域名方式雖然不是必須的但是強烈建議,阿里雲和騰訊雲都有1塊錢一年的域名,可以買一個。

家庭伺服器:定義比較泛,理論上,任何提供服務的主機都叫伺服器,以下,都可以作為家庭伺服器:

筆者家庭伺服器為例,之前礦渣的時候淘的80塊一個n1盒子,4臺做叢集,穩定性很不錯,效能足夠家用,功耗一個月電費也就幾塊錢。已穩定執行127天,如果不是上次家裡停電,現在差不多已經持續執行1年了。

關於家庭寬頻場景下的服務暴露

關於家庭寬頻場景下的服務暴露

普通家用電腦,筆記本,pc等,功耗高,體積大,穩定性一般。

黑白群暉等。功耗普通,體積一般,價格高,穩定性好。

樹莓派等各種派,各種開發版,一些具備服務功能的路由器,電視盒,一些礦渣透過刷機手段提供linux系統可以部署服務的,例如n1盒子,蝸牛星際等等。體積小,效能低,穩定性存在差異,功耗低。

專業級的商用伺服器:戴爾/ibm/浪潮/華為等等。價格高,體積大,功耗巨高,噪音高,穩定性好,效能好。

動態解析:一個服務後端的ip地址存在不斷變化的可能,尤其是家庭寬頻申請的ip地址,幾乎每天都會變,解決這個問題,就需要不斷的更新域名和ip的關係,使透過域名能正確的訪問到正確的服務地址。3322/花生殼/dnspod/aliyun/騰訊雲都提供相關的免費服務。

顯式轉發:例如一個場景:家庭寬頻的埠不可用443/80/8080 所以在訪問你的web伺服器的時候,就需要在伺服器地址後面加上ip地址。這個時候域名解析可以選擇你固定一個地址,訪問的時候轉發到另一個地址,例如:將

http://www。

zhihu。com

轉發到

https://www。

zhihu。com:8090

,這樣就不用每次請求都加上埠號。

隱性轉發:原理其實就是html的frame,就是個嵌入頁面,只不過這個嵌入頁面佔用100%佈局,使用場景同上,隱性轉發可以隱藏掉位址列上的url,上面例子中,使用者訪問位址列還是會顯示為

https://www。

zhihu。com:8090

, 但是隱式轉發的話,位址列顯示的是

http://www。

zhihu。com

。隱形轉發變相的繞過了運營商的封鎖,同時可以完美利用家庭寬頻的高頻寬提供服務。唯一的缺點是隱性轉發不利於搜尋引擎收錄。如果你的服務是部落格的話,而且想要讓別人透過搜尋引擎找到你的話,這一點比較挫。目前國內的幾大域名服務商,阿里/騰訊/dnspod的隱性轉發都是個人不可用的情況,必須是企業認證併購買了相對比較昂貴的套餐才可以,筆者自己用golang開發了一個隱性轉發的服務,掛在香港的雲主機上供自己和朋友用。效果相當不錯。

反向代理:完全隱藏後端地址,透過代理的方式,去請求後段,同樣能繞開80/443的埠封鎖,問題是,服務頻寬受限於代理伺服器的頻寬。

埠對映:三種情況對號入座

1。 是指直接將公網ip的1個埠對映到家裡的伺服器,這個需要家庭寬頻有公網ip或者已經透過vpn打通網路的情況。

2。 是指運營商分配了公網ip,路由器需要設定埠對映或者dmz到家庭內網的伺服器中。

3。是指內網穿透的埠對映:目的是將內網服務對映到公網,受限於公網伺服器的頻寬,目前主流的就是上文提到的ngrok和frp。

三。 一些方案

透過隱性轉發將內網n1盒子上的服務暴露到公網

準備

家庭寬頻需要公網地址。可以嘗試聯絡運營商申請。筆者家裡的寬頻是移動的,當時是直接撥打10086申請到的公網ip。

n1盒子連線到路由或者家庭網路中。

做好埠對映或者直接設定dms主機到內網n1盒子。

n1盒子都直接插在路由器的lan口上,路由器撥號聯網。

路由器中的dmz設定為n1叢集的keepalived vip。

關於家庭寬頻場景下的服務暴露

域名解析需要隱性轉發的支援,國內基本都不能支援,使用國外的解析速度又慢,所以繼續用dnspod然後透過筆者自己開發並部署在香港雲主機上的域名轉發服務做隱性轉發。這樣連備案都免了。有隱性轉發需求的可以私聊我,送10條記錄。先到先得。

文章缺少一些圖,之後再補。

未完待續