從外網存取區域網路的裝置,又不需要每一台裝置都安裝Tailscale。
1. Subnet Routers的用途#
適用場景:不想在每個裝置都安裝Tailscale,佔掉Tailscale裝置名額的用戶。
試想,在家裡,當手機、電腦、NAS、樹莓派位於同一個網路的時候,我們可以透過區域網路IP連線。
例如:
- 電腦 192.168.0.109
- 手機 192.168.0.110
- NAS 192.168.0.111
- 樹莓派 192.168.0.112
區域網路下,電腦能夠從192.168.0.111
連線到NAS的服務。
如果我要從外部網路連線到家中NAS,可以選擇在所有裝置都安裝Tailscale客戶端,之後用Tailscale分配的虛擬區域IP連線到NAS,例如100.64.0.0
,不能再使用192.168.0.111
連線了。
但是這樣很麻煩的說,要是裝置多起來了怎麼辦呢?每部裝置都安裝一次Tailscale嗎?還要去記住Tailscale給的IP?萬一那台裝置不給安裝第三方軟體呢?
能不能在家裡的一部裝置安裝Tailscale就好,把它作為跳板機使用,從而存取背後的所有區域網路的裝置呢?
這就是Tailscale的「Subnet Routers」子網路路由功能,只要在一部裝置安裝Tailscale,並啟用Subnet功能,就可以把它當成跳板機,存取區域網路的其他裝置,即使那些裝置沒有安裝Tailscale也能連線。
連線的時候,作為Subnet Routers的裝置是扮演SNAT的角色。
2. 安裝Tailscale#
建議安裝在Linux系統的裝置,例如電腦或者路由器,比較好處理網路連線。
3. 將Linux作為Subnet Routers#
- 登入要作為Subnet Router的Linux電腦。使用sysctl指令,給Linux核心啟用IP Forwarding
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
你需要注意防火牆是否會阻擋IP Forwarding,這裡使用UFW因此不需要再另外設定。
接著,利用NetworkManager附屬的nmcli指令,列出網路連線裝置。如果使用乙太網路,那麼裝置名稱應該是
enp
開頭
nmcli device
# 範例輸出
DEVICE TYPE STATE CONNECTION
enp2s0 ethernet 已連線 eth0
- 取得Linux網路的預設閘道(gateway),例如我家網路是
192.168.0.0/24
nmcli device show enp2s0 | grep 'IP'
- 將Tailscale設定使用該閘道器
sudo tailscale up --advertise-routes=192.168.0.0/24 --operator=user
開啟Tailscale網頁後台,點進去Subnet的機器設定
在Routing Settings這裡同意Subnet規則
4. 嘗試連線到Subnet Routers背後的裝置#
接著讓另一台電腦連上Tailscale網路,不要連到區域網路。
測試能否ping到192.168.0.0
網段的裝置。
Windows、macOS、Android、iOS應該是開箱即用。
如果電腦是Linux,需要執行以下指令才能存取Subnet Routers背後的裝置:
sudo tailscale up --accept-routes