上一篇說到使用ngrok不需要public IP,就能將服務放到外網上,但若要使用自己的Domain就得加入付費方案,今天來說明該如何透過Cloudflare Tunnel做到。
Cloudflare Tunnel
Cloudflare Tunnel前身為Argo Tunnel,是Cloudflare在Zero Trust上提供的免費Tunnel,我們也可以透過他將我們的服務掛到Cloudflare上的Domain,而不需要用到public IP。

流程
我們透過以下步驟,將我筆電80 port的服務暴露在網路上。
- 建置服務
- 安裝cloudflared
- 註冊、設定Cloudflare
1. 建置服務
我在筆電的環境使用NGINX的80 port當作範例,下圖看出我的服務監聽在127.0.0.1:80上。
使用Docker建置NGINX指令:docker run -p 80:80 -d nginx

2. 安裝cloudflared
我們需要安裝cloudflared作為agent,參考官網的安裝方法,支援Windows、macOS、Linux。
3. 註冊、設定Cloudflare
我們會先需要將Domain掛到Cloudflare之上,在Cloudflare後台找到Zero Trust並點進去。

點選Access > Tunnels > Create a tunnel

隨便輸入名字

將下面指令貼到電腦上,來完成註冊

、
下一步,輸入目標的網域,Service設定http://127.0.0.1,若是內網有其他伺服器,也可以輸入其他內網IP。

這樣就完成了

如果你的設備註冊過cloudflared,要重新綁定新的網域,請先輸入sudo cloudflared service uninstall。
docker compose
如果服務是在docker compose裏面,也可以把cloudflared放到docker裏面,docker-compose.yml範例如下,這邊以nginx為例,並參考官網說明放入cloudflared。並放入上面產生的那一串token字串貼到TUNNEL_TOKEN。
version: "3.9"services: nginx: image: nginx:latest expose: - 80 cloudflared: image: cloudflare/cloudflared:latest command: tunnel run environment: - TUNNEL_TOKEN=XXXXXXXXX在Cloudflare後台輸入目標的容器名稱,如http://nginx。

docker-compose up -d 後就可以啟動服務跟cloudflared了。
結語
Cloudflare Tunnel比ngrok更簡單方便,還可以自定義網域,而且沒有Public IP,也可以減少被攻擊的機會。