交换机安全加固经常被跳过,因为它在网络拓扑里太「底层」,出问题时又太致命:一台默认口令未改、开着 Telnet 和 SNMP v2c 的接入交换机,等于把整个二层域的管理权交出去。攻击者从某个闲置网口接入,做一次 MAC 泛洪把 CAM 表撑满,交换机就退化成集线器,同网段所有流量对他可见。这类问题不靠边界防火墙解决,因为流量压根没经过防火墙。
本文按「管理面 → 控制面 → 数据面」的顺序给出一套可直接落地的交换机安全加固配置,同时给出 Cisco IOS 与 H3C Comware 两套命令。802.1X 准入认证属于另一套体系,本文不涉及,避免配置互相干扰。
适用场景
- 办公网、机房接入层交换机仍在使用出厂默认口令,或只用一台共享账号登录。
- 设备管理地址与业务地址混在同一 VLAN,任何一台中毒主机都能尝试登录交换机。
- 会议室、打印区、空闲工位的网络面板长期可插,外来设备接上即通。
- 发生过 ARP 欺骗或 MAC 地址冲突,怀疑存在私接路由器、抓包行为。
- 等保测评提出「网络设备身份鉴别」「登录失败处理」「审计留痕」等整改项。
- 运维交接后发现没人说得清交换机到底配了什么,需要先建立配置基线。
前置条件
- 交换机的当前管理权限,以及一段可接受中断的维护窗口(建议非工作时间)。
- 规划好的管理 VLAN 与网段,例如
VLAN 99/10.0.99.0/24,与业务网段分离。 - 一台可用的 RADIUS 或 TACACS+ 服务器;没有就先配本地账号,但必须保留本地兜底。
- 配置备份通道:TFTP 服务器或
copy running-config到本地,改动前先备份。 - 一台带外管理设备(Console 服务器或串口线),防止改错 VTY 把自己锁在门外。
- 记录在册的端口用途表:哪个口接 AP、哪个口接打印机、哪个口是空闲的。
原理说明
交换机的攻击面按三个平面划分,加固顺序也照这个来。
管理面是登录设备的通道:Telnet、HTTP、SSH、SNMP、Console。风险集中在三点——明文传输(Telnet、HTTP、SNMP v1/v2c 的 community 串)、弱认证(默认口令、共享账号、无失败锁定)、无审计(谁在什么时候改了什么没人知道)。加固手段是关闭明文协议、强制 SSH v2、接入 AAA 集中认证、把 SNMP 升到 v3 并删除默认 community。
控制面是设备之间交换信息的协议:CDP、LLDP、STP、DTP。CDP 会把设备型号、IOS 版本、管理 IP、相连端口一股脑广播给邻居,对攻击者来说是一份免费的拓扑测绘报告,配合已知版本的漏洞就能精准打击。加固手段是对外端口关闭 CDP,并把接入口的 DTP 关掉、显式指定 access 模式,防止 VLAN 跳跃。
数据面是用户流量本身。二层最常见的两类攻击是 MAC 泛洪(伪造海量源 MAC 撑爆 CAM 表,迫使交换机对所有帧泛洪)和私接设备(把家用路由器、抓包主机插进空闲面板)。对应的加固手段是端口安全(限制每端口可学习的 MAC 数量与违规动作)和闲置端口封堵(shutdown 并划入黑洞 VLAN)。
三层加固之间有依赖关系:管理面没收敛,后面两层随时可以被改回去;控制面没关,攻击者能先摸清拓扑再挑目标;数据面没做,前面两层就成了「门锁装得很好但窗户开着」。所以顺序不能反。
操作步骤
步骤 1:备份当前配置
任何改动之前先留一份可回滚的配置。这一步不是形式主义,改错 VTY 或 ACL 会导致设备失联,没有备份只能现场接 Console。
! Cisco IOS
enable
copy running-config startup-config
copy running-config tftp://10.0.99.50/SW1-before-$(date).cfg
! 记录当前管理面现状,作为整改前基线
show running-config | include (telnet|http|snmp-server|cdp|line vty)
show ip interface brief
show vlan brief
步骤 2:管理 VLAN 与 SSH-only 登录
把管理地址从业务 VLAN 里摘出来,单独一个 VLAN 承载设备管理,再用 ACL 限定只有运维网段能访问。同时强制 SSH v2,关闭 Telnet 与 HTTP 服务。
! Cisco IOS
conf t
vlan 99
name MGMT
exit
interface Vlan99
description MGMT-ONLY
ip address 10.0.99.2 255.255.255.0
no shutdown
exit
! 生成 3072 位 RSA 密钥,SSH v2 强制
ip domain-name wafai.local
crypto key generate rsa modulus 3072
ip ssh version 2
ip ssh time-out 30
ip ssh authentication-retries 3
! 关闭明文管理服务
no ip http server
no ip http secure-server
no service pad
no ip bootp server
no ip source-route
! VTY 只允许 SSH,超时 10 分钟
line vty 0 15
transport input ssh
exec-timeout 10 0
logging synchronous
exit
注意 transport input ssh 生效后当前 Telnet 会话不会立刻断开,但下一次连接就必须走 SSH。改完先用新开一个 SSH 会话验证能登录,再退出旧会话,避免把自己锁死。
步骤 3:AAA 集中认证与本地兜底
共享账号最大的问题是无法追责。接 TACACS+ 后每条命令都有记录,同时必须保留 local 兜底,否则认证服务器一挂,全网设备都登不进去。
! Cisco IOS
aaa new-model
tacacs server TAC1
address ipv4 10.0.99.60
key 7 WafaiTacacs2026
exit
aaa group server tacacs+ TACGRP
server name TAC1
exit
aaa authentication login default group TACGRP local
aaa authentication enable default group TACGRP enable
aaa authorization exec default group TACGRP local
aaa accounting commands 15 default start-stop group TACGRP
! 本地兜底账号,权限 15,密码用强口令
username netops privilege 15 secret Wafai@Ops#2026
line vty 0 15
login authentication default
exit
aaa accounting commands 15 default start-stop 是留痕的关键:它把每一条权限 15 的命令连同执行者、时间一起送到服务器。没有这一行,出事之后只能看到「有人登录过」,看不到「他改了什么」。
步骤 4:SNMP 升级到 v3 并清理 community
SNMP v1/v2c 的 community 串等同于明文口令,很多设备还保留着 public/private 默认值,用一条 snmpwalk 就能把整台设备的配置和接口表拖走。升级到 v3 的认证加密模型,并显式删除所有 community。
! Cisco IOS
no snmp-server community public RO
no snmp-server community private RW
snmp-server group NMS v3 priv
snmp-server user monitor NMS v3 auth sha WafaiAuth2026 priv aes 128 WafaiPriv2026
snmp-server host 10.0.99.70 version 3 priv monitor
snmp-server enable traps snmp authentication linkdown linkup
snmp-server location IDC-A-Rack12
snmp-server contact netops@wafai.cn
! 关闭 CDP 对外通告(全局关闭后按需在信任口开启)
no cdp run
logging host 10.0.99.70
service timestamps log datetime msec localtime
logging trap notifications
步骤 5:闲置端口封堵与端口安全
先建一个不配 SVI 的黑洞 VLAN,把空闲端口划进去再 shutdown,形成双保险:即使有人能远程把端口 up 起来,流量也没有三层出口。在用端口则用端口安全限制 MAC 数量。
! Cisco IOS
vlan 999
name BLACKHOLE
exit
! 空闲端口:划入黑洞 VLAN 并关闭
interface range GigabitEthernet1/0/21 - 48
description UNUSED-DO-NOT-PATCH
switchport mode access
switchport access vlan 999
shutdown
exit
! 在用接入端口:限制 MAC 数量,违规只告警不直接封口
interface range GigabitEthernet1/0/10 - 20
switchport mode access
switchport access vlan 20
switchport port-security
switchport port-security maximum 2
switchport port-security mac-address sticky
switchport port-security violation restrict
switchport port-security aging time 120
storm-control broadcast level 1.00
storm-control action trap
no cdp enable
spanning-tree portfast
spanning-tree bpduguard enable
exit
violation restrict 比 shutdown 更适合办公网:触发时只丢弃超限 MAC 的帧并记日志,不会让端口彻底 err-disable 导致业务中断。bpduguard 用于阻断私接路由器把 BPDU 灌进网络,这是造成 STP 震荡、全网瞬断的常见原因。
步骤 6:H3C Comware 对应配置
H3C 的语法差异集中在视图切换与命令名,加固思路完全一致。以下配置在 Comware V7 上验证可用。
# H3C Comware V7
system-view
sysname SW1
vlan 99
description MGMT
quit
interface Vlan-interface99
ip address 10.0.99.2 255.255.255.0
quit
# 关闭 Telnet,只留 SSH
telnet server disable
ssh server enable
public-key local create rsa
local-user netops class manage
password simple Wafai@Ops#2026
service-type ssh
authorization-attribute user-role network-admin
quit
line vty 0 4
authentication-mode scheme
protocol inbound ssh
user-role network-admin
idle-timeout 10 0
quit
# SNMP v3 与关闭明文版本
undo snmp-agent
snmp-agent
snmp-agent sys-info version v3
snmp-agent group v3 NMS privacy
snmp-agent usm-user v3 monitor NMS simple authentication-mode sha WafaiAuth2026 privacy-mode aes128 WafaiPriv2026
snmp-agent target-host trap address udp-domain 10.0.99.70 params securityname monitor v3 privacy
# 端口安全
port-security enable
interface range GigabitEthernet1/0/10 to GigabitEthernet1/0/20
port link-type access
port access vlan 20
port-security max-mac-count 2
port-security port-mode autolearn
port-security intrusion-mode blockmac
undo lldp enable
quit
interface range GigabitEthernet1/0/21 to GigabitEthernet1/0/48
port link-type access
port access vlan 999
shutdown
quit
save force
save force 千万别漏。Comware 的 system-view 改动只在运行配置里,重启即丢,现场最常见的「配了但没生效」都是这个原因。
步骤 7:管理源 ACL 收敛
最后一道闸:即便密码泄露,也只允许运维网段发起管理连接。ACL 末尾必须显式 deny any log,否则默认放行,这道闸形同虚设。
! Cisco IOS
ip access-list standard MGMT-ACCESS
permit 10.0.99.0 0.0.0.255
deny any log
exit
line vty 0 15
access-class MGMT-ACCESS in
exit
! H3C 对应写法
# acl basic 2000
# rule 0 permit source 10.0.99.0 0.0.0.255
# rule 10 deny
# quit
# ssh server acl 2000
配置验证
! 管理面
show ssh
show users
show running-config | include (transport input|ip http|snmp-server community|cdp run)
! 端口安全
show port-security
show port-security interface GigabitEthernet1/0/10
show port-security address
! ACL 命中情况
show ip access-lists MGMT-ACCESS
! 保存
copy running-config startup-config
验收标准四条:VTY 只剩 SSH 且 Telnet 连不上;show port-security address 能看到已绑定 MAC;空闲端口状态为 administratively down 且属于 VLAN 999;MGMT-ACCESS 有命中计数(说明 ACL 真的在生效而不是空挂)。
常见问题
FAQ 1:开启端口安全后虚拟机迁移或笔记本换网口就断网
sticky MAC 把第一次学到的地址钉在端口上,设备换口后新端口不认识它,旧端口又还占着配额。两种处理:一是给服务器端口改成 maximum 4 并缩短 aging time(例如 30 分钟),让绑定自动过期;二是对虚拟化宿主机的上联口使用 maximum 16 甚至关闭端口安全,只保留 storm-control 与 bpduguard,因为一台宿主机背后可能是几十台虚拟机,MAC 数量天然多。不要为了统一管理把所有端口都设成 1,这会把运维成本转嫁到每一次设备更换上。
FAQ 2:关闭 CDP 后 IP 电话、无线 AP 拿不到语音 VLAN
部分 IP 话机依赖 CDP 或 LLDP-MED 协商语音 VLAN 与供电策略。正确做法是全局 no cdp run 之后,在接话机与 AP 的端口单独 cdp enable(或保留 LLDP),其余用户端口保持关闭。这样既避免拓扑信息向办公区泄露,又不破坏语音业务。改之前先用 show cdp neighbors detail 摸清哪些端口有邻居,逐口确认用途再动手。
FAQ 3:配完 ACL 后自己也被挡在外面
典型原因是管理 ACL 只允许了运维网段,而当前会话来自其他网段;或者 access-class 配在了错误的方向。恢复路径:Console 或带外口登录,line vty 0 15 下先 no access-class MGMT-ACCESS in,把 ACL 修好再挂回去。预防手段是改动前保留一个已建立的 SSH 会话不退出,并用 reload in 10 设置定时重启兜底,验证通过后 reload cancel。
总结
交换机安全加固的核心不是某一条命令,而是一个不可颠倒的顺序:先把管理面收敛到 SSH + AAA + SNMPv3,再关掉 CDP/DTP 减少信息泄露,最后用端口安全和闲置端口封堵守住数据面。三层的成本都不高,收益却是把「接入即通」变成「接入需授权、越权有记录」。
对中小网络来说,最容易漏的两件事:一是 aaa accounting commands 15 没配,出事查不到人;二是配完不 copy running-config startup-config(H3C 是 save force),重启后全部回退。把这两条纳入变更检查清单,加固效果才不会随时间流失。