/

不用任何工具!內網穿透至自己的域名下

前言

不久前才寫了一篇 用 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)

架構

1

開工

首先先在 /etc/nginx/sites-available 下新建設定檔,檔名建議用你的 virtual host 來命名,在這邊以 reverse 舉例

/etc/nginx/sites-available/reverse:

1
2
3
4
5
6
server {
server_name reverse.yiyu0x.tk; #改為自己的 domain
location / {
proxy_pass http://localhost:5487/; #設定為內網任意 port,到時候用來打 reverse ssh
}
}

設定完畢之後,記得 ln -s/etc/nginx/sites-enable 並且重新啟動 nginx (啟動前可以用 nginx -t 來檢查是否有語法錯誤)

(如果你的內網穿透需要 https,可以用 certbot 來輕鬆幫你新增免費憑證並且管理憑證)

做到這邊已經完成了一半,接下來就剩下打通道了!

ssh -R 5487:localhost:1234 user@domain.com

前面的 5487 代表遠端的 port,看你前面設定多少這邊就用多少,因為要與 VPS 上開的 port 綁定,所以建議設定一組自己記得起來的,記得遠端的防火牆要打開!

但是指令這麼長,非常難記憶,如果這篇文章只有這樣子我想大家還是會回去用 ngrok 或是 serveo.net。

在使用 ssh 服務時,可以使用金鑰來達成免密碼登入。以及在 ~/.ssh/config 下新增設定來簡化登入 ssh 流程

例如:

1
2
3
4
Host          #自行設定想要的名稱
hostname #vps ip 位置
user #遠端使用者名稱
IdentityFile #私鑰位置

設定完畢之後,指令可以簡化為

ssh -R 5487:localhost:1234 vps-name

但是這樣還是不夠好!我們在 local 的 port 可能會因為每一個服務不同而需要穿透不同的 port。

於是我們可以透過修改 ~/.bashrc 來設定 alias

1
2
3
4
alias rev-ssh='rev-ssh'
function rev-ssh() {
ssh -R 5487:localhost:$1 y-gcp
}

設定完之後,記得下 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 正式再見。再也不會因為這兩家服務掛掉而沒有辦法穿透內網了!

參考