在 TP-Link 管理型交换机上调试 VLAN
我最近买了人生中第一台管理型网络交换机,是一台 TP-Link JetStream TL-SG3428X。

管理型交换机的主要功能是让你能把网络划分成 VLAN(Virtual Local Area Network,虚拟局域网)。我对这个功能非常期待,但为了把 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 和 VLAN 20,那么交换机会向该端口发送带有 VLAN 标签 10 和 20 的数据包。它不会剥掉标签,所以端口 5 上的设备收到的数据包仍然带有 VLAN 标签。该设备不会收到带有其他 VLAN 标签的数据包,因为只允许 10 和 20。

示例:把一个端口作为 tagged 端口加入 VLAN 10 和 VLAN 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 设置:
- 在导航栏中点击“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 ID 标签

我添加管理型交换机之前的家庭网络
请注意,在这个示意图中,没有任何支持 VLAN 的设备串联在一起。这大大简化了配置,而这一点直到我升级到管理型交换机后才意识到。
错误一:用管理型交换机替换非管理型交换机导致 WiFi 断网
买回 TP-Link TL-SG3428X 后,我只是直接把它替换掉之前的非管理型交换机。我的网络示意图基本没什么变化:

我添加管理型交换机之前的家庭网络
装好新的管理型交换机几分钟后,我的未婚妻告诉我她的笔记本电脑上不了网了。我看了看手机,发现同样如此。
WiFi 设备都能连上 WiFi 网络,但这个网络没有互联网访问。怎么会这样?我并没有改任何防火墙设置,只是把一台非管理型交换机换成了一台管理型的。
几个小时后,我意识到问题所在。我的管理型交换机把所有带标签的数据包都丢弃了。流量可以从 WiFi 设备到达接入点,但交换机拒绝带有 VLAN 标签的数据包,因为它对我的 VLAN 一无所知。

当我用管理型交换机替换非管理型交换机后,管理型交换机开始丢弃来自无线接入点的带 VLAN 标签的流量。
解决办法是告诉我的管理型交换机现有的 VLAN 信息。否则,交换机会继续丢弃所有带 VLAN 标签的数据包。
修复之后,我的管理型交换机配置如下:
| VLAN ID | VLAN 名称 | 端口(Tagged) |
|---|---|---|
| 1 | System | 全部 |
| 10 | Trusted | 1(防火墙)、17(无线接入点) |
| 20 | Guest | 1(防火墙)、17(无线接入点) |
改完配置后,我的 WiFi 设备又能上网了。交换机识别了它们的 VLAN 标签,并把流量转发到我的 OPNsense 防火墙。
错误二:忘记把路由器加入 VLAN
当我尝试把一台不受信任的设备接入网络时,又遇到了另一个问题。我家屋顶装了太阳能电池板,要监控它们的状态,就得用这个专有的 IoT 设备。

我网络上一个不受信任的 IoT 设备,用于跟踪室外太阳能电池板的状态
这个 IoT 设备需要互联网访问,以便把指标数据上传到厂商的云端仪表板。我不知道这个小盒子还可能在搞什么别的名堂,所以我不想让它访问我家庭网络上的任何东西。
我在 OPNsense 防火墙上创建了一个新 VLAN,叫作“Purgatory”,用来安置那些我连对客人都比不上信任的设备。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、设置 PVID 为 80,都不管用。我就是没法让这台设备加入网络。
我检查了 OPNsense 防火墙,发现 Purgatory VLAN 上完全没有流量。我检查了 DHCP 设置,确认 Purgatory VLAN 确实有 DHCP 服务器在运行。
在连续三个晚上抓耳挠腮之后,我终于恍然大悟:我从来没把我的 OPNsense 防火墙加入 Purgatory VLAN!
事情的经过是这样的:
- IoT 设备把流量发往 TP-Link 管理型交换机。
- 交换机给数据包加上 Purgatory 的 VLAN 标签。
- Purgatory 的数据包无处可去,因为 Purgatory VLAN 上没有任何其他主机。
解决办法很简单:把 OPNsense 防火墙加入 Purgatory VLAN。由于防火墙是支持 VLAN 的,我把它作为 tagged 端口加入:

我修正后的 TP-Link Purgatory VLAN 配置,它让 IoT 设备得以通过我的 OPNsense 防火墙访问互联网
| VLAN ID | VLAN 名称 | 端口(Tagged) | 端口(Untagged) |
|---|---|---|---|
| 80 | Purgatory | 1(防火墙) | 24(IoT 设备) |
我原本给端口 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 虚拟机服务器上的一个虚拟机里调试 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”按钮,交换机下次重启时会抹掉你的更改。
随机一篇博客