--- lang: zh-tw --- # Cloudflare Tunnel 內網穿透設定教學 [TOC] --- :::info ### 【**內網穿透**】 透過「軟體」上的設定,模擬「硬體」上同一個區域網,或是建立公網與內網的連線。 ::: ## 起因 由於 iPv4 數量有限,為此分隔出區域網與公網的概念,卻也因此導致由外向內訪問變得更加困難。以下是常見的方法與工具。 :::spoiler 詳細內文 由於 iPv4 數量有限,所以衍伸出 NAT 機制,分隔出區域網與公網的概念,雖現今已有 iPv6 容納更多數量的裝置,仍舊受限於相容性,導致至今仍無法普及。 若伺服器僅提供 iPv4 連線,使用 iPv6 的客戶端將無法連上伺服器。你可能想說,那就先嘗試 iPv6,如果連不上再換成 iPv4。但我們無法確定連不上的標準,可能伺服器延遲極高,若為此重新發送新封包也會同樣導致連線延遲上升。一個網站的封包若有十幾個,會導致2至3倍以上的延遲時間。 內網穿透就像是為內網分配一個公網 IP (通常是 iPv4),確保可以接受來自所有協定的請求。 ::: ## 常見的方法 1. **建立**中央數據交換中心 2. 伺服端主動向數據中心**建立連線** 3. 保持連線**通道開啟**,等待客戶端 4. 客戶端連線至中心,由中心**轉發**至與伺服端的通道 5. 伺服端處理完後,發送訊息至通道,再由中心轉發至客戶端 ## 常見的工具 * 虛擬 VPN * [ZeroTier](https://www.zerotier.com/) * [Radmin (Windows Only)](https://www.radmin-vpn.com/) * [Hamachi (Stability Issues / Member Limit)](https://vpn.net/) * FRP 穿透 (Fast Reverse Proxy) * [Sereo (超好用)](https://serveo.net/) * [ngrok](https://ngrok.com/) * [cpolar (Security Issues)](https://www.cpolar.com/) * [LocalTunnel](https://theboroer.github.io/localtunnel-www/) * [PageKite](https://pagekite.net/) * [Cloudflare Zero-Trust Networks Tunnels](https://www.cloudflare.com/zh-tw/products/tunnel/) ![image](https://hackmd.io/_uploads/BkNLzxtCp.png) 圖片來源 [YouTube](https://youtu.be/sz9kxynHZYU?si=4VXyR6mR1mlMyOy2&t=60) ## Cloudflare Tunnels 以下是透過 Cloudflare Tunnels 的使用心得,若本身已經有掛載在 Cloudflare 上的網域,則可免費使用。同時也會經過 Cloudflare 的 Proxy,多少能緩解流量或惡意攻擊。 ### 透過網頁設定 :::spoiler #### 1. 在購買網域的供應商管理頁面設定名稱伺服器(NameServers) 至 Cloudflare ![image](https://hackmd.io/_uploads/Hk41XltCa.png) --- #### 2. 在 Cloudflare Tunnels 面板中下方的點擊 \[Add a tunnel\] ![image](https://hackmd.io/_uploads/Sy6rBgFCT.png) --- #### 3. 使用建議的 Connector \[Cloudflared\],\[按下 Next\] ![image](https://hackmd.io/_uploads/H1odBeKRa.png) --- #### 4. 取個名字,按下 \[Save tunnel\] ![image](https://hackmd.io/_uploads/S1QUUgY0T.png) --- #### 5. 透過提供的 Command 在伺服器端安裝 Connector ![image](https://hackmd.io/_uploads/H1I_8lF06.png) --- #### \*6. 若出現以下錯誤,代表此裝置已經有綁定 Tunnel 了,參考下個步驟解除綁定 ![image](https://hackmd.io/_uploads/Bk_gDltAp.png) --- #### \*7. 輸入 `sudo cloudflared service uninstall` ![image](https://hackmd.io/_uploads/BkYcvxFA6.png) --- #### 8. 再次安裝即可成功 ![image](https://hackmd.io/_uploads/ByrdDeKA6.png) --- #### 9. 可以注意到網頁下方出現了 Connectors 連線資訊 ![image](https://hackmd.io/_uploads/rk4BDlFRT.png) --- #### 10. 點擊 Public Hostname 目錄,點擊 \[Add a public hostname\] ![image](https://hackmd.io/_uploads/H1fxOgYR6.png) --- #### 11. 以我的設定,行為是 testfrp.xserver.tw => http://localhost:8080 。注意後方的 Path 不能亂設定,可能會導致伺服器解析出問題。之後會透過 Python http.server 做測試,若設定了 Path 將無法正常訪問 (註1) ![image](https://hackmd.io/_uploads/BymfOgF0a.png) --- #### 12. 將伺服器開啟 `python3 -m http.server 8080` ![image](https://hackmd.io/_uploads/BJ8SOeK0T.png) --- #### 13. 成功訪問網頁 ![image](https://hackmd.io/_uploads/By6DugF0p.png) --- ### 註1 若設定了 Path,則請求限制將變為 http\[s\]://HOST/PATH/* ,若不滿足此格式,連線請求將不被代理! 可以變相限制可訪問的目錄路徑 #### 1-1. 以下附圖,連線請求網址必須為 http\[s\]://testfrp.xserver.tw/mbp/* ![image](https://hackmd.io/_uploads/BkG5M_t0p.png) --- #### 1-2. 若 mbp 子目錄不存在 ![image](https://hackmd.io/_uploads/By8vQuYRp.png) --- #### 1-3. 若 mbp 目錄存在 ![image](https://hackmd.io/_uploads/BJalmdt0T.png) ::: ### 透過 CLI 快速建立 PublicHost 由於是快速建立,便不需要Token或登入 ::::::spoiler #### 1. [安裝](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/) Cloudflared Linux: [點開網址找對應架構](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/downloads/#linux) macOS: `brew install cloudflared` Windows: `winget install --id Cloudflare.cloudflared` Docker: `docker pull cloudflare/cloudflared` #### 2. 透過隧道建立 PublicHost `$ cloudflared tunnel --url localhost:8080` 如下圖 iPv4 為 https://petersburg-specifically-verde-partnerships.trycloudflare.com ![image](https://hackmd.io/_uploads/rJzCyFYCp.png) :::warning 若要在 CLI 中設定域名重定向,需要額外提供 ssl 憑證才可使用。 ::: #### 3. 便利性低,不如在DNS設定網站上更改(名稱為 UUID、需開啟 Proxy)。 ![image](https://hackmd.io/_uploads/H1VtlFKRa.png) :::::: --- ### 當 Tunnel 綁定好後,便可添加多個 Public Host ![image](https://hackmd.io/_uploads/HJ1hrdY06.png) --- > [name=XinShou] --- ###### tags: `Tutor` `Cloudflare` <style> .markdown-body p { font-size: 18px; } </style>