很多時候在內網有架設許多服務,需要對外連線的時候大多會使用 Port forwarding 來達成,在這邊使用 Cloudflare Tunnel 來達成,不需要在 Router 上做 Port forward,還可以透過 Email OTP 的方式來做雙因子驗證,不僅提高了方便性也提升了安全

在內網的 NAS, Git server, Virtual Machine Manager 都可做使用

Gitea

gitea 跟 gitlab 比起來輕巧許多,用 mirror 來把一些 github 上隨時有可能會消失的傳案備份很方便

使用 docker 安裝可以參考 https://docs.gitea.io/en-us/install-with-docker/

這邊給出一些個人有在使用的config

  • 讓 gitea 可以方便搜尋程式碼
[indexer]
REPO_INDEXER_ENABLED = true
  • 客製化頁面顯示的 URL 跟 listen port,landing page 假如沒有登入的話一開啟也可以直接指定登入頁面,就不會 Gitea 的首頁
[server]
PROTOCOL         = https
DOMAIN           = git.test.tw
SSH_DOMAIN       = git-ssh.test.tw
SSH_LISTEN_PORT  = 11022
HTTP_PORT        = 3000
ROOT_URL         = https://git.test.tw
ENABLE_GZIP      = true
LANDING_PAGE     = login
  • 把頁面底部的一些資訊、版本跟載入時間拿掉
[other]
SHOW_FOOTER_BRANDING = false
SHOW_FOOTER_VERSION = false
SHOW_FOOTER_TEMPLATE_LOAD_TIME = false

詳細的設定可以參考: Gitea Configuration Cheat Sheet 自行客製化

Setup Cloudflare Tunnel

Run Cloudflared Service

首先必須有一個掛在 Cloudflare 上面的 Domain,在側邊欄的地方找到 Zero Trust

打開以後找到 Tunnel

取完名子後,可以選擇你想要跑 Tunnel 服務的平台,我習慣跑在 docker 上,可以依照 commnad 貼上就好,也可以依照習慣加上 --restart=always-d 參數

docker run --restart=always -d cloudflare/cloudflared:latest tunnel --no-autoupdate run --token [your_token_here]

如果是 synology 的話,可以在進階設定指定 command,就把 image 後面那串貼上去就好

假如成功可以看到 Tunnels 頁面 Status 為綠色的 ACTIVE

Add Tunnel

把 Subdomain 填一填 下面看要轉啥 Service,有很多不同的協定可以選,例如:https, http, ssh, RDP,後面的 URL 填內網的主機跟端口位置

假如想用 git ssh clone,協定就選 SSH 後面接 ip:port

注意:假如有 HTTPS 私人憑證的話可以選 No TLS Verify 讓 Cloudflare Tunnel 可以順利連線

增加成功以後,應該可以看到 Domain DNS 自動多加了 CNAME

這時候直接連連看應該就可以了

Auth

有些服務可能掛了 Auth 不是很方便,可以自行調整決定,git 的 web 沒測試過可玩玩看,不知道用 https clone 會不會有問題

經過上述的設定 http/https 的服務就可以對外了,假如想在加一層保護的話可以使用 Access - Application 的功能,增加一個 Self-hosted 的 Application,設定 Subdomain

之後增加 policy,在這個應用的範圍內(subdomain)需要怎樣的規則可以在Configure rules增加,可以選 email 就會在驗證頁要求你輸入 OTP 才可以登入,另外還有 IP rage, Country, Token 的方式玩法很多,可以自由組合規則

最後存取的時候應該就可以看到要輸入 email 認證的頁面

Git ssh

在經過 tunnel 的設定進去 Gitea 應該可以看到漂亮的 clone address

via https
https://git.test.tw/mirror/Windows-Exploit-Suggester.git

via ssh
[email protected]:mirror/Windows-Exploit-Suggester.git

不會有醜醜的 IP 或是 port 號了

這邊要注意因為有轉發 ssh 的關係所以在 local ssh config 要再多做設定,在本機 client 端要安裝 cloudflared,可以使用簡單的 homebrew 或 scoop 來安裝

編輯 加目錄下的 ~/.ssh/config 加上 ProxyCommand 串接 cloudflared,這時候去用 ssh clone 就會正常了

Host git.test.com
  ProxyCommand cloudflared access ssh --hostname %h

如果過程中有不順也可以參考 Cloudflare官方文件 Zero Trust GitLab SSH & HTTP

In The End

Cloudflare Tunnel 可以轉發內網的許多服務又不用開 port forwarding 真是個好東西,搭配 Zero Trust 的概念保護資產,家裡的 NAS 重要服務都可以受到保護又可以方便存取

還有超多玩法可以直接開 web terminal 存取內網 SSH Service,可以參考youtube 影片 HOW TO: Remote access a Raspberry Pi using a Cloudflare tunnel (node-red and ssh).