前言
不久前才寫了一篇 用 serveo 來穿透內網吧,結果馬上就要打臉自己了 👋
上一篇文章提到 serveo.net 比起 ngrok 可以自訂 sub domain ,更加方便(不會每一次產生網址都像一堆亂碼一樣不方便記憶)。但是自己在這一陣子使用下發現,serveo.net 的網站似乎常常掛掉,而且打通 reverse ssh 的速度似乎沒有 ngrok 來得快!
但是他的指令 ssh -R 80:localhost:3000 serveo.net
讓我讓我靈機一動,反正都是 reverse ssh。只要有自己的 domain 以及自己的 vps,我也能自己架設。
設定好 domain 再使用 reverse proxy,等到需要時再打一條 reverse ssh 似乎也不是多困難的事,憑證的事情交給 certbot 解決就好。
事前準備
- VPS
- Domain
- NS server 設定一組 A record 指向 VPS
- nginx (用來做 reverse proxy)
架構
開工
首先先在 /etc/nginx/sites-available
下新建設定檔,檔名建議用你的 virtual host 來命名,在這邊以 reverse 舉例
/etc/nginx/sites-available/reverse:
1 | server { |
設定完畢之後,記得 ln -s
至 /etc/nginx/sites-enable
並且重新啟動 nginx (啟動前可以用 nginx -t 來檢查是否有語法錯誤)
(如果你的內網穿透需要 https,可以用 certbot 來輕鬆幫你新增免費憑證並且管理憑證)
做到這邊已經完成了一半,接下來就剩下打通道了!
ssh -R 5487:localhost:1234 [email protected]
前面的 5487 代表遠端的 port,看你前面設定多少這邊就用多少,因為要與 VPS 上開的 port 綁定,所以建議設定一組自己記得起來的,記得遠端的防火牆要打開!
但是指令這麼長,非常難記憶,如果這篇文章只有這樣子我想大家還是會回去用 ngrok 或是 serveo.net。
在使用 ssh 服務時,可以使用金鑰來達成免密碼登入。以及在 ~/.ssh/config
下新增設定來簡化登入 ssh 流程
例如:
1 | Host |
設定完畢之後,指令可以簡化為
ssh -R 5487:localhost:1234 vps-name
但是這樣還是不夠好!我們在 local 的 port 可能會因為每一個服務不同而需要穿透不同的 port。
於是我們可以透過修改 ~/.bashrc
來設定 alias
1 | alias rev-ssh='rev-ssh' |
設定完之後,記得下 source ~/.bashrc
來讓 bash 重新讀取一次設定檔
如此一來,指令簡化為 rev-ssh
驗收
可以透過 python3 -m http.server 6666
在當下目錄開一個 http 服務來瀏覽檔案
再使用 rev-ssh 6666
來將 local 的 6666 port 打一條 reverse ssh 至自己的 vps(按照我以上的設定就是 reverse.yiyu0x.tk)
現在就可以與 ngrok 和 serveo.net 正式再見。再也不會因為這兩家服務掛掉而沒有辦法穿透內網了!