有時候會需要從外部網路測試網頁或RESTful API的效果,但是Web伺服器架設在內部網路,通常我是ngrok這套方便的工具來達成。
ngrok只要從官網下載程式到伺服器上,再執行一個指令,也就是 ngrok http xxxx => xxxx 就是local開發的port
啟動成功之後,畫面會有兩組URL,其中一個是https,所以對於測試而言是非常快速且便利。
最近在網路上看到reverse ssh tunnel的技術文件,加上我在Cloud上有一台nginx的反向代理伺服器,所以就順著文件來模擬ngrok。
Cloud上的nginx是:test1.twtnn.com
內部的伺服器是:192.168.10.10:2222
在ngrok的設定檔新增一個伺服器設定檔如下,並重啟 nginx:
server {
server_name test1.twtnn.com;
location / {
proxy_pass http://localhost:17777/;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
其中proxy_pass就是當連線test1.twtnn.com時會轉送到http://localhost:17777
如果nginx與你的local server間使用的 https則可以加上proxy_set_header X-Forwarded-Proto https;
接著在內網的伺服器設定reverse ssh tunnel,因為Cloud是用private key登入的,所以要加上-i
$ ssh -R 17777:localhost:2222 -i privte.key account@test1.twtnn.com
-R可以讓test1.twtnn.com上面的port:17777反向連入內部本機的port:2222
接著在瀏覽器開啟網址:http://test1.twtnn.com ,就可以瀏覽內部的網頁了。
如果想要使用https,這時候在nginx上面,使用certbot來設定https,憑證則可以使用 Let's Encrypt來免費取得,網路上有許多的教學,下次再找時間實做一下。