(網路上可以找到很多 Cloudflare Zero Trust Tunnel 的教學,方法也很多,我也是參考了很多文章才設定完成,這裡純粹是紀錄自己確實有成功的方法,也避免以後如果自己有重新設定的需求時有個文章可以參考)

一、前言

先給大家看一下我家的網路架構(應該比大多數人的家用網路還複雜吧XD)

我家是使用社區網路,所謂社區網路,就是由社區網路公司分配一個虛擬 IP 給你,讓你透過這個虛擬 IP 上網。雖然費用便宜,但因為外部網路與自己架設的 NAS 中間經過了社區網路公司的路由器,是你沒辦法完全控制的設備,需要向社區網路公司申請指定的連接埠轉發,才能從外部網路連入自己架設的 NAS。

然而,一些規範預設的連接埠號(例如 http/https 所對應的 80/443),社區網路公司就不太可能開放給你使用,這時就算你想要以這些連接埠連線,再反向代理到內部 NAS 的服務,也是辦不到了(當然,用社區網路公司開放給你的對外公開連接埠,再透過反向代理伺服器,連入內部 NAS 沒有對外開放的連接埠還是做得到的,但在輸入網址時,就得加上你的公開連接埠才行)。

這時可以利用 Cloudflare Zero Trust Tunnel 的服務,在 Cloudflare 與 NAS 之間透過唯一的 Token,建立專屬通道,不需要對外的連接埠,也能從外部網路連入自己架設的 NAS。

二、前置作業(這裡相對簡單,網路上教學很多,就不詳述教學了)

1.你需要一個域名,而且能夠設定名稱伺服器(DNS)給 Cloudflare 代管。

2.註冊 Cloudflare 帳號,並將你的域名放在 Cloudflare 上託管。

3.在 NAS 中,從套件中心安裝Container Manager。

三、設置教學

(一)創建 Tunnel

1.進到 Cloudflare 的儀表板主頁,點一下左邊的 Zero Trust。

2.第一次使用會要你設定一個團隊名稱及選擇計畫方案,團隊名稱可以隨意設定,計畫方案選擇「免費」即可(目前免費計畫就有提供相關功能)。

(這裡因為我已經辦過了,沒有相關截圖可以提供,如果真的需要圖片參考可上網搜尋其他的教學文)

3.完成後,在 Zero Trust 的儀表板內,選擇左邊的 Networks-Tunnels,然後點 Create a tunnel

4.Select your connector 選擇 Cloudflared,然後下一步

5.Tunnel name 輸入名稱(自訂),然後儲存 Tunnel

6.我們選擇 Docker 的安裝方式,然後會產生一串可以複製的指令(其中包含專屬的 Token),先將這串指令複製起來備用

創建 Tunnel 部分先到這邊,後面 Route tunnel 步驟稍等再做

(二)在NAS上安裝Cloudflare

1.開啟 Container Manager,進入「倉庫伺服器」,搜尋 cloudflare,下載 cloudflare/cloudflared 的映像檔(標籤選擇 latest 即可)2.進入「容器」,點「新增」3.映像檔選擇剛剛下載的 cloudflare/cloudflared:latest,容器名稱可自訂,並勾選「啟用自動重啟」,然後下一步4.在進階設定部分,網路要選擇「host」,指令部分要輸入 tunnel run –token xxxxxxxxxx,將 xxxxxxxx 替換成剛剛從 cloudflare 獲得的 Token,其餘保留預設即可,然後下一步、完成,啟動容器(三)設定 Tunnel

基本上到這邊就可以了,不論你在外網或內網,都能夠用你在 Tunnel 所設定的網址連到指定的服務,不過對內網來說,還有可以精進的地方,有興趣的話可以繼續往下看1.容器啟用後,可以先回到 Zero Trust 的儀表板,確認剛剛創建的 Tunnel 是否運作正常,在 Status 顯示綠色的 HEALTHY 表示成功連線,我們可以點右邊的 3 個點,進入 Configure 進行設定2. 假設我們現在要連到 NAS 上 File Station 的登入頁面,先到 NAS 的控制台確認 File Station 的登入入口連接埠為 7000/7001 (http/https)3.進入 Tunnel 設定頁面後,點 Public hostname,然後新增一個 public hostname4.輸入子域名、主域名,以及內網服務的位址,然後儲存 hostname以這裡的範例就是,對外使用 https://file.example.com 這個網址,連到 https://localhost:7001 (File Station) 內網網址5.在瀏覽器輸入 https://file.example.com,就能夠開啟 File Station 的登入入口了6.如果你內網使用 https 位址時,tunnel 連線出現問題,在 Additional application settings 的TLS 設定裡,把 No TLS Verify 選項開啟,讓 Cloudflare 接受任何來自原始伺服器的憑證

(四)自架 DNS 以內網 IP 反向代理至指定 NAS 服務

我們先看一下目前的連線路徑,假如我要從 PC2 連到 https://file.example.com,連線路徑如下

可以發現,明明我要連的服務就在同一個區網內,我卻要繞一大圈才能連到它,這樣連線速度肯定會受到影響。

就好像鄰居就在你隔壁,你想要找他講話,要先打電話去查號台詢問電話號碼是多少,然後再打電話給鄰居,而不是直接去找他。

這時我們就需要自架一個 DNS 伺服器,將 https://file.example.com 解析到 NAS 的內網 IP,再透過反向代理伺服器轉址到 https://localhost:7001。所幸 Synology NAS 的套件中心有提供 DNS Server,可以將 NAS 本身變成一個 DNS 伺服器。

1.在套件中心下載並安裝 DNS Server

四、結語2.開啟 DNS Server,在「轄區管理」的地方,新增一個「主要轄區」3.網域類型選擇「正向網域」,網域名稱輸入自己的網域名稱(同前面 Cloudflare 所託管的主網域),主 DNS 伺服器輸入 NAS 所使用的內網 IP(這邊舉例 192.168.0.200)4.新增之後,對轄區點右鍵,選擇「資源紀錄」5.新增一個 A 類型,名稱留空(表示根網域),IP 位址輸入 NAS 的內網 IP,然後儲存(表示example.com 這個網址解析成 192.168.0.200)6.再來可以有 2 種方式(2 擇 1 就好,差別補充在最後面)6-1.新增一個 A 類型,名稱部分輸入要用於連線的子域名(本篇範例為 file.example.com),IP 位址輸入 NAS 的內網 IP6-2.新增一個 CNAME 類型,名稱部分輸入要用於連線的子域名(本篇範例為file.example.com),正規名稱輸入主域名(對應前一個步驟的根網域)這 2 種方式,都可以將 file.example.com 解析成 192.168.0.200到這邊為止,DNS 可以把 file.example.com 解析成 192.168.0.200,但是我們 File Station 的登入入口連接埠並不是 80 或 443(http/https),只有這樣單獨輸入 file.example.com 還是找不到,所以需要設定反向代理,將這個來源的網址轉成目的地的 IP 及連接埠。7.進入 NAS 控制台的「登入入口」,點選進階,開啟「反向代理伺服器」的設定頁面8.反向代理名稱自訂,來源設定我們要設定連線的網址對應前面 DNS 所設定的網址就是 file.example.com,連接埠 443 為 https 預設的連接埠(輸入網址時可省略),啟用 HSTS 則是強制轉為加密傳輸(http 強制轉為 https 連線)9.目的地設定為內網服務的 IP 及連接埠,本篇範例為 localhost:700110. 最後需要將你電腦裡網路設定的 DNS 伺服器,指向 NAS 作為你的 DNS 伺服器以上就全部都設定完成了當你在內網要連線 https://file.example.com 這個網址時,連線路徑就會變成如下不再需要經過外部網路的連線,可以直接在內網訪問 NAS 了

多虧 Cloudflare 提供的 Zero Trust Tunnel 服務,即使是使用社區網路,讓我能夠在外面使用設定好的網址進行連線,不需要跟社區網路公司申請開放連接埠,自己的路由器也不需要設定連接埠轉發,真的非常方便。

雖然很多人都說,社區網路不太適合架設伺服器,因為限制比較多,但是那個價格實在是太太太…香了,而且前陣子也免加價全面升級至雙向 300M,對我的使用需求來說已非常足夠。只要找對方法、設定完成,即使是在社區網路後面架設伺服器,大多數的體驗跟自己向 ISP 業者申請網路是差不多的。

這套連線方式只要學會如何設定,在 NAS 上新增其他的服務、Docker 容器等等,幾乎都可以如法炮製,達成外網可以用自己的網域穿透連線,而內網使用同樣的網址也能夠以內網直接訪問不須繞一大圈。

備註:

1.在(四)之6的步驟,新增 A 類型 與 CNAME 類型差在哪呢?

A 類型是將域名指向指定的 IP、而 CNAME 則是類似別名的概念,將一種域名解析成另一種域名

在本篇的範例中,我們的目的是要將 file.example.com 解析成 192.168.0.200,而且我們在(四)之5有用 A 類型將 example.com 指定為 192.168.0.200

(四)之6-1 A 類型的概念就是 file.example.com = 192.168.0.200

而 (四)之6-2 CNAME 的概念就是 file.example.com = example.com = 192.168.0.200 (前提就是要有一個 A 類型去解析 example.com 的 IP)

如果你有多個子網域都等於 192.168.0.200,那麼你可以用 CNAME 將多個子網域都設定為 example.com,這樣當 example.com 的 IP 位址有更動時,你只要修改 example.com 的 A 類型位址,所有對到 example.com 的 CNAME 類型都會跟著變動,不須要一個一個重新設定。

2.在(四)之7的步驟,這裡的反向代理伺服器純粹是為了內部連線轉址而設定的,因為網路環境中的路由器(不論家用還是社區網路公司的)都沒有開放 80/443 的連接埠。再者,Cloudflare 的 DNS 紀錄中,也沒有 file.example.com 的 A 類型去導向你的真實 IP 位址,在外部公開網路中,不會被解析到你的真實 IP 位址,而是會由 Cloudflare 代理被解析之後,再透過 Tunnel 連到 NAS。

3.在(四)之10的步驟,要設定 DNS 伺服器為 NAS 的部分,網路上有的教學是會直接修改路由器中的 DNS 伺服器至 NAS 的 IP位址,以免造成 DNS 混亂,也可以讓其他連線於這台路由器的設備直接套用,不需要每一台都設定一次,這確實是最理想的方法。但是 DNS 的訪問方式是「向上」訪問,以我的網路架構來看,NAS 對路由器來說,是屬於「下游」設備,我沒辦法在路由器上將 NAS 設定為 DNS 伺服器,路由器會出現「DNS伺服器IP位址與LAN IP位址不可以在相同的子網路內」,所以只能將連限於這台路由器的設備,一個一個設定 DNS 伺服器。

4.可以利用 nslookup 指令,檢查 DNS 伺服器設定前後,對於網域解析的結果,以確認內部 DNS 伺服器有正確運作。

如果自架 DNS 有成功,結果會如下(我自己 NAS 實際在用的內網網址為 192.168.0.110)

如果沒有自架 DNS,或自架不成功,結果會如下