在 TP-Link 网管交换机上调试 VLAN
原文由 Michael Lynch 于 发布,订阅该博客
前不久我买了人生中第一台网管交换机——TP-Link JetStream TL-SG3428X。

网管交换机的主要功能是可以把网络划分成多个 VLAN。我对这个功能很是期待,但为了让 VLAN 真正跑起来,我花了好几个小时反复尝试。
我觉得TP-Link 的 VLAN 文档写得不够清楚,所以把自己的笔记分享出来,希望能帮到其他人。
背景
如果你对 VLAN 还不太了解,我最推荐的入门讲解是Raid Owl 关于这个主题的视频。
带标签端口、不带标签端口和 PVID
不同厂商描述 VLAN 功能时会使用不同的术语。
在 TP-Link 交换机上,需要了解的相关设置有:
- 带标签端口
- 不带标签端口
- PVID
带标签端口
当你把某个端口作为带标签端口加入到 VLAN 时,交换机会允许连接在该端口上的设备在该 VLAN 中收发流量。
在带标签端口上,交换机会保留数据包上的 VLAN 标签,因此应将支持 VLAN 的设备作为 VLAN 的带标签端口加入。支持 VLAN 的设备包括防火墙、其他网管交换机以及支持 VLAN 的无线接入点等。
例如,如果你把端口 5 作为带标签端口加入 VLAN 10 和 20,那么交换机向该端口发送数据包时会带上 VLAN 10 和 20 的标签。它不会去掉标签,因此端口 5 上的设备收到的数据包仍会带有 VLAN 标签。该设备不会收到带有其他 VLAN 标签的数据包,因为只放行了 10 和 20。

示例:将某个端口作为带标签端口加入 VLAN 10 和 20。交换机只会放行带有 VLAN 10 和 20 标签的流量,而会拒绝其他流量,例如带有 VLAN 30 标签的数据包。
不带标签端口
当你把某个端口作为不带标签端口加入 VLAN 时,交换机同样会允许连接在该端口上的设备在该 VLAN 中收发流量,这一点与带标签端口相同。区别在于,对于不带标签端口,交换机在把数据包转发到该端口之前,会去掉数据包上的 VLAN 标签。
不带标签端口适用于不支持 VLAN 的设备,例如普通的台式电脑、扫描仪或打印机。交换机会去掉 VLAN 标签,因为连接在该端口上的设备根本不理解 VLAN。
例如,如果你把端口 6 作为不带标签端口加入 VLAN 10,那么交换机向该端口发送带有 VLAN 10 标签的数据包时,会在转发前去掉标签。端口 6 上的设备收到的数据包将不带任何 VLAN 标签。该设备也不会收到带有其他 VLAN 标签的数据包,因为只放行了 VLAN 10。

PVID
在 TP-Link 交换机上,每个端口都有一个PVID,即端口 VLAN 标识符。当数据包从所连接的设备通过该端口进入交换机时,交换机会把该端口的 PVID 作为 VLAN 标签添加到数据包上。
带标签端口和不带标签端口决定的是数据包如何从交换机发往端口,而 PVID 影响的是数据包如何从端口进入交换机。

对于连接了支持 VLAN 设备的端口,你不需要设置 PVID,因为这些设备自己就会打上 VLAN 标签。
对于连接了不支持 VLAN 设备的端口,则必须设置 PVID,因为交换机需要替这些设备打上正确的 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,该端口应该只作为不带标签端口属于某一个 VLAN。
为什么 TP-Link 要让我们手动管理 PVID?
有些交换机的配置中根本不出现 PVID。它们只显示带标签端口和不带标签端口——交换机会自动为你设置好 PVID。

QNAP 网管交换机 VLAN 管理界面的截图。QNAP 的界面比 TP-Link 直观得多。
在不暴露 PVID 设置的交换机上,把某个端口作为不带标签端口加入 VLAN 20,就意味着自动将该端口的 PVID 设为 20。我真希望 TP-Link 也采用这种做法,它们的实现方式实在是把简单问题复杂化了。
以下是我在 TP-Link 交换机上管理不带标签端口和 PVID 的经验法则:
- 如果将不支持 VLAN 的设备连接到交换机,它应该只属于某一个 VLAN。
- 将该设备的端口作为不带标签端口加入该 VLAN。
- 将该端口的 PVID 设为该 VLAN 的 ID。
- 将该端口从其他所有 VLAN 中移除。
例如,如果你把打印机接在交换机的端口 16 上,并想让它归属 VLAN 20,就需要把端口 16 作为不带标签端口加入 VLAN 20,并将端口 16 的 PVID 设为 20。
TP-Link 技术上允许将同一个端口作为不带标签端口同时加入多个 VLAN,但我认为几乎没有任何理由这样做。这会导致该设备可以接收来自其他 VLAN 设备的报文,但只能向与该端口 PVID 对应的那一个 VLAN 中的设备发送报文。
换上网管交换机之前的家庭网络
在入手网管交换机之前,我已经在使用 VLAN 了,只不过当时是通过一台非网管交换机来连接的。
当时网络中相关的设备有:
- 我的台式电脑,可以访问所有 VLAN
- 我的 Ruckus 无线接入点,承载了两个分属不同 VLAN 的无线网络
- 我的 OPNsense 防火墙,负责对跨 VLAN 以及访问互联网的流量执行防火墙规则
- 我的Proxmox 服务器,会为部分虚拟机的网卡打上 VLAN 标签

添加网管交换机之前的家庭网络
注意,在这张拓扑图中,没有 VLAN 感知设备是串联连接的。这让配置简单了很多,而这一点直到我升级到网管交换机后才意识到。
坑一:用网管交换机替换非网管交换机,导致 WiFi 无法上网
买回 TP-Link TL-SG3428X 后,我直接用它替换了原来的非网管交换机。网络拓扑几乎没有变化:

添加网管交换机之前的家庭网络
装上新的网管交换机几分钟后,未婚妻告诉我她的笔记本上不了网了。我看了看自己的手机,也是一样。
所有 WiFi 设备都能连上无线网络,但就是无法访问互联网。这怎么可能呢?我根本没改过任何防火墙设置,只是把一台非网管交换机换成了网管交换机而已。
折腾了好几个小时后,我才弄明白问题所在。我的网管交换机把所有带标签的数据包都丢弃了。流量可以从 WiFi 设备到达接入点,但交换机却因为完全不认识我的 VLAN 而把所有带 VLAN 标签的数据包都拒之门外。

当我用网管交换机替换掉非网管交换机后,网管交换机开始丢弃来自无线接入点的带 VLAN 标签的流量。
解决办法就是让这台网管交换机认识我已有的 VLAN。否则,它会继续丢弃所有带 VLAN 标签的数据包。
修复后的网管交换机配置如下:
| VLAN ID | VLAN 名称 | 端口(带标签) |
|---|---|---|
| 1 | System | 全部 |
| 10 | Trusted | 1(防火墙)、17(无线接入点) |
| 20 | Guest | 1(防火墙)、17(无线接入点) |
完成这些配置后,WiFi 设备又能上网了。交换机识别出了它们的 VLAN 标签,并将流量转发给了 OPNsense 防火墙。
坑二:忘记把路由器加入 VLAN
当我尝试向网络中添加一台不受信任的设备时,又遇到了另一个问题。我家装有太阳能板,为了监控其状态,必须使用这个专有的物联网设备。

网络中一台不受信任的物联网设备,用于监控屋外太阳能板的状态
这个物联网设备需要联网,才能把监测数据上传到厂商的云端面板。我完全不清楚这个小盒子还会在背后做什么,所以不想让它访问家庭网络中的任何其他设备。
我在 OPNsense 防火墙上新建了一个名为“Purgatory”(炼狱)的 VLAN,用于放置那些比访客设备更不可信的设备。“Purgatory”中的设备可以访问 DNS 服务器和公网 IP,但无法访问任何其他 VLAN。

Purgatory VLAN 的防火墙规则
接着,我在 TP-Link 交换机上把连接太阳能监控物联网设备的端口加入了 Purgatory VLAN。该设备不支持 VLAN,因此我将其设为 Purgatory 的不带标签端口,并把该端口的 PVID 设为 Purgatory 的 VLAN ID(80)。
将端口作为不带标签端口加入 VLAN,会在数据包到达物联网设备前去掉 VLAN 标签;而设置 PVID 则会在该设备向交换机发送数据包时为其打上 VLAN 标签。


我将这台不受信任的物联网设备作为不带标签端口加入了 Purgatory VLAN。
但这并没有生效。云端面板立刻显示该物联网设备离线。
我无法在这台物联网设备上运行任何诊断工具,所以需要换一台设备来调试。我把Dell Optiplex NixOS 系统加入了 Purgatory VLAN,结果它也失去了网络连接。只要它还在 Purgatory VLAN 中,就无法 ping 通网络上的任何设备。
我绞尽脑汁也想不明白到底哪里出了问题。我尝试把测试设备设为带标签端口、不带标签端口,PVID 设为 1、设为 80,各种组合都试过了,还是不行。设备就是无法加入网络。
我查看了 OPNsense 防火墙,发现 Purgatory VLAN 上完全没有任何流量。我又检查了 DHCP 设置,确认 Purgatory VLAN 的 DHCP 服务器确实在运行。
连续三个晚上为此抓狂之后,我终于恍然大悟:我根本就没把 OPNsense 防火墙加入 Purgatory VLAN!
当时的情况是这样的:
- 物联网设备向 TP-Link 网管交换机发送流量。
- 交换机为其打上 Purgatory 的 VLAN 标签。
- 由于 Purgatory VLAN 上没有其他主机,这些数据包无处可去。
解决办法很简单:把 OPNsense 防火墙加入 Purgatory VLAN。由于防火墙支持 VLAN,我将其添加为带标签端口:

修正后的 TP-Link Purgatory VLAN 配置,这样物联网设备就能通过 OPNsense 防火墙访问互联网了
| VLAN ID | VLAN 名称 | 端口(带标签) | 端口(不带标签) |
|---|---|---|---|
| 80 | Purgatory | 1(防火墙) | 24(物联网设备) |
我原来为端口 24 设置的 PVID 是正确的。该端口的 PVID 必须是 80,因为交换机需要为物联网设备发往交换机的数据包打上 Purgatory 对应的 VLAN 80 标签。
完成这些修改后,物联网设备就能连上云端面板了,同时也被正确地与家庭网络隔离开来。
调试 VLAN 问题的技巧
调试 VLAN 问题时最大的挑战之一,就是找到一种方法来观察配置修改到底产生了什么效果。如果我把某个端口从带标签端口改成不带标签端口,该如何验证这一改动是否起了作用?
打开 Wireshark
我尝试了好几种命令行工具来诊断设备的网络状态,但最终发现最有用的还是 Wireshark。
平时我不太愿意动用 Wireshark。它确实是个出色的工具,但我每次想找到与问题相关的信息时都会迷失其中。我总觉得一打开 Wireshark,就得重新学习它的过滤语法,这让我提不起劲。
而这一次,我完全不需要在 Wireshark 上做什么高深操作。刚一打开,看到设备有流量尝试向外发送却没有任何回包,我立刻就明白问题出在哪里了。

Wireshark 的输出让我意识到交换机正在丢弃测试设备的所有流量。
重启
调试 VLAN 问题时最让人头疼的一点是,我永远不确定测试电脑何时才会对新的 VLAN 设置“做出反应”。
我真希望这不是我找到的最可靠的重置网络状态的方法,但事实就是如此。这种方法很麻烦,因为根据主机系统的不同,需要 30 到 90 秒,测试周期很慢。但相比其他任何方法,它最能确保系统在交换机 VLAN 配置发生变化后真正重置网络状态。
我相信肯定有更好的办法,只是我没找到。
使用远程管理工具
我承认这有点自卖自夸,因为 TinyPilot 是我的产品,但我在调试 VLAN 问题时确实觉得 TinyPilot 很有帮助。
起初我尝试在 Proxmox 虚拟化服务器上的虚拟机里调试 VLAN,但这与我想要模拟的真实物联网设备差别太大了。Proxmox 服务器本身支持 VLAN,而我要测试的是不支持 VLAN 的设备。如果把 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 指定了不带标签端口,却忘了同时为该端口设置 PVID。
- 把某个端口加入了 VLAN,却忘了把路由器的端口也加入同一个 VLAN。
- 忘记了如果支持 VLAN 的设备 A 通过支持 VLAN 的设备 B 连接到防火墙,那么设备 B 必须知晓设备 A 的所有 VLAN。否则,设备 B 会在数据包到达防火墙之前,直接丢弃所有不认识的 VLAN 的数据包。
- 如果没有点击 TP-Link 顶部导航栏中的“Save”按钮,交换机下次重启时会丢弃你所做的所有修改。
随机一篇博客
评论
登录后参与讨论