802.1X 实战与排错 — 基于端口的网络访问控制

EAPOL/RADIUS 抓包、wpa_supplicant 与 FreeRADIUS 配置、认证失败与拿不到 IP 的排查 / 数据链路层 / EtherType 0x888E

这篇你能学到

  • 分段定位:学会 802.1X 排错的第一原则——前段(客户端↔交换机,抓 EAPOL)和后段(交换机↔服务器,抓 RADIUS)分开抓,先判断故障落在哪一段,再往下钻。
  • 配得出来:Linux 端 wpa_supplicant(PEAP / EAP-TLS 两种写法)、交换机端 Cisco IOS dot1x 完整配置、服务端 FreeRADIUS clients.conf 与动态 VLAN 下发,以及 Windows 的 dot3svc
  • 修得回来:从"插网线拿不到 IP"“认证一直失败"“服务器不响应"“进错 VLAN"“打印机上不了网"“RADIUS 宕机全楼断网"六类现象出发,结论先行地定位根因。

1. 抓包观察

802.1X 排错必须两段分开抓:客户端到交换机抓 EAPOL,交换机到服务器抓 RADIUS。判断"故障在前段还是后段"是排错的第一个分叉点。

1.1 Wireshark 显示过滤式

这张表按"前段 / 后段"排列:上半部分(eapoleap)看客户端和交换机之间发生了什么,下半部分(radius)看交换机和服务器之间发生了什么。

过滤式作用
eapol所有 EAPOL 帧(客户端侧起手式)
eapol.type == 1仅 EAPOL-Start(客户端是否发起了认证)
eapol.type == 2仅 EAPOL-Logoff
eapol.type == 3EAPOL-Key(WPA 四次握手 / MACsec MKA)
eap所有 EAP 报文
eap.code == 1EAP-Request(服务器在问什么)
eap.code == 2EAP-Response(客户端答了什么)
eap.code == 3EAP-Success(认证成功的决定性证据)
eap.code == 4EAP-Failure(认证失败)
eap.type == 1EAP-Identity,可直接看到用户名明文
eap.type == 3EAP-NAK,说明客户端拒绝了服务器建议的方法(方法不匹配)
eap.type == 25PEAP;eap.type == 13 为 EAP-TLS
eth.type == 0x888e从链路层维度确认 EAPOL 帧存在
radius所有 RADIUS 报文(服务器侧起手式)
radius.code == 1Access-Request
radius.code == 2Access-Accept
radius.code == 3Access-Reject
radius.code == 11Access-Challenge(多轮 EAP 交换中大量出现)
radius.Calling_Station_Id contains "aa-bb-cc"按客户端 MAC 追踪某台设备的完整认证过程
radius.Tunnel_Private_Group_Id查看下发的动态 VLAN
radius && udp.port == 1812认证流量;1813 为计费流量

捕获过滤式(BPF)ether proto 0x888e(EAPOL)、udp port 1812 or udp port 1813(RADIUS)。这两条在抓包时就把无关流量丢掉,适合在交换机镜像口或服务器上长时间挂机采集。

1.2 一次成功认证应该看到的序列

下面这段是"健康基线”——把现场抓到的包和它逐行对照,第一个对不上的位置就是故障点。

客户端侧(EAPOL):

1
2
3
4
5
6
7
8
1 EAPOL-Start (客户端主动发起,可选)
2 EAP-Request / Identity (交换机代问)
3 EAP-Response / Identity = "user@corp.com"
4 EAP-Request / PEAP (Type=25) Start
5 EAP-Response / PEAP TLS ClientHello
… 多轮 TLS 握手 + 隧道内 MSCHAPv2
n EAP-Success ← 决定性标志
n+1 DHCP Discover ← 端口放行后客户端才能拿地址

服务器侧(RADIUS):Access-Request → 多个 Access-Challenge/Access-Request 往返 → Access-Accept(含 EAP-Message: SuccessMS-MPPE-*-KeyTunnel-Private-Group-Id)→ Accounting-Request(Start)

典型字段判读

  • Calling-Station-Id = 客户端 MAC,Called-Station-Id = 交换机端口 MAC / 无线 BSSID+SSID;
  • NAS-Port-Id(如 GigabitEthernet0/5)直接定位物理端口;
  • 只有 Access-Request没有任何响应 → 服务器不可达或共享密钥(shared secret)不匹配(密钥错误时 FreeRADIUS 通常静默丢弃并打日志);
  • 看到 EAP-NAK → 客户端与服务器 EAP 方法不一致。

2. 常用命令 / 配置

2.1 Linux 客户端(wpa_supplicant,有线 802.1X)

这份配置能干什么:让 Linux 具备"刷卡"能力。核心是四件事——用哪种方法(eap=PEAP)、我是谁(identity)、凭据是什么(password)、以及怎么确认对面的 RADIUS 是真的ca_cert + domain_suffix_match,这两行是防假冒服务器的关键,别省)。

/etc/wpa_supplicant/wired.conf

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
ctrl_interface=/var/run/wpa_supplicant
eapol_version=2
ap_scan=0 # 有线场景必须为 0

network={
    key_mgmt=IEEE8021X
    eap=PEAP
    identity="user@corp.com"
    anonymous_identity="anonymous@corp.com" # 外层匿名身份,保护真实用户名
    password="YourPassword"
    ca_cert="/etc/ssl/certs/corp-ca.pem" # 必须校验服务器证书
    domain_suffix_match="radius.corp.com" # 防假冒 RADIUS,强烈建议
    phase2="auth=MSCHAPV2"
}

这组命令能干什么:把客户端跑起来并看它到底走到了哪一步。排错时优先用第一条的前台 -dd 模式——EAP 每一轮的收发都会打出来,比任何猜测都快。注意最后一条:必须认证成功之后再去要 IP,顺序反了什么也拿不到。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
# 前台运行观察日志(-d 调试,-dd 更详细)
sudo wpa_supplicant -D wired -i eth0 -c /etc/wpa_supplicant/wired.conf -dd

# 后台运行
sudo wpa_supplicant -B -D wired -i eth0 -c /etc/wpa_supplicant/wired.conf

# 查看认证状态
sudo wpa_cli -i eth0 status # 关注 suppPortStatus / EAP state
sudo wpa_cli -i eth0 logoff
sudo wpa_cli -i eth0 logon

# 认证成功后再获取地址
sudo dhclient -v eth0

这份配置能干什么:换成双向证书认证(EAP-TLS)。区别在于不再有密码,改为提供自己的证书和私钥——安全性最高,代价是要有 PKI 体系分发证书。

EAP-TLS 版本的 network 段:

1
2
3
4
5
6
7
8
9
network={
    key_mgmt=IEEE8021X
    eap=TLS
    identity="host/pc01.corp.com"
    ca_cert="/etc/ssl/certs/corp-ca.pem"
    client_cert="/etc/ssl/certs/pc01.pem"
    private_key="/etc/ssl/private/pc01.key"
    private_key_passwd="******"
}

2.2 服务端联调工具

这组工具能干什么绕开交换机、绕开客户端,直接验证 RADIUS 服务器本身对不对。这是缩小故障范围最有效的一招——如果这里就跑不通,那前面怎么查交换机都是白费。四条命令由浅入深:先验账号密码,再模拟完整 EAP 会话,再前台看服务器的判决过程,最后翻日志。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 1) 最基础:验证 RADIUS 用户名密码与共享密钥(PAP)
radtest testuser testpass 127.0.0.1 0 testing123

# 2) 完整模拟 802.1X EAP 会话(wpa_supplicant 自带,排错神器)
eapol_test -c peap.conf -a 10.0.0.10 -p 1812 -s SharedSecret -r 0

# 3) FreeRADIUS 前台调试模式,逐行打印匹配过程(定位策略/证书问题最有效)
sudo systemctl stop freeradius
sudo freeradius -X # 或 radiusd -X

# 4) 日志
sudo tail -f /var/log/freeradius/radius.log

2.3 抓包

这组命令能干什么:把两段流量分别落盘。前两条对应"前段/后段"两个抓包位置,第三条 tshark 则是一行命令直接列出所有认证结果——谁通过了、谁被拒了、对应哪个 MAC 和用户名,适合批量排查。

1
2
3
4
5
6
7
8
9
# 客户端侧抓 EAPOL
sudo tcpdump -i eth0 -nn -e ether proto 0x888e -w eapol.pcap

# 交换机/服务器侧抓 RADIUS
sudo tcpdump -i any -nn 'udp port 1812 or udp port 1813' -w radius.pcap

# 用 tshark 直接列出认证结果
tshark -r radius.pcap -Y 'radius.code==2 || radius.code==3' \
       -T fields -e radius.code -e radius.Calling_Station_Id -e radius.User_Name

Wireshark 解密 RADIUS 中的 EAP 内容需在 编辑 → 首选项 → Protocols → RADIUS 填入 shared secret。

2.4 交换机配置(Cisco IOS 风格)

这段配置能干什么:分三块看——全局块告诉交换机"认证找谁、密钥是什么、总开关打开”;端口块规定这个口怎么认、认不过怎么降级;排错块是出问题时现场敲的命令。特别注意 dot1x system-auth-control 这一行,漏配是最常见的低级错误:端口配得再全,全局没使能就什么都不会发生。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
! ---- 全局 ----
aaa new-model
aaa authentication dot1x default group radius
aaa authorization network default group radius
aaa accounting dot1x default start-stop group radius

radius server RAD1
 address ipv4 10.0.0.10 auth-port 1812 acct-port 1813
 key SharedSecret
radius-server attribute 6 on-for-login-auth
radius-server vsa send authentication

dot1x system-auth-control ! 全局使能 802.1X(漏配是最常见低级错误)

! ---- 接入端口 ----
interface GigabitEthernet0/5
 switchport mode access
 switchport access vlan 10
 authentication port-control auto
 authentication host-mode multi-domain
 authentication event no-response action authorize vlan 99 ! Guest VLAN
 authentication event fail action authorize vlan 98 ! Auth-Fail VLAN
 authentication event server dead action authorize vlan 10 ! Critical VLAN,务必配置
 authentication periodic
 authentication timer reauthenticate server
 mab ! 打印机等无客户端设备兜底
 dot1x pae authenticator
 dot1x timeout tx-period 10
 dot1x max-reauth-req 2
 spanning-tree portfast

! ---- 排错命令 ----
show dot1x all summary
show dot1x interface GigabitEthernet0/5 details
show authentication sessions interface GigabitEthernet0/5 details
show aaa servers
test aaa group radius testuser testpass new-code
debug dot1x all
debug radius authentication

2.5 FreeRADIUS 关键配置

这段配置能干什么:两件事。上半段 clients.conf给交换机上户口——服务器只理会已登记 IP 且共享密钥对得上的请求,否则直接无视(这正是"发了 Access-Request 却毫无回音"的头号原因)。下半段是账号本身,以及认证通过后要下发的动态 VLAN 属性。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# clients.conf:为每台交换机(NAS)登记共享密钥
client sw-floor1 {
    ipaddr = 10.0.1.1
    secret = SharedSecret
    nastype = cisco
}

# users / policy:认证成功后下发动态 VLAN
alice Cleartext-Password := "AlicePass"
       Tunnel-Type = VLAN,
       Tunnel-Medium-Type = IEEE-802,
       Tunnel-Private-Group-Id = "20"

2.6 Windows 客户端

这组命令能干什么:确认 Windows 这边"刷卡的手"到底伸出来没有。有线 802.1X 依赖 dot3svc 服务,而它默认是手动启动——“插网线毫无反应、连 EAPOL 帧都抓不到"的绝大多数情况就是它没跑起来。后面几条用来查看当前认证状态与配置文件。

1
2
3
4
5
6
7
# 有线 802.1X 依赖此服务,默认手动启动——"插网线没反应"十有八九是它没开
Get-Service dot3svc
Set-Service dot3svc -StartupType Automatic; Start-Service dot3svc

netsh lan show interfaces # 查看有线 802.1X 状态
netsh lan show profiles
netsh wlan show interfaces # 无线场景

事件日志路径:事件查看器 → 应用程序和服务日志 → Microsoft → Windows → Wired-AutoConfig(无线为 WLAN-AutoConfig)。

3. 常见故障与排错

3.1 现象:网线插上,拿不到 IP,链路灯却是亮的

先记住结论这不是 DHCP 的问题,是端口根本没开门。 链路灯亮只代表物理层通了,而受控端口在未授权状态下会丢弃包括 DHCP 在内的全部业务流量。所以第一件事是看有没有 EAPOL 帧,而不是去查 DHCP 服务器。

这是 802.1X 环境最典型的现象——端口未授权,DHCP 报文被直接丢弃。

排查顺序

  1. tcpdump -i eth0 ether proto 0x888e有没有 EAPOL 帧?
    • 完全没有 → 客户端未启用 802.1X(Windows 查 dot3svc 服务;Linux 查 wpa_supplicant 是否运行);
    • 只有交换机发的 Request/Identity、客户端不回 → 客户端侧配置缺失;
    • 只有客户端 EAPOL-Start、交换机不回 → 交换机端口未使能 dot1x pae authenticator 或漏配全局 dot1x system-auth-control
  2. 交换机执行 show authentication sessions interface Gi0/5 details,看 StatusUnauthorized / Running / Authz Success
  3. 若卡在 Running 且反复超时 → 转向 RADIUS 侧排查。

3.2 现象:认证一直失败(EAP-Failure / Access-Reject)

先记住结论能收到 Reject/Failure,说明链路和服务器都是通的——问题出在"凭据"或"方法"上,范围已经大大缩小。经验上,证书类问题占了一大半,其中又以有效期和时间同步最常见(表现为"某天突然集体失败”)。

原因定位方法
用户名或密码错误freeradius -X 看拒绝原因;先用 radtest 单独验证账号
EAP 方法不匹配(客户端 PEAP、服务器只允许 TLS 等)抓包看是否有 EAP-NAKeap.type == 3
服务器证书问题(过期、CN/SAN 不匹配、CA 链不全)客户端日志出现 TLS: Certificate verification failed;用 openssl s_clientopenssl x509 -noout -dates 核对
客户端未安装 CA 根证书检查 ca_cert 路径 / Windows"受信任的根证书颁发机构”
域账号被锁定、密码过期、不在允许组查 AD 账号状态与 NPS 网络策略的组条件
客户端证书过期(EAP-TLS)openssl x509 -in client.pem -noout -dates

经验:证书类问题占 EAP-TLS/PEAP 故障的一大半,且往往是"某天集体失败”——先查证书有效期与时间同步(NTP 偏差过大会导致证书校验失败)。

3.3 现象:交换机发出 Access-Request,但服务器毫无响应

先记住结论“完全没有回音"几乎等同于服务器压根不认这台交换机——共享密钥不匹配或 NAS 未在 clients.conf 登记时,FreeRADIUS 会静默丢弃而不是回一个 Reject。所以别去纠结账号密码,先核对密钥与登记 IP,再看网络可达性。

原因排查
共享密钥不匹配FreeRADIUS 日志报 Received packet from ... with invalid Message-Authenticator 或直接静默丢弃;核对 clients.conf 与交换机 key
交换机 IP 未在 clients.conf 登记日志 Ignoring request from unknown client。注意登记的应是交换机源 IP(受 ip radius source-interface 影响)
路由 / 防火墙拦截 UDP 1812服务器侧 tcpdump udp port 1812 看有没有包到达;show aaa servers 看 NAS 侧统计的 timeout 计数
端口用错(旧设备用 1645/1646)核对 auth-port / acct-port

3.4 现象:认证成功但被扔进了错误的 VLAN

先记住结论认证和授权是两件事,认证过了不代表授权对了。 先用 show authentication sessionsAuthorized By 这一列——是 Authentication Server 说明属性来自 RADIUS(那就查属性齐不齐),是 Guest Vlan 则说明其实压根没认证成功,只是掉进了兜底 VLAN。

原因排查
RADIUS 未下发 VLAN 属性抓包看 Access-Accept 是否含 Tunnel-Private-Group-Id;三个 Tunnel 属性必须齐全
交换机未开启动态授权aaa authorization network default group radiusradius-server vsa send authentication
VLAN 在交换机上不存在 / 未在 trunk 放行show vlan briefshow interface trunk
实际落进 Guest/Auth-Fail VLANshow authentication sessionsAuthorized ByAuthentication Server 还是 Guest Vlan

3.5 现象:打印机、摄像头、IP 电话无法上网

先记住结论这类设备根本不会说 802.1X,别指望它们能认证成功——正确做法不是"修好它们的认证”,而是给它们配兜底通道 MAB,并接受"MAB 安全性弱"这个前提,用受限 VLAN 把风险圈起来。

它们没有 802.1X 客户端。启用 MAB 并在 RADIUS 中登记 MAC 白名单,同时把这类设备放进受限 VLAN(因 MAC 可伪造,MAB 安全性弱)。注意交换机需等 tx-period × (max-reauth-req+1) 才降级到 MAB,可适当调小 tx-period 缩短等待。

3.6 现象:RADIUS 服务器宕机导致全楼断网

先记住结论这是设计缺陷,不是突发故障。 802.1X 默认"认证不了就不放行”,服务器一挂全楼新接入全部失败是必然结果。上线前就必须把降级通道和冗余设计好,事后再补代价极大。

根因:未配置 Critical VLAN / Inaccessible Authentication Bypass。

处置:配置 authentication event server dead action authorize vlan <数据VLAN>,并部署至少两台 RADIUS 服务器做冗余,同时监控 show aaa servers 的 dead 状态。这是 802.1X 上线前必须做的可用性设计。

3.7 现象:一个端口下接了集线器/虚拟机,只有第一台能上网

先记住结论问题在端口的"主机模式",不在客户端。 一个口下要让每台设备各自认证、各自授权,只有 multi-auth 能做到;其他模式要么只认一台,要么认一台放全部。

原因:主机模式为 multi-host(首个认证通过后全放行,但 MAC 表可能受限)或 single-host。改为 authentication host-mode multi-auth,每个 MAC 独立认证独立授权。

4. 与其他协议对比

维度802.1XPortal / Web 认证MABDHCP Snooping + DAIVPN 接入
生效层次数据链路层(入网前应用层(已有 IP 后)数据链路层数据链路层(报文校验)网络层/应用层
校验对象设备/用户身份用户身份MAC 地址报文与绑定表一致性用户身份 + 隧道
认证前可否拿 IP是(受限网络)是(外网)
安全强度(可用双向证书)中(易被绕过)(MAC 可伪造)中(防欺骗但不认身份)
客户端要求需 supplicant仅需浏览器需 VPN 客户端
可下发策略VLAN / ACL / QoSACL 为主VLAN / ACL路由 / ACL
典型场景企业有线、WPA-Enterprise访客、酒店、公共 Wi-Fi打印机等哑终端防 ARP/DHCP 欺骗远程办公

常见组合:802.1X(认身份)+ MAB(兜底哑终端)+ Guest VLAN(访客)+ DHCP Snooping/DAI(防二层欺骗)+ CoA(失陷终端隔离)。

5. 速查表 / 常见面试题

5.1 速查

记忆点
EAPOL EtherType0x888E
EAPOL 目的 MAC01:80:C2:00:00:03(PAE 组播)
RADIUS 端口1812 认证 / 1813 计费(旧 1645/1646),CoA 用 3799
EAP Code1=Request,2=Response,3=Success,4=Failure
EAPOL Type0=EAP-Packet,1=Start,2=Logoff,3=Key
关键 EAP Type1=Identity,3=NAK,13=TLS,25=PEAP,26=MSCHAPv2
动态 VLAN 属性Tunnel-Type=13 + Tunnel-Medium-Type=6 + Tunnel-Private-Group-Id
抓包起手式eapol / eap / radius
调试三板斧freeradius -Xeapol_testshow authentication sessions

5.2 常见面试题

Q1:802.1X 的三个角色分别是什么?谁做出认证决策? Supplicant(客户端)、Authenticator(交换机/AP)、Authentication Server(RADIUS)。决策由认证服务器做出,认证者只负责中继报文与控制端口开关,不判断凭据正误。

Q2:受控端口与非受控端口的区别? 非受控端口永远开放但只通 EAPOL;受控端口在认证通过前处于未授权状态,丢弃全部业务流量(含 ARP、DHCP),通过后才转发。

Q3:EAP、EAPOL、RADIUS 三者是什么关系? EAP 是认证内容框架;EAPOL 是把 EAP 送过二层链路的封装(客户端↔交换机);RADIUS 是把 EAP 送到服务器的后端承载(交换机↔服务器,用 EAP-Message 属性)。一句话:同一份 EAP 内容,前后换乘两趟不同的车。

Q4:为什么 802.1X 环境下客户端认证前拿不到 IP? DHCP 是 IP/UDP 流量,属于受控端口管辖范围,认证前一律被丢弃。只有 EAPOL 能通过。

Q5:PEAP 和 EAP-TLS 的区别?该怎么选? PEAP 只需服务器证书,隧道内用 MSCHAPv2 校验域账号,部署轻、与 AD 集成好,是企业主流;EAP-TLS 需要双向证书,安全性最高、抗钓鱼,但要建 PKI 并分发管理客户端证书。安全要求高或物联网设备场景选 EAP-TLS。

Q6:PEAP 部署时最容易被忽视的安全隐患是什么? 客户端未校验服务器证书。攻击者可搭建同名 SSID + 假 RADIUS,诱使客户端把 MSCHAPv2 挑战响应交出来离线破解。必须启用"验证服务器证书"并配置 domain_suffix_match / 服务器名称匹配。

Q7:打印机不支持 802.1X 怎么办?MAB(MAC 认证旁路):交换机在 EAPOL 超时后把设备 MAC 当账号密码交给 RADIUS 查白名单。因 MAC 可伪造,须配合受限 VLAN 与 ACL。

Q8:RADIUS 服务器挂了会怎样?如何避免全网断网? 默认所有新接入都无法认证。必须配置 Critical VLAN(Inaccessible Authentication Bypass),在服务器不可达时把端口临时授权到指定 VLAN,同时部署多台 RADIUS 冗余。

Q9:管理员如何在用户已在线时强制其下线或改变权限?RADIUS CoA(RFC 5176):服务器主动向 NAS 的 UDP 3799 发送 Disconnect-Message(踢下线)或 CoA-Request(改 VLAN/ACL)。这是 NAC 联动隔离失陷终端的基础。

Q10:WPA2-Enterprise 与 802.1X 的关系? WPA2/WPA3-Enterprise 就是以 802.1X + EAP 做认证。EAP 成功后双方导出 MSK,服务器用 MS-MPPE-*-Key 把 PMK 送给 AP,AP 与客户端再做四次握手(用 EAPOL-Key 帧)派生 PTK/GTK 开始加密。相比 WPA2-PSK 的全网共享一个密码,Enterprise 实现了一人一密与集中审计。

Q11:EAP-NAK 报文出现说明什么? 客户端拒绝服务器建议的 EAP 方法,并在报文中提出自己支持的方法。看到它基本可断定:客户端与服务器的 EAP 方法配置不一致。