很多時候在內網有架設許多服務,需要對外連線的時候大多會使用 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).