本人近日終於下定決心購入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等內網穿透服務還來得快。而且可以免費使用,以個人或是小型工作室來說,免費方案 所提供的功能已經非常足夠了。
要幹嘛?
本文將分為兩個大方向:
將DSM等HTTP服務用Tunnel直接發布到公開網域上。
利用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服務就已經可以從外網進入了。
如果你只需要用到這些功能,那就可以離開這個教學了。
但是有幾個問題會發生:
不支援SMB。
如果有使用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
最後也希望這篇文章能幫助到各位有需求的人。
秉持著我都會遇事別人怎麼不會的精神分享解決事情的經過。