2019年5月19日 星期日

NodeJs的HttpServer如何開出去給外網連?

先聲明一下0.0,網管非本人擅長領域,只是因為我用NodeJs寫Server,弊公司沒有這方面的老手,只好自己去摸索,以下開始紀錄探索過程~

目標:不透過第三方套件或者是雲端平臺,單純用電腦開一個WAN可以連的NodeJS based server。

首先結論是:

關鍵在中華電信的閘道器的後台(就是像鐵路便當大小的那台),運用NAT技術把LAN IP開給WAN連。

以下是探索過程的紀錄。

最初是用expose node.js server  on windows之類的關鍵字去找,發現到node的http.server.listen(port)後面還有一個argument可以填,這個參數的設置似乎會影響到這個ip的開通,以下是相關文章:

https://stackoverflow.com/questions/8325480/set-up-node-so-it-is-externally-visible
https://stackoverflow.com/questions/14043926/node-js-connect-only-works-on-localhost

有些地方提到ngrok,這之前我也查到過,不過跟目標相悖,就先不管。

結果呢,上面的東西不管我怎麼設置,我用我手機鍵入14x.xxx.xxx.xxx:8081(我設定的port,然後我是浮動ip,所以每隔一段時間都要重新找自己的ip)都連不上來,都是連線被拒絕的錯誤畫面,後來我就一時興起用電腦browser看一下只打14x.xxx.xxx.xxx會怎樣,結果會出現某個後台登入的網站,這個後台其實是中華電信閘道器的後台:
https://www.mobile01.com/topicdetail.php?f=110&t=5606425

進去玩一玩可以看到一些LAN、WAN,還有防火牆的配置,於是我利用這個後台作關鍵字查zyxel port expose:
https://businessforum.zyxel.com/discussion/1809/is-it-possible-to-expose-a-web-server-to-internet

在新的文章又有看到NSG NAT server之類的關鍵字,那回去後台翻一翻就翻到了NAT這個項目,這個NAT就是正解了,用這個就可以把自己查到的IPv4內網IP開出去,在這邊要開的port的範圍也可以自行設定,至於防火牆怎麼設就自己研究吧,反正為求減低測試變因,我把windows的防火牆跟這個後台的防火牆能關的先關了,是在這個狀況下成功的。

順便PO一下NAT的參考資料:
https://blog.pmail.idv.tw/?p=5165
我不是整個看,就是稍微了解NAT的用途而已(轉載自MIS的背影):

NAT伺服器可以讓內部私有IP網路透過一個public IP 及單一個網路介面,連結至網際網路

Windows Server 2012 NAT特點
1.支援多個內部網路私人IP網段,透過NAT主機連線至網際網路且只需要一個實體IP位址
2.支援DNS代轉查詢,替內部用戶查詢外部網域名稱及IP位址
3.支援DHCP功能發送IP至內部網路
4.支援TCP/UDP Port 對應,讓外部使用者可以存取內部伺服器,如web ,mail等伺服器

大概就是這樣~