在我的 TP-Link 管理型交換器上除錯 VLAN
我最近買了人生第一台管理型網路交換器,一台 TP-Link JetStream TL-SG3428X。

管理型交換器最主要的功能,就是讓你能將網路分割成多個 VLAN。我對這項功能感到很期待,但卻花了好幾個小時反覆嘗試,才終於讓 VLAN 正常運作。
我覺得 TP-Link 的 VLAN 說明文件寫得不夠完整,所以把我的筆記分享出來,希望對其他人有幫助。
背景
如果你對 VLAN 還不熟悉,我最推薦的解說是 Raid Owl 關於這個主題的影片。
Tagged 埠、Untagged 埠與 PVID
不同的裝置會用不同的術語來描述 VLAN 功能。
在 TP-Link 交換器上,你需要了解的相關設定有:
- Tagged 埠
- Untagged 埠
- PVID
Tagged 埠
當你將某個埠以Tagged 埠的形式加入 VLAN 時,交換器就會允許連接在該埠上的裝置在該 VLAN 上收發流量。
在 Tagged 埠上,交換器會保留封包上的 VLAN 標籤,因此你應該將支援 VLAN 的裝置以 Tagged 埠的形式加入 VLAN。支援 VLAN 的裝置包括防火牆、其他管理型交換器,以及支援 VLAN 的無線基地台。
舉例來說,如果你將埠 5 以 Tagged 埠的形式同時加入 VLAN 10 與 20,那麼交換器就會將帶有 VLAN 標籤 10 與 20 的封包傳送到該埠。它不會移除標籤,因此連接在埠 5 上的裝置會收到仍帶有 VLAN 標籤的封包。該裝置不會收到任何其他 VLAN 標籤的封包,因為只允許 10 與 20。

範例:將某個埠以 Tagged 埠的形式加入 VLAN 10 與 20。交換器會允許帶有 VLAN 10 與 20 標籤的流量通過,但會拒絕其他流量,例如帶有 VLAN 30 標籤的封包。
Untagged 埠
當你將某個埠以Untagged 埠的形式加入 VLAN 時,交換器同樣會允許連接在該埠上的裝置在該 VLAN 上收發流量,就像 Tagged 埠一樣。Untagged 埠的不同之處在於,交換器在將封包轉送到該埠之前,會先移除網路封包上的 VLAN 標籤。
Untagged 埠適用於不支援 VLAN 的裝置,例如一般的桌上型電腦、掃描器或印表機。交換器會移除 VLAN 標籤,是因為連接在該埠上的裝置根本不了解 VLAN。
舉例來說,如果你將埠 6 以 Untagged 埠的形式加入 VLAN 10,那麼交換器會將帶有 VLAN 標籤 10 的封包傳送到該埠,但在轉送封包之前會先移除標籤。連接在埠 6 上的裝置會收到不帶任何 VLAN 標籤的封包。該裝置不會收到任何其他 VLAN 標籤的封包,因為只允許 VLAN 10。

PVID
在 TP-Link 交換器上,每個埠都有一個PVID,也就是 Port VLAN Identifier(埠 VLAN 識別碼)。當封包從連接的裝置經由該埠進入交換器時,交換器會將該埠的 PVID 作為 VLAN 標籤加到封包上。
Tagged 埠與 Untagged 埠定義的是封包如何從交換器傳送到埠,而 PVID 影響的則是封包如何從埠進入交換器。

對於連接到支援 VLAN 裝置的埠,你不需要設定 PVID,因為那些裝置本身就會加上自己的 VLAN 標籤。
對於連接到不支援 VLAN 裝置的埠,你則需要設定 PVID,因為交換器需要代替不支援 VLAN 的裝置加上正確的 VLAN 標籤。
如何在 TP-Link 管理型交換器上找到 VLAN 設定
TP-Link 把 VLAN 設定藏在一堆名稱相似的選項之中。我一開始甚至不確定自己是不是在設定正確的地方。
如果你的 TP-Link 交換器介面跟我的一樣,可以依下列步驟找到 VLAN 設定:
- 從導覽列點擊 “L2 Features”
- 從左側邊欄點擊 “VLAN”
- 從子選單點擊 “802.1Q VLAN”

如何在 TP-Link 管理型交換器上找到 VLAN 設定
“VLAN Config” 分頁可讓你將 VLAN 新增到交換器,並設定哪些埠是該 VLAN 的成員。
“Port Config” 分頁可讓你設定任何埠的 PVID。同樣地,你只需要為直接連接到需要加入 VLAN 的不支援 VLAN 裝置的埠設定 PVID。如果你要為某個埠設定 PVID,它應該只以 Untagged 埠的形式屬於單一 VLAN。
為什麼 TP-Link 要我們手動管理 PVID?
有些交換器根本不讓你設定 PVID。它們只會顯示 Tagged 埠與 Untagged 埠——交換器會自動幫你設定 PVID。

QNAP 管理型交換器上的 VLAN 管理介面截圖。QNAP 的介面比 TP-Link 直覺得多。
在那些沒有提供 PVID 設定的交換器上,將某個埠以 Untagged 埠的形式加入 VLAN 20,就等同於將該埠的 PVID 隱含地設為 20。我真希望 TP-Link 也採用這種做法,因為他們現在的實作方式實在過於複雜。
以下是我在 TP-Link 交換器上管理 Untagged 埠與 PVID 的經驗法則:
- 如果你將不支援 VLAN 的裝置連接到交換器,它應該只屬於單一 VLAN。
- 將該裝置的埠以 Untagged 埠的形式加入該 VLAN。
- 將該埠的 PVID 設為該 VLAN 的 ID。
- 將該埠從任何其他 VLAN 中移除。
舉例來說,如果你將印表機接到交換器的埠 16,並希望它位於 VLAN 20,你就應該將埠 16 以 Untagged 埠的形式加入 VLAN 20,並將埠 16 的 PVID 設為 20。
TP-Link 在技術上允許你將某個埠以 Untagged 埠的形式同時加入多個 VLAN,但我認為完全沒有理由這麼做。這樣做會讓該裝置可以接收來自其他 VLAN 上裝置的封包,但卻只能將封包傳送到與該埠 PVID 相符的單一 VLAN 上的裝置。
導入管理型交換器之前的家用網路
在我購入管理型交換器之前,我就已經在使用 VLAN 了,但我是透過一台非管理型交換器來連接它們。
當時網路中相關的裝置有:
- 我的桌上型電腦,可存取所有 VLAN
- 我的 Ruckus WiFi 無線基地台,提供兩個使用不同 VLAN 的無線網路
- 我的 OPNsense 防火牆,負責對跨 VLAN 或通往網際網路的封包執行防火牆規則
- 我的 Proxmox 伺服器,會為特定虛擬機的網路介面加上 VLAN 標籤

我加入管理型交換器之前的家用網路
請注意,在這張架構圖中,我沒有將任何支援 VLAN 的裝置串接在一起。這讓設定簡化了許多,而這一點直到我升級到管理型交換器後才意識到。
錯誤一:用管理型交換器替換非管理型交換器,導致 WiFi 無法上網
當我買下 TP-Link TL-SG3428X 後,我只是直接用它替換了原本的非管理型交換器。我的網路架構圖並沒有太大變化:

我加入管理型交換器之前的家用網路
安裝新的管理型交換器幾分鐘後,我的未婚妻告訴我她的筆電無法上網了。我檢查了自己的手機,也發現同樣的狀況。
所有 WiFi 裝置都能連上無線網路,但網路卻無法連上網際網路。怎麼會這樣?我根本沒有更改任何防火牆設定,只是把非管理型交換器換成了管理型交換器而已。
幾個小時後,我終於發現問題所在。我的管理型交換器把所有帶有標籤的封包都丟棄了。流量可以從 WiFi 裝置傳到無線基地台,但交換器卻因為不認識我的 VLAN 而拒絕了帶有 VLAN 標籤的封包。

當我將非管理型交換器換成管理型交換器時,管理型交換器開始丟棄來自無線基地台、帶有 VLAN 標籤的流量。
解決方法就是讓我的管理型交換器認識我現有的 VLAN。否則,交換器就會持續丟棄所有帶有 VLAN 標籤的封包。
以下是修正後的管理型交換器設定:
| VLAN ID | VLAN 名稱 | 埠(Tagged) |
|---|---|---|
| 1 | System | All |
| 10 | Trusted | 1 (firewall), 17 (wireless access point) |
| 20 | Guest | 1 (firewall), 17 (wireless access point) |
完成這項設定變更後,我的 WiFi 裝置又能重新上網了。交換器認得了它們的 VLAN 標籤,並將流量轉送到我的 OPNsense 防火牆。
錯誤二:忘記將路由器加入 VLAN
當我嘗試在網路中加入一個不受信任的裝置時,又遇到了另一個問題。我家屋頂裝有太陽能板,為了監控其狀態,我必須使用這個專屬的 IoT 裝置。

我網路上一台不受信任的 IoT 裝置,用來追蹤戶外太陽能板的狀態
這個 IoT 裝置需要連上網際網路,才能將數據上傳到廠商的雲端儀表板。我完全不知道這個小盒子還會做什麼其他奇怪的事,所以我不希望它能存取我家網路上的任何東西。
我在 OPNsense 防火牆上建立了一個名為「Purgatory」的新 VLAN,專門用來隔離比訪客更不受信任的裝置。Purgatory 中的裝置可以存取 DNS 伺服器和公開的網際網路 IP,但不能存取任何其他 VLAN。

Purgatory VLAN 的防火牆規則
接著,我將太陽能監控 IoT 裝置所連接的 TP-Link 交換器埠加入到 Purgatory VLAN。這個 IoT 裝置是不支援 VLAN 的裝置,因此我將它設為 Purgatory 的 Untagged 埠,並將 Purgatory 的 VLAN ID(80)指派為該埠的 PVID。
將該埠以 Untagged 埠的形式指派給 VLAN,會在封包到達 IoT 裝置前移除 VLAN 標籤。指派 PVID 則會在 IoT 裝置發送到交換器的封包上加上 VLAN 標籤。


我將不受信任的 IoT 裝置以 Untagged 埠的形式加入 Purgatory VLAN。
但它沒有作用。雲端儀表板立刻顯示該 IoT 裝置已離線。
我無法在該 IoT 裝置上執行任何診斷,所以我需要用另一個系統來除錯。我將我的 Dell OptiPlex NixOS 系統加入 Purgatory VLAN,結果它也失去了網路連線。只要它是 Purgatory VLAN 的一部分,就無法 ping 到網路上的任何裝置。
我絞盡腦汁想釐清到底哪裡出了問題。我嘗試將測試裝置設為 Tagged 埠、Untagged 埠,PVID 設為 1,也試過設為 80。什麼方法都試過了,就是無法讓裝置加入網路。
我檢查了 OPNsense 防火牆,發現 Purgatory VLAN 上完全沒有任何流量。我檢查了 DHCP 設定,確認 Purgatory VLAN 的 DHCP 伺服器確實有在運作。
經過三個晚上絞盡腦汁試圖理解這個狀況後,我終於恍然大悟:我根本沒有把 OPNsense 防火牆加入 Purgatory VLAN!
當時的狀況是這樣的:
- IoT 裝置將流量傳送到 TP-Link 管理型交換器。
- 交換器為其加上 Purgatory 的 VLAN 標籤。
- Purgatory 的封包無處可去,因為該 Purgatory VLAN 上沒有任何其他主機。
解決方法很簡單:將 OPNsense 防火牆加入 Purgatory VLAN。因為防火牆是支援 VLAN 的裝置,所以我將它以 Tagged 埠的形式加入:

我修正後的 Purgatory VLAN 的 TP-Link VLAN 設定,讓 IoT 裝置可以透過 OPNsense 防火牆連上網際網路
| VLAN ID | VLAN 名稱 | 埠(Tagged) | 埠(Untagged) |
|---|---|---|---|
| 80 | Purgatory | 1 (firewall) | 24 (IoT device) |
我原本為埠 24 設定的 PVID 是正確的。它必須將 PVID 設為 80,因為交換器需要將 IoT 裝置傳送到交換器的封包標上 Purgatory 的 VLAN 標籤 80。
完成這些變更後,IoT 裝置就能連上它的雲端儀表板了,並且與我的家用網路適當地隔離開來。
除錯 VLAN 問題的技巧
除錯 VLAN 問題時最大的挑戰之一,就是如何觀察設定變更實際產生了什麼效果。如果我把某個埠從 Tagged 埠改為 Untagged 埠,要怎麼測試這是否帶來了差異?
打開 Wireshark
我嘗試了幾種不同的命令列工具來診斷裝置的網路狀態,但最後發現最有用的還是 Wireshark。
我平常不太想打開 Wireshark。它是個很棒的工具,但我總是在尋找與我問題相關的資訊時迷路。我預期一打開 Wireshark,就得重新學習它的過濾條件語法,而我從來都不太想這麼做。
但在這次的情況下,我完全不需要在 Wireshark 上做任何高深的操作。只要一打開,看到流量試圖從我的裝置送出卻沒有任何回應,我就立刻明白問題出在哪了。

Wireshark 的輸出讓我意識到交換器何時丟棄了來自測試裝置的所有流量。
重新開機
除錯 VLAN 問題最令人頭痛的一點,就是我永遠不確定測試電腦何時才會對新的 VLAN 設定做出反應。
我真希望這不是我找到最可靠的重置網路狀態的方法,但事實就是如此。雖然很麻煩,因為根據主機運行的系統不同,需要花 30 到 90 秒,測試週期很慢。但比起其他任何方法,它確實最能確保系統在交換器的 VLAN 設定變更後重置網路狀態。
我相信一定有更好的方法,只是我還沒找到。
使用遠端管理工具
我得承認自己有偏心,因為 TinyPilot 是我的產品,但我發現 TinyPilot 在除錯 VLAN 問題時很有幫助。
我一開始嘗試在 Proxmox VM 伺服器上的虛擬機中除錯 VLAN,但那與我想模擬的實際 IoT 裝置差異太大。Proxmox 伺服器是支援 VLAN 的裝置,而我想測試的是不支援 VLAN 的裝置。把 Proxmox 伺服器當作 Untagged 埠來對待,會讓我完全無法存取 Proxmox 伺服器。
使用 TinyPilot 後,即使測試裝置失去網路連線,我仍然可以存取它。而且因為所有設定都是透過瀏覽器分頁操作的,我可以在我的主要桌機上完成所有操作。
在一個瀏覽器視窗中控制裸機測試伺服器,同時在另一個視窗中調整其交換器埠的 VLAN 設定的示範
ping
我發現最可靠的測試網路連線是否中斷的方法,就是老牌的 ping 工具。
我在兩個終端機視窗中分別執行了兩個 ping 指令。一個是 ping 防火牆的 10.0.80.1,另一個是 ping google.com。這兩個視窗可以分別告訴我何時與區域網路以及與 Google 的連線恢復或中斷。
ping 10.0.80.1 # Test connection to router
ping google.com # Test connection to Internetifconfig
令我驚訝的是,ifconfig 指令竟然這麼沒有幫助。我以為以下指令會強制重置網路設定:
IFACE="eth0"
sudo ifconfig "${IFACE}" down && \
sudo ifconfig "${IFACE}" up && \
sudo ifconfig "${IFACE}"通常,執行這些指令並不會重置網路狀態。我在交換器端將裝置從網路中移除後,再用 ifconfig 重置裝置的網路介面,但裝置仍然認為自己在舊的 VLAN 上擁有 IP。它一直要到重新開機後,才會取得新子網路上的 IP 位址。
dhclient
我看過其他人推薦 dhclient。這個指令序列應該可以強制主機釋放 DHCP 租約並重新請求:
dhclient -r
dhclient我在測試系統上無法讓它運作。第一個指令只是卡住,完全沒有釋放 DHCP 租約。
nslookup
我試了 nslookup,這是我以前不太常用的工具。它會告訴你 DNS 查詢的結果。
nslookup 最後對於除錯 VLAN 並沒有太大幫助,但它是個值得放在口袋備用的好工具。
常見陷阱
以下是我在 TP-Link 交換器上設定 VLAN 時遇到的陷阱。
- 我為某個 VLAN 指定了 Untagged 埠,卻忘了同時為該埠設定 PVID。
- 我將某個埠加入 VLAN,卻忘了將路由器的埠也加入同一個 VLAN。
- 我忘了如果支援 VLAN 的裝置 A 是透過支援 VLAN 的裝置 B 連接到防火牆,那麼裝置 B 就必須知道裝置 A 的所有 VLAN。否則,裝置 B 會在封包到達防火牆之前,直接丟棄所有無法識別的 VLAN 封包。
- 如果你沒有點擊 TP-Link 導覽列上的 “Save” 按鈕,交換器會在下次重新開機時清除你所做的變更。
隨機一篇部落格