# 利用 ZeroTier 讓沒辦法開端口的使用者在外地存取內網設備 ###### tags: `路由器` `HomeLab` 大部分有固網的使用者都能開端口,讓自己或朋友也能在公網存取家裡面的設備,但是在某些特殊的網路場景下是難以開端口出去的 像是手機網路或者共用網路,要是沒有端口轉發,想在租屋處架個伺服器也變得非常困難 所以就有了內網穿透服務,從國小玩 Minecraft 用的 LogMeIn Hamachi 到現在已經多出了很多類似的程式與服務 例如 Cloudflare Tunnel, Radmin VPN, TailScale 與這次要使用的 ZeroTier 都是屬於內網穿透的服務 ## 起因 ### 同學家的社區網路.... 這裡就要提到我人生中遇到資訊學習能力超群,網頁前後端大師,超強的 [Kami](https://github.com/kami-sqmf),國中的時候資訊能力在班上比較能交流的就我們兩個,如今他已經自我超越變成了網頁大師了 那網頁大師需要什麼,那當然就是一台可以在外網存取的超棒伺服器,但是遇到了一個問題,他家裡面所使用的網路供應商雖然是中華電信的 [HiNet](https://zh.wikipedia.org/zh-tw/中華電信),但是其實是一個超強管理系統的[社區網路](https://www.jgnet.tw/index.php),也就是說他沒辦法使用路由器撥號連線,更不可能開端口出去公網使用 ### Cloudflare Tunnel 不行嗎? 那這時候有些東西就會比較麻煩,例如要使用 SSH 或網頁服務就開個 Cloudflare Tunnel,但是這東西沒辦法存取內網服務,端口也沒辦法像這樣一次全開,在外地調整家裡路由器是更不可能。 所以身為好同學(?當然要幫他伺服器優化一下,讓他變成好用的伺服器! ## 實作 首先,要先 SSH 進去家裡面的伺服器,所以你必須要在內網環境。 :::info :bulb: **提示:** 本次實作系統環境為 `Ubuntu Server 23.04` 如果使用其他發行版 請自行注意一下指令的用法 ::: ### 此次操作所使用之系統版本  ### 1. 建立 ZeroTier 虛擬網路 到 [ZeroTier 網站](https://www.zerotier.com)註冊帳號之後,到裡面去建立一個虛擬網路,建議使用公開,這樣只要朋友有 `NetworkID` 就可以加入虛擬網路,不需要一一授權核准裝置  ### 2. 安裝 ZeroTier 套件 並且加入該虛擬網路 **2-1.** Debian, Ubuntu, Fedora 都可以用以下指令安裝 ZeroTier ``` curl -s https://install.zerotier.com | sudo bash ``` **2-2.** 安裝好之後可以先把防火牆關閉,或是把 UDP 9993 端口打開,確保 ZeroTier 連接順暢 ``` sudo ufw allow 9993/udp sudo ufw reload ``` 或者 ``` sudo ufw disable ``` **2-3.** 啟動 ZeroTier 服務並且讓他開機自動啟動 ``` sudo systemctl start zerotier-one sudo systemctl enable zerotier-one ``` :::info :bulb: **提示:** 如果使用 Wi-Fi 連線,要登入桌面才會連上網路的話,則必須啟用 `systemd-networkd-wait-online` 服務,讓 ZeroTier 在有網路之後才嘗試連線 (參考自 [Ivon 的教學](https://ivonblog.com/posts/install-zerotier-on-linux/)) ::: **2-4.** 將伺服器加入至虛擬網路 ``` sudo zerotier-cli join "Network ID" ``` 假如說加入成功的話,應該會回傳 `200 join OK` ### 3. 網頁端後台設定相符的內網網段及轉發 進到網頁端管理後台後,滑動到底下 Members 這裡可以看到已加入此虛擬網路的裝置,可以看到我將我同學家的伺服器在 ZeroTier 的虛擬網路 IP 位置設定在 `10.10.10.1` 方便等一下的作業  然後滑動到管理後台的上方的 Advanced,我將虛擬內網的網段設定在 `10.10.10.0/24` ,實體內網的網段(伺服器的內網網段)在 `192.168.27.0/24` 所以要到 Routes 如下圖設定 **講簡單一點就是:要是你要存取 `192.168.27.0/24` 網段裡的設備的話,你要先跟 `10.10.10.1` 這台設備(伺服器)講,也就是當作轉發 IP 的伺服器**  上面那張圖的下方那個 IPv4 Auto-Assign 有點像是 DHCP Server 的概念,要設定虛擬網段的 IP 範圍,像我自己就是設定 `10.10.10.0/24`,避免跟通常使用的內網網段`192.168.xx.xx` 做衝突 ### 4. 伺服器規則轉發設定 以上設定好之後,回到我們的伺服器,因為要設定規則才能成功讓 IP 轉發,才可達到存取內網裝置的目的 首先,我們要先編輯 `/etc/sysctl.conf` 這個文件,並且把`net.ipv4.ip_forward` 取消註解,這樣才能讓伺服器開機時自動啟用轉發功能,操作步驟如下 登入 SSH 之後,我習慣使用 nano 來編輯文件,所以就要使用這個指令來開始那個檔案來編輯,如果你習慣使用 vim 來編輯的話也可以,這裡示範我的操作步驟 ``` sudo nano /etc/sysctl.conf ``` 進入文字編輯的頁面後,將 `net.ipv4.ip_forward` 來取消註解  之後按 `Ctrl + X` 來退出並存擋 接下來我們要馬上啟用,所以把轉發服務打開 ``` sudo sysctl -w net.ipv4.ip_forward=1 ``` 然後我們要調整 iptables,依照官方文件的建議是先設定變數再執行,所以這是範例 ``` PHY_IFACE=eth0; ZT_IFACE=zt7nnig26 ``` :::info :bulb: 上圖的 eth0 是指你實體連到網路的網路介面 ID,ZT_IFACE 裡面那個是指 ZeroTier 的虛擬網路介面 ID,所以我們要根據自己的名稱進行修改 ::: 查看網路介面 ID ``` ls -l /sys/class/net/ ```  像是我的實體網路介面 ID 就是 `enp1s0`,以及 ZeroTier 虛擬介面 ID 是 `ztcfw2oox3` 所以就依此類推將上面範例的修改,並且執行該指令 執行好之後接下來是增加規則到 iptables 裡面 ``` sudo iptables -t nat -A POSTROUTING -o $PHY_IFACE -j MASQUERADE sudo iptables -A FORWARD -i $PHY_IFACE -o $ZT_IFACE -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i $ZT_IFACE -o $PHY_IFACE -j ACCEPT ``` 然後將 iptables 存擋到系統裡面供下次開機執行 ``` sudo apt install iptables-persistent sudo bash -c iptables-save > /etc/iptables/rules.v4 ``` ### 5. 最後的最後 這時候你的伺服器已經設定完成了,終於可以去 ZeroTier 官網載 Client 下來用啦!  載下來後點 Join New Network 之後輸入 Network ID 就可以進到 ZeroTier 虛擬網路了! 經過研究後,路由器即使不是 OpenWrt 也能使用內網轉發功能,讓不能開端口的存取內網裝置,真的是很開心,最後再放上一張連回去路由器的後台照片!  --- ### 後記: 做這個真的好累,但是看到中文的幾乎沒有寫有關不需要 OpenWrt 的 ZeroTier 內網其他裝置存取的教學,所以就寫了一個,感謝這個參考資料,~~還有我自己~~ ### 參考資料: [Ivon的部落格 - Linux如何安裝 & 使用ZeroTier建立虛擬區網](https://ivonblog.com/posts/install-zerotier-on-linux/) [ZeroTier 官方文件 - Route between ZeroTier and Physical Networks](https://zerotier.atlassian.net/wiki/spaces/SD/pages/224395274/Route+between+ZeroTier+and+Physical+Networks)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up