緣起

目前 NOJ 的後端服務是放在師大資工系上提供的機器內,而校內機器都會經過 Firewall,導致所有連接到 port 22 的 connection 只能從 140.122 的網段內發起。在畢業以前我們會透過 VPN 連回學校內部再 SSH 上機器,現在主要 Maintainer 幾乎都畢業了,在校內架設 VPN 或是內網穿透的服務的需求越來越大。

在尚未畢業時也在機器上偷架過 VPN,但多了 VPN,就多了一個服務要維護,有時候臨時 VPN 壞掉就完全無法處理問題

內網穿透的服務

除了 VPN 外,能讓我們 SSH 上機器的另外一個方法是使用內網穿透的服務,像是 ngrok 或是這篇文章使用到的 Cloudflare Tunnel 都是可行的方法,這種內網穿透的服務可以讓我們在外網連入沒有 public ip 或是像我們這樣被防火牆阻隔的機器。其中 Cloudflare Zero Trust 的 Tunnel 有更彈性的設定像是:

  • 身分驗證透過
    • Email One Time Password
    • SSO (e.g. GitHub) 驗證
  • 強制流量必須經過 Zero Trust 的 VPN,保證連線的安全
  • Web based SSH
  • etc

服務架設

在 Cloudflare 主頁面中左邊有個 Zero Trust

進入後按照要求建好團隊,並設定好帳單資訊,接下來點擊 Tunnel

接下來是重頭戲,要在被內網穿透的機器上安裝 cloudflared,選擇正確的平台照著操作即可

ps. 這是測試用,不是我們實際使用的 token XD

設定 public hostname,讓大家可以直接連上:

這樣 tunnel 的部分就設定完成了,接下來要設定 Access > Application > Add Application,選擇 Self Hosted

最後一步的地方可以選擇 Browser rendering,這樣就可以有 Web based SSH/VNC 可以使用

接下來可以設定一些比較方便管理權限的地方:

  • Settings > Authentication 可以新增驗證的方式,我是在這邊新增 GitHub 的
  • Access > Accessed Groups 可以新增群組,我在這邊設定了有權限使用 SSH 的管理者們

成果

另外,如果要在 terminal 用指令 ssh {server-domain} 連接上機器需要自己寫 ssh config 並安裝 cloudflared

config example

Host {your-prefered-name}
  HostName {your-domain-here}
  ProxyCommand cloudflared access ssh --hostname %h

然後透過 ssh {your-prefered-name} 的指令連接上機器

後記

Cloudflare Zero Trust 真的佛心來的,不僅有免費的內網穿透,在連線的時候還會透過 Cloudflare 廣大的 Server 自動幫你轉換比較好的 routing path (TPE 可能未必,不過我是都有拿到 TPE 的節點),Zero Trust 還自帶免費的 VPN,用 Google 設定中文搜尋可以看到不少「國人」拿來白嫖當作翻牆手段。

這個 blog 睽違了八個月終於有新文章(汗)

Ref: