引言
在二层网络中设计中,pVID(Port VLAN ID)、VLAN1以及VLAN跳跃攻击(VLAN Hopping) 是三个紧密关联的话题。他们直接关系到VLAN隔离是否有效、网络是否会被横向渗透
PVID的本质:端口的默认VLAN归属
PVID不是虚拟VLAN,而是交换机端口的一个属性。 它指向一个具体的VLAN ID,当端口收到无标签帧时,交换机会自动为其打上PVID对应的VLAN标签,然后在该VLAN内转发
- 收到标签帧时,交换机会检查标签VLAN是否在允许列表中
- PVID 只对“无标签流量”生效
默认情况
所有交换机端口出场时都自带PVID,且默认值为VLAN 1。无论华为、思科、H3C还是锐捷,都是如此。如果不手动修改,PVID 就是VLAN 1
为什么业务VLAN不能作为PVID
如果Trunk端口的PVID 被设置成为谋个业务VLAN(如VLAN 10),攻击者可以利用双重标签(Double Tagging)进行VLAN跳跃攻击。
要理解这种攻击,必须先了解交换机为什么会在特定情况下剥离VLAN标签
根据802.1Q标准,Trunk端口对PVID(本征VLAN)流量有特殊处理:
- 发送规则(出方向):
- 如果帧的VLAN ID等于Trunk端口的PVID ➡️剥离标签(变成无标签帧),然后发送。
- 如果帧的VLAN ID不等于Trunk端口的PVID ➡️保留标签,直接发送。
- 接收规则(入方向):
- 收到无标签帧 ➡️ 打上PVID的标签。
- 收到带标签帧 ➡️ 检查是否允许,允许则保留标签转发,否则丢弃。
这就是可以使用Double Tagging 攻击成功的示意图,前置条件挺多的。
当然还有一种情况是可以直接伪造VLAN 20进行通信
整体感觉不论那种情况都有点鸡肋,而且只能发不能收,即使伪造了成功,前置条件多,利用鸡肋,权当补充学习了。
相关知识补充
- Trunk口:允许多个带标签VLAN通过;PVID是这个端口不带流量帧时,给帧打上的VLAn标签。Trunk口向外转发PVID对应的VLAN流量时,会剥离标签,发出untage帧。
- Access 口:只能属于唯一一个VLAN,收到untag帧打上这个VLAN标签,发出去的时候永远剥离标签;
- Access 端口规则:收到任何带 VLAN 标签的数据包,直接丢弃
- 剥离标签,只发生在【端口出方向(发送报文)】;端口入方向(接收报文)永远不会剥离标签!
- Trunk发包前,同样校验 allowed vlan 白名单
Trunk链路PVID配置要求
两端PVID必须一致:如果两端PVID不同,无标签帧会错误被划入不同VLAN,导致流量泄露和STP计算混乱。
业务VLAN不能作为PVID,防止无标签帧意外落入业务VLAN,防范VLAN跳跃攻击
显式将PVID改为黑洞VLAN例如 prot trunk pvid vlan 999(华为/H3C),两端设备都要创建VLAN 999,但不放行它通过Trunk。
从允许列表中移除VLAN 1:undo port trunk allow-pass valn 1,防止带VLAN 1 标签的帧通过Trunk。
关闭DTP协商,在Cisco设备上,接入端口必须配置switchport nonegotiate,防止攻击者利用DTP把Access端口骗成Trunk。
禁用VLAN 1承载业务的完整要求
仅仅修改Trunk 的PVID为黑洞VLAN ,并不足以完全禁用VLAN 1,因为VLAN1 的威胁还存在于接入端口、管理VLAN和未使用的端口中,完整极限包括
| 检查项 | 正确配置 |
|---|---|
| 所有Access端口 | 必须显式划入业务VLAN,绝不留在默认的VLAN 1 |
| 所有Trunk端口PVID | 改为未使用的黑洞VLAN(如999),两端一致 |
| 所有Trunk端口允许列表 | 显式拒绝VLAN 1(undo port trunk allow-pass vlan 1) |
| 管理VLAN | 使用独立VLAN(如99),删除VLANIF 1的IP |
| 未使用端口 | 划入黑洞VLAN并shutdown |
| 黑洞VLAN(999) | 必须创建,但不在任何Trunk允许列表中放行,也不配三层接口 |
| DTP协商 | 接入端口强制Access模式,并关闭DTP协商(如Cisco的switchport nonegotiate) |