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 关于这个主题的视频

带标签端口、不带标签端口和 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 设置:

  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,该端口应该只作为不带标签端口属于某一个 VLAN。

为什么 TP-Link 要让我们手动管理 PVID?

有些交换机的配置中根本不出现 PVID。它们只显示带标签端口和不带标签端口——交换机会自动为你设置好 PVID。

来自 Raid Owl 视频的截图,展示了 QNAP 交换机上更完善的 VLAN 管理界面

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 IDVLAN 名称端口(带标签)
1System全部
10Trusted1(防火墙)、17(无线接入点)
20Guest1(防火墙)、17(无线接入点)

完成这些配置后,WiFi 设备又能上网了。交换机识别出了它们的 VLAN 标签,并将流量转发给了 OPNsense 防火墙。

坑二:忘记把路由器加入 VLAN

当我尝试向网络中添加一台不受信任的设备时,又遇到了另一个问题。我家装有太阳能板,为了监控其状态,必须使用这个专有的物联网设备。

手持小型设备的照片,设备上插着一根网线

网络中一台不受信任的物联网设备,用于监控屋外太阳能板的状态

这个物联网设备需要联网,才能把监测数据上传到厂商的云端面板。我完全不清楚这个小盒子还会在背后做什么,所以不想让它访问家庭网络中的任何其他设备。

我在 OPNsense 防火墙上新建了一个名为“Purgatory”(炼狱)的 VLAN,用于放置那些比访客设备更不可信的设备。“Purgatory”中的设备可以访问 DNS 服务器和公网 IP,但无法访问任何其他 VLAN。

Purgatory VLAN 防火墙规则的截图,显示允许 DNS 并拒绝访问内网

Purgatory VLAN 的防火墙规则

接着,我在 TP-Link 交换机上把连接太阳能监控物联网设备的端口加入了 Purgatory VLAN。该设备不支持 VLAN,因此我将其设为 Purgatory 的不带标签端口,并把该端口的 PVID 设为 Purgatory 的 VLAN ID(80)。

将端口作为不带标签端口加入 VLAN,会在数据包到达物联网设备前去掉 VLAN 标签;而设置 PVID 则会在该设备向交换机发送数据包时为其打上 VLAN 标签。

TP-Link 交换机上 Purgatory VLAN 的截图。端口 24 作为不带标签端口属于该 VLAN,该 VLAN 没有其他成员。TP-Link 端口配置中端口 24 的截图,显示其 PVID 为 80

我将这台不受信任的物联网设备作为不带标签端口加入了 Purgatory VLAN。

但这并没有生效。云端面板立刻显示该物联网设备离线。

我无法在这台物联网设备上运行任何诊断工具,所以需要换一台设备来调试。我把Dell Optiplex NixOS 系统加入了 Purgatory VLAN,结果它也失去了网络连接。只要它还在 Purgatory VLAN 中,就无法 ping 通网络上的任何设备。

我绞尽脑汁也想不明白到底哪里出了问题。我尝试把测试设备设为带标签端口、不带标签端口,PVID 设为 1、设为 80,各种组合都试过了,还是不行。设备就是无法加入网络。

我查看了 OPNsense 防火墙,发现 Purgatory VLAN 上完全没有任何流量。我又检查了 DHCP 设置,确认 Purgatory VLAN 的 DHCP 服务器确实在运行。

连续三个晚上为此抓狂之后,我终于恍然大悟:我根本就没把 OPNsense 防火墙加入 Purgatory VLAN!

当时的情况是这样的:

  1. 物联网设备向 TP-Link 网管交换机发送流量。
  2. 交换机为其打上 Purgatory 的 VLAN 标签。
  3. 由于 Purgatory VLAN 上没有其他主机,这些数据包无处可去。

解决办法很简单:把 OPNsense 防火墙加入 Purgatory VLAN。由于防火墙支持 VLAN,我将其添加为带标签端口:

TP-Link 交换机上 Purgatory VLAN 的截图。端口 24 作为不带标签端口属于该 VLAN,端口 1 作为带标签端口属于该 VLAN。

修正后的 TP-Link Purgatory VLAN 配置,这样物联网设备就能通过 OPNsense 防火墙访问互联网了

VLAN IDVLAN 名称端口(带标签)端口(不带标签)
80Purgatory1(防火墙)24(物联网设备)

我原来为端口 24 设置的 PVID 是正确的。该端口的 PVID 必须是 80,因为交换机需要为物联网设备发往交换机的数据包打上 Purgatory 对应的 VLAN 80 标签。

完成这些修改后,物联网设备就能连上云端面板了,同时也被正确地与家庭网络隔离开来。

调试 VLAN 问题的技巧

调试 VLAN 问题时最大的挑战之一,就是找到一种方法来观察配置修改到底产生了什么效果。如果我把某个端口从带标签端口改成不带标签端口,该如何验证这一改动是否起了作用?

打开 Wireshark

我尝试了好几种命令行工具来诊断设备的网络状态,但最终发现最有用的还是 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 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 指定了不带标签端口,却忘了同时为该端口设置 PVID。
  • 把某个端口加入了 VLAN,却忘了把路由器的端口也加入同一个 VLAN。
  • 忘记了如果支持 VLAN 的设备 A 通过支持 VLAN 的设备 B 连接到防火墙,那么设备 B 必须知晓设备 A 的所有 VLAN。否则,设备 B 会在数据包到达防火墙之前,直接丢弃所有不认识的 VLAN 的数据包。
  • 如果没有点击 TP-Link 顶部导航栏中的“Save”按钮,交换机下次重启时会丢弃你所做的所有修改。

本文章由 muse-spark-1.2-contributor 进行翻译

评论