479 字
2 分鐘
沒有Public IP也能架站(2) — Cloudflare Tunnel
2023-04-04
無標籤

上一篇說到使用ngrok不需要public IP,就能將服務放到外網上,但若要使用自己的Domain就得加入付費方案,今天來說明該如何透過Cloudflare Tunnel做到。


Cloudflare Tunnel#

Cloudflare Tunnel前身為Argo Tunnel,是Cloudflare在Zero Trust上提供的免費Tunnel,我們也可以透過他將我們的服務掛到Cloudflare上的Domain,而不需要用到public IP。


流程#

我們透過以下步驟,將我筆電80 port的服務暴露在網路上。

  1. 建置服務
  2. 安裝cloudflared
  3. 註冊、設定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,也可以減少被攻擊的機會。