Debugging VLANs on my TP-Link Managed Switch

Michael Lynch

在我的 TP-Link 網管型交換器上除錯 VLAN

原文由 Michael Lynch 發布,訂閱此部落格

我最近買了人生第一台網管型交換器,是 TP-Link JetStream TL-SG3428X

我的 TP-Link 網管型交換器的照片

網管型交換器最主要的功能,就是能讓你把網路切成多個 VLAN。我對這個功能很期待,但實際上卻花了好幾個小時反覆嘗試,才終於讓 VLAN 正常運作。

我覺得 TP-Link 的 VLAN 說明文件寫得不太完整,所以把自己的筆記整理出來,希望能幫到其他人。

背景

如果你還不太熟悉 VLAN,我最推薦的入門解說是 Raid Owl 關於此主題的影片

Tagged 連接埠、Untagged 連接埠與 PVID

不同廠牌的設備對 VLAN 功能的稱呼不太一樣。

在 TP-Link 交換器上,你需要了解的幾個關鍵設定是:

  • Tagged 連接埠
  • Untagged 連接埠
  • PVID

Tagged 連接埠

當你把某個連接埠以 tagged 連接埠的身分加入 VLAN 時,交換器就會允許接在該連接埠上的裝置與這個 VLAN 互傳流量。

在 tagged 連接埠上,交換器會保留封包上的 VLAN 標籤,因此你應該把支援 VLAN 的裝置設為 VLAN 的 tagged 成員。支援 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 連接埠一樣。差別在於,交換器在把封包送往該連接埠之前,會先把封包上的 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 設定:

  1. 在上方導覽列點選 “L2 Features”
  2. 在左側選單點選 “VLAN”
  3. 在子選單中點選 “802.1Q VLAN”
TP-Link 網頁介面上 VLAN 設定的截圖

在 TP-Link 網管型交換器上找到 VLAN 設定的方式

“VLAN Config” 分頁可以讓你新增 VLAN,並設定哪些連接埠是該 VLAN 的成員。

“Port Config” 分頁則可以設定各個連接埠的 PVID。一樣,只有直接連接需要加入 VLAN 的不支援 VLAN 裝置的連接埠,才需要設定 PVID。如果你要為某個連接埠設定 PVID,它應該只會以 untagged 模式隸屬於單一 VLAN。

為什麼 TP-Link 要我們手動管理 PVID?

有些交換器根本不會讓你設定 PVID。它們只會顯示 tagged 和 untagged 連接埠,交換器會自動幫你設定好 PVID。

來自 Raid Owl 影片的截圖,顯示 QNAP 交換器上更好用的 VLAN 管理介面

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 無線基地台,提供兩個使用不同 VLAN 的無線網路
  • 我的 OPNsense 防火牆,負責對跨 VLAN 或通往網際網路的封包套用防火牆規則
  • 我的 Proxmox 伺服器,會為特定虛擬機的網路介面加上 VLAN 標籤

我加裝網管型交換器之前的家用網路

請注意,在這張架構圖中,我沒有把多個支援 VLAN 的裝置串接在一起。這個簡化的架構讓設定輕鬆很多,而這點直到我升級到網管型交換器後才意識到。

錯誤一:把非網管型交換器換成網管型交換器,結果 Wi-Fi 斷網了

買了 TP-Link TL-SG3428X 之後,我就直接把它換掉原本的非網管型交換器。網路架構圖其實沒什麼變:

我加裝網管型交換器之前的家用網路

裝上新的網管型交換器幾分鐘後,我未婚妻就跟我說她的筆電不能上網了。我拿起手機一看,也是一樣的狀況。

所有 Wi-Fi 裝置都能連上無線網路,但就是無法連上網際網路。怎麼會這樣?我明明沒有動到任何防火牆設定,只是把非網管型交換器換成網管型而已。

搞了好幾個小時後,我才發現問題所在。我的網管型交換器把所有帶有標籤的封包都丟掉了。流量可以從 Wi-Fi 裝置到達基地台,但交換器因為完全不認識我的 VLAN,所以直接把帶有 VLAN 標籤的封包全部擋掉。

當我把非網管型交換器換成網管型交換器後,網管型交換器開始丟棄來自無線基地台、帶有 VLAN 標籤的流量。

解決方法就是讓這台網管型交換器認識我現有的 VLAN。否則,交換器就會繼續把所有帶有 VLAN 標籤的封包丟掉。

修正後的網管型交換器設定如下:

VLAN IDVLAN 名稱連接埠(Tagged)
1SystemAll
10Trusted1(防火牆)、17(無線基地台)
20Guest1(防火牆)、17(無線基地台)

改完這個設定後,Wi-Fi 裝置就又能上網了。交換器認得它們的 VLAN 標籤,並把流量轉送到我的 OPNsense 防火牆。

錯誤二:忘了把路由器加入 VLAN

後來我想把一個不受信任的裝置加入網路時,又遇到了另一個問題。我家屋頂裝有太陽能板,為了監控發電狀況,必須使用這個專屬的物聯網裝置。

手拿著插有 RJ45 網路線的小裝置的照片

我網路中一個不受信任的物聯網裝置,用來追蹤戶外太陽能板的狀態

這個物聯網裝置需要連上網際網路,才能把數據上傳到廠商的雲端儀表板。我完全不知道這個小盒子還會在背後搞什麼名堂,所以不想讓它存取家裡網路上的任何東西。

我在 OPNsense 防火牆上建立了一個名為「Purgatory(煉獄)」的新 VLAN,專門給那些比訪客更不受信任的裝置使用。位於 Purgatory 的裝置可以存取 DNS 伺服器和公開的網際網路 IP,但無法存取其他任何 VLAN。

Purgatory 防火牆規則的 OPNsense 截圖,允許 DNS 並阻擋對內部網路的流量

Purgatory VLAN 的防火牆規則

接著,我把 TP-Link 交換器上接著太陽能監控物聯網裝置的連接埠加入 Purgatory VLAN。這個物聯網裝置是不支援 VLAN 的裝置,所以我把它設為 Purgatory 的 untagged 成員,並把 Purgatory 的 VLAN ID(80)指定為該連接埠的 PVID。

把連接埠以 untagged 模式加入 VLAN,會在封包送達物聯網裝置前把 VLAN 標籤移除。指定 PVID 則會在物聯網裝置發出的封包進入交換器時,為其加上 VLAN 標籤。

TP-Link 交換器上 Purgatory VLAN 的截圖。連接埠 24 以 untagged 模式加入該 VLAN,該 VLAN 沒有其他成員。TP-Link 連接埠設定中連接埠 24 的截圖,顯示其 PVID 為 80

我把這個不受信任的物聯網裝置以 untagged 模式加入 Purgatory VLAN。

但這樣並沒有用。雲端儀表板立刻顯示該物聯網裝置離線。

我沒辦法在那個物聯網裝置上執行任何診斷,所以改用另一台系統來除錯。我把我的 Dell OptiPlex NixOS 系統加入 Purgatory VLAN,結果它也一樣斷網了。只要待在 Purgatory VLAN 裡,就無法 ping 到網路上的任何裝置。

我絞盡腦汁想找出問題,試著把測試裝置設為 tagged、untagged、PVID 1、PVID 80,各種組合都試過了,還是沒用。裝置就是無法加入網路。

我檢查了 OPNsense 防火牆,發現 Purgatory VLAN 上完全沒有任何流量。我也確認了 DHCP 設定,Purgatory VLAN 的 DHCP 伺服器確實有在運作。

這樣煩惱了三個晚上後,我終於恍然大悟:我根本沒把 OPNsense 防火牆加入 Purgatory VLAN!

當時的狀況是:

  1. 物聯網裝置把流量送往 TP-Link 網管型交換器。
  2. 交換器為其加上 Purgatory 的 VLAN 標籤。
  3. 帶有 Purgatory 標籤的封包無處可去,因為 Purgatory VLAN 上根本沒有其他主機。

解決方法很簡單:把 OPNsense 防火牆加入 Purgatory VLAN。因為防火牆是支援 VLAN 的裝置,所以我把它以 tagged 模式加入:

TP-Link 交換器上 Purgatory VLAN 的截圖。連接埠 24 以 untagged 模式、連接埠 1 以 tagged 模式加入該 VLAN。

我修正後的 Purgatory VLAN TP-Link 設定,這樣物聯網裝置就能透過 OPNsense 防火牆連上網際網路

VLAN IDVLAN 名稱連接埠(Tagged)連接埠(Untagged)
80Purgatory1(防火牆)24(物聯網裝置)

我原本為連接埠 24 設定的 PVID 是正確的。它本來就必須是 80,因為交換器需要把物聯網裝置送進交換器的封包標上 Purgatory 的 VLAN 標籤 80。

改完這些設定後,物聯網裝置就能連上雲端儀表板了,同時也與我的家用網路妥善隔離。

除錯 VLAN 問題的小技巧

除錯 VLAN 問題時最大的挑戰之一,就是要找到方法來觀察設定變更到底產生了什麼效果。如果我把某個連接埠從 tagged 改成 untagged,要怎麼測試這樣改有沒有差?

打開 Wireshark

我試過好幾種命令列工具來診斷裝置的網路狀態,但最後發現最有用的還是 Wireshark。

平常我不太想動用 Wireshark。它是個很棒的工具,但每次要找跟問題相關的資訊時,總讓我眼花撩亂。我本來以為一打開 Wireshark,就又得重新學習它的過濾語法,一想到就提不起勁。

但這次,我完全不需要對 Wireshark 做什麼高深的操作。只要一打開,看到裝置拼命往外送流量卻什麼回應都收不到,我就馬上明白問題出在哪了。

Wireshark 的截圖

Wireshark 的輸出讓我發現交換器何時把測試裝置的所有流量都丟掉了。

重新開機

除錯 VLAN 時最頭痛的一點,就是永遠不確定測試電腦到底什麼時候才會「感應」到新的 VLAN 設定。

我真希望這不是我找到最可靠的重設網路狀態的方法,但它就是。很麻煩,因為根據主機的系統不同,得花 30 到 90 秒,測試週期很慢。但比起其他方法,它最能確保系統在交換器 VLAN 設定變更後,確實重設了網路狀態。

我相信一定有更好的方法,只是我沒找到。

使用遠端管理工具

我得承認有點私心,因為 TinyPilot 是我的產品,但我在除錯 VLAN 問題時,真的覺得 TinyPilot 很有幫助。

一開始我是想在 Proxmox 伺服器上的虛擬機裡除錯 VLAN,但那跟我要模擬的實際物聯網裝置差太多了。Proxmox 伺服器本身就支援 VLAN,如果把 Proxmox 伺服器當成 untagged 連接埠,就會讓我完全連不上 Proxmox 伺服器。

有了 TinyPilot,就算測試裝置斷網了,我還是能隨時存取它。而且因為所有設定都是透過瀏覽器分頁操作,我可以直接在主力桌機上完成所有事。

示範:在一個瀏覽器視窗中控制實體測試伺服器,同時在另一個視窗中調整該交換器連接埠的 VLAN 設定

ping

要觀察網路連線是否中斷,我發現最可靠的方法還是老牌的 ping 工具。

我在兩個終端機視窗中分別執行兩個 ping 指令。一個是對防火牆 10.0.80.1,另一個是對 google.com。這兩個視窗可以分別告訴我何時與區域網路以及與 Google 的連線中斷或恢復。

ping 10.0.80.1    # Test connection to router
ping google.com   # Test connection to Internet

ifconfig

讓我意外的是,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” 按鈕,下次交換器重新開機時,就會把你做的變更全部清除。

本文章由 muse-spark-1.2-contributor 進行翻譯

留言