今年春節,返鄉過年的朋友應該都有不少吧?離開了常住的居家和辦公環境,偶爾還是會碰到需要訪問家中/公司設備的場景。或許是臨時下載放在服務器中的文件,或許是連上住所的 NAS 和親朋好友一起觀看自己收藏的電影。
但對我來說,通過外網訪問 NAS 的速度相比局域網總覺得差點意思,有沒有更好的解決方案,讓我身在異地也能像局域網訪問那樣用上家裏設備呢?
這次我選擇了軟件定義廣域網(SD-WAN)來解決這個問題,效果還算不錯。通過虛拟化的技術,SD-WAN 将不同網絡下的設備連接到一個局域網中,讓不同設備之間高效互訪。比起傳統内網穿透進行跨網段設備訪問,整體操作相對簡單,用起來更加靈活,并且還有相當不錯的訪問穩定性。
本文介紹其中一種不花錢、但需要花點時間的配置方案,希望你下次也能用得上。
▍SD-WAN 簡評
在 SD-WAN 解決方案這條賽道上,市面上目前可以選擇的産品主要要有 Zerotier、Tailscale 以及蒲公英這麽幾款。
Zerotier 和蒲公英少數派此前已有介紹,這裏簡單梳理一下這些方案的優缺點:
Zerotier
優點:可直接使用官方提供的方案快速,同時支持私有化部署
缺點:
由于網絡協議的限制,不同的網絡運營商下設備連接存在較高延遲
在群晖 DSM 7 上沒有圖形化客戶端
官方免費版存在組網限制
Zerotier 的原理其實很容易理解:通過根節點來創建一個中心服務器,加入其中的設備都需要和這個中心服務器通信,從而構建起一個虛拟局域網。由于中心服務器部署在海外,國内訪問難免會出現不穩定的情況,跨運營商設備互訪時丢包尤其嚴重。
Tailscale
優點:跨運營商設備互訪穩定性較好,客戶端開源
缺點:
控制服務器非開源軟件
官方免費賬戶存在較多限制
相比 Zerotier,Tailscale 在底層網絡邏輯上采用了 WireGuard 協議,因此不同運營商之間的設備互訪的速度更佳,有公網 IP 時效果更爲明顯。不過和 Zerotier 的問題類似,由于中心服務器均部署在海外,網絡不穩定的情況在所難免。
蒲公英
優點:國内廠商出品,網絡訪問最爲穩定
缺點:免費版套餐設備限制較大,必須付費升級
蒲公英屬于國内廠商推出的 SD-WAN,相比以上兩款的海外 SD-WAN 服務,最大的優勢就是中心服務器均在國内,因此單就從網絡訪問性上自然最佳;在沒有公網 IP 的設備之間通過國内服務器進行中繼服務可謂是相當穩定。不過它的缺點也很明顯:免費套餐對設備限制較高,要想真正用起來必須付費。
綜上,如果你想少折騰并且需要解決剛需,花點錢直接選擇蒲公英付費即可。但如果你和我一樣希望通過私有化部署免費、無限制地使用 SD-WAN,不妨跟随下面的流程手動配置一套屬于自己的遠程設備訪問方案。
▍HeadScale 是什麽
上面提到的服務中,Tailscale 和 Zerotier 其實都是商業化服務,免費賬戶服務基本夠用,服務穩定性則是個大問題。
因此 Tailscale 很早之前就有了可以私有化部署的開源方案。此前由于底層網絡協議的限制,私有化部署後跨運營商設備穿透失敗的情況依然時有發生——直到 HeadScale 的出現。
Headscale 是歐洲航天局的 Juan Font 使用 Go 語言開發,在 BSD 許可下發布,它基本上實現了 Tailscale 控制服務器的所有主要功能,沒有任何設備數量的限制,同時可以直接借用 Tailscale 的客戶端來牽線搭橋。
它唯一的缺點是目前尚沒有可視化界面,也無法直接使用 Tailscale 的 iOS 客戶端。考慮到我主要想實現不同區域下桌面設備的互訪,針對移動端的這個小缺點倒顯得不那麽重要。
另外,既然我們搭建服務最終目的是「免費無限制地使用」,這次:
不再雲服務器來部署 HeadScale 控制服務器,而是使用家中的 NAS
需要提前聯系運營商獲取家中網絡的公網 IP
滿足這兩個條件,接下來就就可以部署 HeadScale 了。
▍在群晖上部署控制服務器
我家中主要是使用群晖 NAS,并且部署 HeadScale 控制服務器需要有公網 IP,因此我首先需要做的是設置 DDNS 并開啓相應的端口映射。DDNS 設置的操作視設備而定,開啓後記得映射 8881、9090 以及 50443 這三個端口即可。
接着我們需要添加 HeadScale 的軟件安裝源,這裏筆者我選擇了「我不是礦神」提供的一個第三方源:打開群晖中的「套件中心」,然後在「設置」中切換到套件來源,新增一個新的套件來源。
名稱填寫「inmk」就好,這裏需要注意的是,如果群晖系統版本爲 DSM 6.X,位置填寫 https://spk.imnks.com/,如果是 DSM 7.x,位置則填寫 https://spk7.imnks.com/。
回到套件中心,點擊左邊側邊欄切換到「社群」,找到 HeadScale 軟件點擊下載并安裝,如果彈出警告請點擊同意并安裝。安裝完成後我們就可以在主菜單中看到 HeadScale 了。
點擊 HeadScale 我們可以看到一個參數設置頁面,這裏面我們需要将 server_url後面的 127.0.0.1 修改成 DDNS 地址,後面的端口号保持不動。另外 listen_addr:、 metrics_listen_addr: 以及 grpc_listen_addr: 後面的 127.0.0.1 均改爲 0.0.0.0。
最後直接點擊保存,這時 HeadScale 服務會再次重啓。
接下來我們需要創建一個分組空間來方便标識加入的設備。這裏需要使用 SSH 終端來訪問家中群晖,以 root 權限登錄後,輸入:
cd /var/packages/headscale/target/bin
我們這裏創建一個名爲 sspaihx 的分組空間,接下來輸入:
headscale namespaces create sspaihx
緊接着我們查看一下這個命名空間是否創建成功了,輸入:
headscale namespaces list
如果看到 Name 裏面有我們創建的這個 sspaihx 的分組空間就表示分組空間已經創建成功,至此我們的 HeadScale 控制服務器就已經部署完畢了。
▍使用 Tailscale 客戶端連接
創建好 HeadScale 控制服務器後,接下來就是将客戶端連接上了。正如上面所言,我們在客戶端上依舊可以使用 Tailscale 的客戶端——但需要進行一番小改造。
将 Windows 客戶端連接到 HeadScale 網絡中
我們最常使用的桌面系統自然是 Windows。這裏我們首先在桌面打開浏覽器,然後使用浏覽器訪問:
http://剛才設置的 ip 或者域名:8881/windows
在打開的頁面中下載一個注冊表文件,然後将其導入到系統中。緊接着去 Tailscale下載 Windows 客戶端并安裝,然後鼠标單擊系統托盤處的 Tailscale 圖标并選擇 log in。此時會打開如下頁面:
複制 headscale -n這一段命令,将其中的 NAMESPACE 替換成前面我們創建的分組空間名(sspaihx),然後再次打開 SSH 終端,使用 root 權限連接群晖并輸入如下兩段命令:
cd /var/packages/headscale/target/bin
headscale -n NAMESPACE nodes register --key nodekey:7f2fdxxxxxxxx
如果終端顯示 registered則表示設備已經加入,這時候在右鍵點擊系統托盤處的 Tailscale 圖标,然後點擊 sspaihx 分組空間點擊加入即可。
最後,我們回到 SSH 終端中輸入:
headscale nodes list
如果看到當前已經有設備名單,則表示已經成功将 Windows 設備加入到 HeadScale 網絡了。
将群晖連接到 headScale 網絡中
群晖既然可以作爲控制服務器,當然也可以作爲客戶端連接到控制器中。其中控制服務器軟件是 HeadScale,客戶端則依舊是官方的 Tailscale 客戶端。
我們需要到打開群晖的「套件中心」然後直接搜索「Tailscale」下載安裝,安裝完成後打開 SSH 客戶端,通過 root 賬戶連接到群晖上并輸入如下兩段命令:
cd /var/packages/Tailscale/target/bin
tailscale up --login-server=http://剛才設置的 ip 或者域名:8881 --accept-dns=false
輸入完成之後終端會打印出一段網址,将其複制并使用浏覽器打開——其實就和剛才 Windows 上的呈現的設備認證一樣,同樣是 headscale -n 一段命令,将其中的 NAMESPACE替換成前面我們創建的分組空間名。然後在 SSH 終端輸入如下命令:
cd /var/packages/headscale/target/bin
headscale -n NAMESPACE nodes register --key nodekey:7f2fdxxxxxxxx
回車後應該可以看到終端顯示 registered,如果不确定是否加入,可以再用下面這條命令查看設備是否加入。
headscale nodes list
将 macOS 連接到 HeadScale 網絡中
相比 Windows ,macOS 加入 HeadScale 網絡中會略微有些複雜,這裏首先需要使用浏覽器打開:
http://剛才設置的 ip 或者域名:8881/apple
在這個頁面中我們需要确定下載什麽版本客戶端,如果你有外區的 Apple ID 賬号,這裏可以直接選擇 App Store 版本的 macOS 客戶端,否則就隻能選擇 Standalone 客戶端。
選擇好客戶端之後,首先下載對應版本的描述文件(Profiles)并雙擊導入系統,打開「設置 > 隐私與安全性 > 描述文件」,選擇已下載的描述文件,雙擊安裝并授權。
最後我們再安裝并啓動 Tailscale 客戶端:在菜單欄中點擊 Tailscale 圖标,然後點擊 log in 打開相應的設備認證頁面。
同樣是 headscale -n 這段命令,将其中的 NAMESPACE 替換成前面我們創建的分組空間名。然後直接在 macOS 打開 SSH 終端,使用 root 賬戶連接群晖,輸入如下命令完成設備授權:
cd /var/packages/headscale/target/bin
headscale -n NAMESPACE nodes register --key nodekey:7f2fdxxxxxxxx
回車後看到 registered 表示設備已經完成添加,這時候再輸入:
headscale nodes list
可以看到不同系統設備都已經加入到這個虛拟局域網中了,我們使用各自對應的 IP 互相 ping 一下,看看能否直接實現互訪,比如使用這個内網 ip 訪問群晖 DSM 系統。
▍結語
通過以上方案,基于 DDNS + 動态公網 IP,在沒有花費一分錢的情況下,我們實現了諸多商業 SD-WAN 軟件才能獲得互聯效果。這種方案不僅沒有設備數量限制,同時也有着不錯的跨運營商互訪穩定性。
另外,如果你的資金或者條件允許,也可以嘗試直接購買一台雲服務器來部署 HeadScale,具體的方法可以參考 GitHub。
相關鏈接
我不是礦神:
https://imnks.com/
GitHub:
https://github.com/juanfont/headscale
原文鏈接:
https://sspai.com/post/77971?utm_source=wechat&utm_medium=social
作者:化學心情下2
責編:克萊德
/ 更多熱門文章 /