使用Cloudflare Tunnel實現內網穿透,把服務器架在家里
Cloudflare Tunnel是Cloudflare零信任網絡的一個產品,用于打通企業、員工、設備之間的邊界,從而摒棄掉VPN之類的過時技術(其實也不是過時,只不過是相對來說安全性、可控性較差)
通過Cloudflare Tunnel,可以實現云與設備之間打通一條加密通道,這樣Cloudflare的CDN就可以很方便的通過這條加密通道訪問到部署在內網的服務,包括Web、SSH等。同時,還不用考慮電信、移動等ISP不提供固定IP地址、不能開放端口,甚至解決備案的問題。
而且,還免費。
所以,整套內網穿透的方案大致如下
前置條件
- 首先,你要有一個Cloudflare的賬號,并且添加了所需要使用的域名,同時,開通Cloudflare Zero TRust。
- 本地內網有一臺linux服務器。centos、Ubuntu、Debian都無所謂,樹莓派也沒問題。Web網站正常跑,內網能正常訪問。
安裝Cloudflared
Cloudflared是Cloudflare Tunnel的一個本地cli客戶端,可以實現管理功能和守護程序。
macOS可以用homebrew安裝
brew install cloudflared
Linux直接下載編譯好的二進制包安裝
curl -L 'https://Github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64' -o /usr/bin/cloudflared
chmod +x /usr/bin/cloudflared
登陸Cloudflared
使用前,我們需要先登錄
cloudflared tunnel login
輸入命令后,終端會給出一個登陸地址,我們拷貝到瀏覽器里面打開,選擇需要授權的網站。
[root@Web-Server-1]# cloudflared tunnel login
A browser window should have opened at the following URL:
https://dash.cloudflare.com/argotunnel?callback=https%3A%2F%2Flogin.cloudflareaccess.org%JLKY87tdfsakh-jlfsakjuo8sFFJ%3D
If the browser failed to open, please visit the URL above directly in your browser.
You have successfully logged in.
If you wish to copy your credentials to a server, they have been saved to:
/root/.cloudflared/cert.pem
注意:授權一次只能選擇一個網站。如果存在多個不同域名的網站,請授權完成后不要關閉網頁,點擊第二個、第三個要授權的域名,進行多次授權。
創建隧道
授權完以后,我們需要創建隧道。一般建議一臺服務器創建一個隧道。
cloudflared tunnel create <隧道名字>
# 比如
cloudflared tunnel create webserver-1
創建完以后,會輸出隧道的一個UUID,記錄下來
[root@Web-Server-1]# cloudflared tunnel create webserver-1
Tunnel credentials written to /root/.cloudflared/12345-123-123-123-12345.json. cloudflared chose this file based on where your origin certificate was found. Keep this file secret. To revoke these credentials, delete the tunnel.
Created tunnel webserver-1 with id 12345-123-123-123-12345
域名指向
接著,我們需要把域名指向到對應的隧道
注意:下面的命令只會對第一個授權的頂級域名生效,比如abc.com和*.abc.com。如果有多個域名,比如123.com、456.com,需要手工添加CNAME記錄。
cloudflared tunnel route DNS <隧道名字> <域名>
# 比如一級域名(和Web界面不一樣,不需要輸入@)
cloudflared tunnel route dns webserver-1 abc.com
# 又比如二級域名
cloudflared tunnel route dns webserver-1 www.abc.com
這時候,Cloudflare會自動添加一條CNAME記錄到對應的域名。
對于多個其他域名,我們需要登錄Cloudflare的Web控制臺,對應添加CNAME記錄,記錄值是
<隧道UUID>.cfargotunnel.com
比如
12345-123-123-123-12345.cfargotunnel.com
按照上面的說明和圖片,我們一條條記錄加好。
配置Cloudflared
接著,我們開始配置Cloudflared,先編輯一個配置文件
vim ~/.cloudflared/config.yml
輸入下面的內容(根據自己要求編輯)
tunnel: <隧道UUID>
credentials-file: /root/.cloudflared/<隧道UUID>.json
protocol: h2mux
ingress:
# 第一個網站,連接到本地的80端口
- hostname: <域名1.com>
service: http://localhost:80
# 第二個網站,https協議,連接到本地的443端口,禁用證書校驗(用于自簽名SSL證書)
- hostname: <域名2.com>
service: https://127.0.0.1:443
originRequest:
noTLSVerify: true
originServerName: <域名2.com>
# 第三個網站,8012端口,泛域名
- hostname: <*.域名3.com>
service: http://localhost:8012
# 第四個,反代MySQL sock服務
- hostname: <mysql.域名4.com>
service: unix:/tmp/mysql.sock
# 第五個,反代SSH服務
- hostname: <ssh.域名5.com>
service: ssh://localhost:22
- service: http_status:404
更多支持的服務和配置方式,參考幫助文檔:Supported protocols
配置完以后,我們測試下配置文件有沒有問題
cloudflared tunnel ingress validate
還可以再測試下規則是否命中
cloudflared tunnel ingress rule https://<域名1.com>
測試運行
如果沒問題,OK,一切妥當,我們開始測試
cloudflared --loglevel debug --transport-loglevel warn --config ~/.cloudflared/config.yml tunnel run <隧道UUID>
終端會輸出一大堆log,但沒有紅色報錯,那就沒問題。
我們登陸Cloudflare Zero Trust的Web控制臺,左邊選擇Access-Tunnels,可以看到隧道已經跑起來了,狀態是Active。
然后,我們在瀏覽器里面輸入域名,正常情況下,你可以看到網站已經可以正常訪問了。
創建系統服務
按下Ctrl+z,先停掉剛才啟動的服務。為了讓服務能每次系統啟動的時候都跟著啟動,我們需要把Cloudflared注冊成系統服務。不然系統一重啟,就歇菜了。
cloudflared service install
systemctl start cloudflared
systemctl status cloudflared
跑完這三條命令,應該就可以看到服務有正常輸出,并且Web控制臺也可以看到狀態是Active。
● cloudflared.service - cloudflared
Loaded: loaded (/etc/systemd/system/cloudflared.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2022-12-09 17:22:43 CST; 9s ago
Main PID: 37812 (cloudflared)
Tasks: 18 (limit: 407348)
Memory: 23.5M
CPU: 71ms
CGroup: /system.slice/cloudflared.service
└─37812 /usr/local/bin/cloudflared --no-autoupdate --config /etc/cloudflared/config.yml tunnel run
Dec 09 17:22:42 Web-Server-1 cloudflared[37812]: 2022-12-09T09:22:42Z INF Generated Connector ID: 12345-123-123-123-12345
Dec 09 17:22:42 Web-Server-1 cloudflared[37812]: 2022-12-09T09:22:42Z INF Initial protocol h2mux
Dec 09 17:22:42 Web-Server-1 cloudflared[37812]: 2022-12-09T09:22:42Z INF ICMP proxy will use 127.0.0.1 as source for IPv4
Dec 09 17:22:42 Web-Server-1 cloudflared[37812]: 2022-12-09T09:22:42Z INF ICMP proxy will use ::: in zone eno1 as source for IPv6
Dec 09 17:22:42 Web-Server-1 cloudflared[37812]: 2022-12-09T09:22:42Z INF Starting metrics server on 127.0.0.1:12345/metrics
Dec 09 17:22:43 Web-Server-1 cloudflared[37812]: 2022-12-09T09:22:43Z INF Connection 12345-123-123-123-12345 registered connIndex=0 ip=<nil> location=SJC
Dec 09 17:22:43 Web-Server-1 systemd[1]: Started cloudflared.
Dec 09 17:22:44 Web-Server-1 cloudflared[37812]: 2022-12-09T09:22:44Z INF Connection 12345-123-123-123-12345 registered connIndex=1 ip=<nil> location=HKG
Dec 09 17:22:46 Web-Server-1 cloudflared[37812]: 2022-12-09T09:22:46Z INF Connection 12345-123-123-123-12345 registered connIndex=3 ip=<nil> location=HKG
Dec 09 17:22:46 Web-Server-1 cloudflared[37812]: 2022-12-09T09:22:46Z INF Connection 12345-123-123-123-12345 registered connIndex=2 ip=<nil> location=SJC
注意:創建系統服務后,配置文件會被拷貝到
/etc/cloudflared/config.yml,后續修改配置必須修改新文件
總結
如果有多臺服務器,那么可以在不同的服務器安裝多個Cloudflared,配置多個Tunnel。
ref https://blog.upx8.com/3570