教學 筆記 機器學習 程式設計 服務架設
用 Cloudflare Tunnel 打通 Synology NAS
更新於8個月前
本人近日終於下定決心購入 Synology 的 DS723+ NAS,除了有在家裡訪問的需求以外,也希望可以在外面也有辦法直接連回家中。如果要辦到以上需求,除了使用 Synology 提供的 QuickConnect 功能以外,也可以直接利用 DDNS 或公用 IP、架設 VPN 伺服器來建立虛擬私人網路等方法。 不過 QuickConnect 除了有許多不支援的功能外,安全性也是部分使用者會列入考量的項目之一。雖然說身為一個世界上最大的 NAS 廠商之一,自從 2014 的 SynoLocker 事件之後,暫時都沒有再發生其他嚴重的安全性問題。不過對於像我這樣非常在意隱私及安全性的人來說,要經過第三方伺服器來代理,其中安全性和隱私性都是極具挑戰的一個問題,而且傳輸速度也會受限於 Synology 的伺服器,傳輸會比直接透過 DDNS 或公用 IP 還來得緩慢。 另外,DDNS 或公用 IP 畢竟直接將 NAS 暴露在網路上,而且部分網路環境也不適用這樣的方法,雖然這種方法能夠發揮較完整的網路速度,但也是最危險的作法。 而最安全的方法莫過於 VPN,這也是大部分企業會使用的方案。 除了上述方式外,有個相對來說也安全,而且更加方便的方案,就是 Cloudflare Zero Trust。
Cloudflare Zero Trust 是什麼?
Cloudflare Zero Trust 提供了一個平台讓你透過驗證、篩選、隔離、檢查…等功能建立零信任 (Zero Trust) 網路環境,且速度上會比使用 QuickConnect 或是其他如 Ngrok 等內網穿透服務還來得快。而且可以免費使用,以個人或是小型工作室來說,免費方案所提供的功能已經非常足夠了。
要幹嘛?
本文將分為兩個大方向:
  1. 將 DSM 等 HTTP 服務用 Tunnel 直接發布到公開網域上。
  2. 利用 Tunnel 與 WARP 建立虛擬私人網路供非 HTTP 服務的連線。
另外,本文雖然使用 Synology 進行示範,但基本上大部分廠牌甚至自建的 NAS 都適用於這套方案,只是 NAS 端的設定方法還需要各位自己去調查。
網路環境介紹
本人的住家是由房東提供整棟住戶的網路,由於我不知道主路由器的網管密碼,且網路是全體住戶共用的,因此打從一開始就否決了 DDNS 這套方案。 從主路由器拉了一條網路線到我的房間,房間中有一台路由器作為主要的 NAT 環境,提供 WIFI 給所有的無線裝置且拉了一條線到電腦旁,由於本來這條線只提供電腦使用,也沒有想到會再購買一台 NAS,又因主路由器只提供到 100M 的網速,因此我又購入了一台交換器將該線的訊號提供給電腦和 NAS 使用,電腦到 NAS 之間有 1000M 的傳輸速度,交換器至路由器之間為 100M,路由器對外也是 100M。 另外,全部設備都在 192.168.1.0/24 網段上。
註冊 Cloudflare Zero Trust 平台
首先,進入 Cloudflare Zero Trust,會要求你設定你的團隊名稱,可以輸入一個你喜歡的名字。
然後會讓你選擇你想選擇的方案,如果沒有什麼特殊需求或是錢多到沒地方花,可以直接選擇免費方案 (Free)。
然後按 Proceed to Payment。
之後新增一個付款方式。
新增完後,點 Purchase。
之後你就會成功進入 Cloudflare Zero Trust 平台。
建立 Application
首先,我們要建立一個用於對 HTTP 服務進行保護的應用。如果你打算直接讓 DSM 裸奔,那可以略過這個章節,直接前往 Tunnel 的部分。 點擊 Add an application。
這邊選擇 Self-hosted。
Application name 的部分隨喜,Session Duration 為 Session 的期限。 Application domain 的部分為你要用於訪問 DSM 的網址。 最後的 Identity providers 則是驗證身分的方法,預設有 One-time PIN,這個登入方式會寄送一個 OTP 到登入時輸入的信箱,如果要新增其他的驗證方式,可以到 Settings 中 Authentication 的部分新增。詳細新增方法可以參考官方文件
完成後點 Next。
Policy name 隨喜,Action 選擇 Allow,Session duration 這邊選擇與應用相同。 Configure rules 這邊使用 Emails,Value 輸入你的 Email。 然後按 Next,下一頁如果沒有什麼想特別設定的,可以直接點 Add application。
建立 Tunnel
接下來,我們要建立一個 Tunnel 用來與 Nas 連線。 點 Create a tunnel。
然後 Save tunnel。
接下來會告訴你要連接到 Tunnel,這邊我們只要取用 ey……J9 那串就好了。
可以先把這串 Token 存下來,先按 Next,等等再設定 NAS 的部分。 然後這邊的 Public hostname 設定剛剛在 Application 那裏設定的 domain,Service 則是輸入你在內網中進入 DSM 的 IP,我的情況是 192.168.1.10。 另外 Type 的部分可以選擇 HTTP 或是 HTTPS,如果選擇 HTTP 的話,URL 那裏的 PORT 要設定為 5000,HTTPS 的話則是 5001 (如果有在 DSM 中修改這個 PORT 的話,則是你設定的 PORT) 由於我選擇了 HTTPS,所以我的 URL 是 192.168.1.10:5001。 然後把 Additional application settings 點開,進入 Access 的選項,將 Protect with Access 打開下面的選取框選擇剛剛設定的 application,如果你沒有要用 Access 進行驗證的話,則跳過這個選項。
另外,還要把 TLS 中,No TLS Verify 的部分開起來,除非你有設定一個正確的 SSL,如果像我一樣用 Synology 預設的 SSL 證書的話,就把他打開來。
然後按 Save tunnel。
在 NAS 上安裝 Cloudflared
在套件中心中,進入設定,套件來源,新增一個來源 https://packages.synocommunity.com/。
然後在套件中心中尋找 cloudflared,並安裝他。 安裝完成後,會要求你輸入剛剛取得的 Token。 設定完後,你可以到剛剛新增的網址,測試有沒有成功的將你的 DSM 轉發。
登入後如果能夠看到 DSM 的登入介面,就代表設定成功了。
打通了,然後呢?
操作完以上步驟後,NAS 上的 HTTP 服務就已經可以從外網進入了。 如果你只需要用到這些功能,那就可以離開這個教學了。 但是有幾個問題會發生:
  1. 不支援 SMB。
  2. 如果有使用 Access 來做驗證的話,你會發現在 Drive 等 Synology 提供的手機 APP 不能正常登入。
首先是 SMB 的問題,這是由於 Cloudflare Tunnel 是利用 Websocket 來建立通道的,本身是不支援 non-HTTP 服務的,Cloudflared 有提供一個功能可以將服務轉為 non-HTTP 代理在本地,你只要在想要連線的設備上用 cloudflared 來代理服務就行。 不過這就是問題所在,你需要把所有的 non-HTTP 服務分別在 Tunnel 中新增 Public hostname 的設定,然後各自用 cloudflared 做代理,並且 iOS 等移動裝置也無法使用這個方法。 因此這邊就要搭配 WARP 及 Tunnel 中 Private Network 的功能來建立虛擬私人網路了。 另外如果有使用 Access 來做驗證的話,由於 Drive 等 Synology 提供的手機 APP 是沒有針對 Cloudflare Tunnel 的相關設計的,所以理當不支援。
Tunnel 搭配 WARP,直接訪問你的內網
Cloudflare Tunnel 提供了一個超棒的功能,讓你可以透過 Tunnel 來訪問內網,而且由於要用 WARP 用戶端登入 Access 來連接到 VPN,因此安全性上多了一層保障。 首先在 Tunnel 中進入 Private Network 的頁面。
點 Add a private network。 由於我的內網環境是 192.168.1.x,所以 CIDR 是 192.168.1.0/24,這個意思是從 192.168.1.0-192.168.1.255 中所有的 IP。
新增完 Private network 後,到 Settings 中的 WARP Client。
先在 Device posture 下的 WARP client checks 點擊 Add new。
選擇 Warp 後按 Save。 然後在 Device enrollment 中的 Device enrollment permissions 點 Manage。
點 Add a rule 新增一個裝置驗證的規則。
這邊我就用 Email 作為驗證的規則。 設定完後按 Save,然後回到 Settings。 一樣在 WARP Client 頁面中,看到 Device settings 下 Profile settings 的 Default Profile 的地方。 點擊三個點,找到 Configure,點進去。 往下找到 Split tunnels 的地方,點 Manage。
由於我的內網是 192.168.1.0/24,因此我們要找到包含他的IP範圍,也就是 192.168.0.0/16,把他刪掉。
然後再回到 Settings,找到 Network 的頁面。
然後到 Network 的頁面中,將 Firewall 下的 Proxy 打開,這邊也可以把 UDP 打開來。 Cloudflare Tunnel 的部分設定完成。 接下來是用戶端的部分。 你可以到 Cloudflare WARP 的網站下載 WARP Client,我這邊就用 iOS 來示範。 進入 WARP APP 後,照著指示安裝 VPN profile。
安裝完之後,你會看到以下畫面。
進入 Settings,找到 Account 的選項,裡面有一個 Login to Cloudflare Zero Trust 的按紐。
打開後,照著指示登入即可。 登入完成後,你就會看到主頁變成 Zero Trust 的字樣了。
然後連線到 VPN,當你看到 Your Internet is protected 的字樣,就代表你已經成功連上 Cloudflare Zero Trust 的虛擬私人網路中了。 我這邊改用手機開熱點給 iPad 使用,測試在行動網路中有沒有辦法用 NAS 的內網 IP 連線上。
甚至還可以進入交換器的網管頁面。
當然,如果你預計要給很多人連線,不建議將整個 192.168.1.0/24 開啟,最好只設定 NAS 本身,不過這邊因為只有我一個人使用,而且日後也可以用來連接到我的電腦上,所以我這邊就保持把整個 192.168.1.0/24 開啟。 這樣就完成所有的設定囉。
額外附贈—Access 訪客暫時性授權
如果有讓訪客暫時性存取的需求,可以在 application 中新增一個 Policy,rules 設定成 Everyone 或是你想要限定特定 email 結尾等,這邊由你決定。 然後底下的 Additional settings 要把 Purpose justification 及 Temporary authentication 打開,底下 Email addresses of approvers 輸入你的 Email,這樣他會讓沒有授權的訪客可以在登入後透過填寫理由來要求存取權限。而你會收到 Email 詢問你要不要授權,這個功能在你有想要把 NAS 中檔案分享給朋友的需求時蠻方便的。
當然規則的順序不要搞錯,不然連你也會要輸入理由。
再送一個—覆寫 DNS
如果你希望在使用 WARP 直接訪問內網時也可以用 Tunnel 中的 Public hostname 來訪問的話 (直接連 192.168.1.10 而不是經過 Access),可以到 Gateway 下的 Firewall policies 中新增防火牆規則。 點 Create a DNS policy。
Policy name 一樣隨喜,STEP 2 中選 Domain is 你設定的網址。 STEP3 的 Action 則是 Override,Override Hostname 輸入 NAS 的內網 IP。 然後 Create policy,你就會在連上 WARP 時,透過網址進入 DSM 直接透過內網 IP 訪問,而不會經過 Access 驗證了。
這裡還有許多東西能夠玩,像是封鎖特定網域、特定應用,你可以慢慢摸索。 不過要提醒一下,修改完後可能不會馬上生效,因為你的裝置會將 DNS 紀錄暫存,可以手動清理暫存或是等他自己清理。 分辨他是經過 Access 或是透過內網IP的方式除了看會不會進入登入畫面、SSL 有沒有被標示不安全以外,也可以直接看網址會不會自動轉跳到帶有 DSM 的 PORT (5000, 5001) 上。
結語
除了 Tunnel、Access、WARP 外,Cloudflare Zero Trust 還有許多功能非常的不錯,這麼棒的一個平台竟然有免費方案,而且限制並不像其他服務多到強迫你得購買付費方案。只能說 Cloudflare 是一間佛心公司。 我在設定的時候其實碰到了很多瓶頸,因為相關的資源太少人做了,因此只能用一些很零散的教學和官方文件來尋找各種我需要的功能。 不過在設定的過程中我找到了一個針對 Tunnel+WARP 的部分說明得很詳細的教學,要不是有看到這篇文章,我大概也不會成功的設定這個部分了。 以下提供該教學的網址給各位參考: Securely access home network with Cloudflare Tunnel and WARP | Savjee.be 最後也希望這篇文章能幫助到各位有需求的人。
秉持著我都會遇事別人怎麼不會的精神分享解決事情的經過。
sakkyoi © 2024
Roses are Red, Violets are Blue Unexpected '{' on line 32.
本站使用 Tocas-UI 進行設計
問題回報
如果您在本站的使用過程中遇到任何困難或是錯誤,歡迎透過 email 向我們回報。如果是關於文章內容的相關討論,敬請使用留言板直接進行討論,這將幫助其他使用者了解您遇到的問題。
使用者分析
我們使用自己的分析伺服器收集並分析您在本站的行為,這樣能確保您的相關資料不受其他第三方伺服器濫用。您可以選擇將本功能關閉以保護您的隱私。但這會阻止我們透過您的行為來改善您和其他使用者的體驗。