802.1X 网络准入是防止未授权设备接入交换机端口的认证机制。它在链路层强制「先认证、后通信」:未通过 RADIUS 认证的终端在端口上只能发送 EAPOL 报文,拿不到二层转发能力,从而阻断私接 AP、影子终端与访客设备随手获得内网访问权的问题。本文给出 FreeRADIUS 服务端与交换机侧的完整可复制配置,并说明 EAP-TLS、PEAP 与 MAB 的组合方式及验证命令。
适用场景
- 办公区有线接入:员工终端接入交换机端口前必须完成身份认证
- 企业无线接入:Wi-Fi 使用 WPA2/WPA3-Enterprise,凭账号入网而非共享 PSK
- 机房与生产区:运维终端接入服务器网段需二次认证,并配合动态 VLAN 隔离
- 合规审计:等保与内控要求「网络接入可控、身份可追溯」
前置条件
- 支持 802.1X 的二层交换机,或支持 WPA-Enterprise 的无线 AP
- 一台 Linux 服务器作为 RADIUS 认证服务器,本文以 Debian 12 + FreeRADIUS 3.2 为例
- 内部 CA,用于签发服务器证书与客户端证书(可用
openssl自建,也可用 step-ca) - 终端侧能力确认:Windows / macOS 支持 EAP-TLS 与 PEAP-MSCHAPv2;打印机、摄像头等 IoT 设备通常只支持 MAB
- 变更窗口:配置错误的端口会直接断网,建议先以 monitor 模式灰度
原理说明
802.1X 定义三个角色:申请者 supplicant(终端)、认证者 authenticator(交换机或 AP)、认证服务器 authentication server(RADIUS)。认证者把终端的 EAP 报文封装进 RADIUS 消息转发给服务器,服务器返回 Accept、Reject 或 Challenge,认证者据此放通端口或保持受控状态。整个过程对上层协议透明,终端在认证通过前拿不到 DHCP 响应。
常见 EAP 方法的取舍如下:
- EAP-TLS:双向证书认证,无口令,抗钓鱼能力最强,适合公司自有终端,需为每台设备下发客户端证书。
- PEAP-MSCHAPv2:服务端证书叠加目录账号口令,部署成本低,但存在中继攻击面,必须强制校验服务器证书。
- EAP-TTLS:与 PEAP 结构类似,隧道内可用 PAP 承载,便于对接老旧目录。
- MAB:以 MAC 地址作为用户名认证,加密强度为零,仅适合无法安装客户端的设备,必须与动态 VLAN 和端口 ACL 配合使用。
操作步骤
步骤 1:部署 FreeRADIUS 并做配置自检
apt update && apt install -y freeradius freeradius-utils openssl
systemctl enable --now freeradius
# 生产环境关闭认证调试输出
sed -i 's/^\s*auth = yes/\tauth = no/' /etc/freeradius/3.0/radiusd.conf
# 配置自检,期望输出 Configuration appears to be OK
radiusd -XC
步骤 2:准备证书链
cd /etc/freeradius/3.0/certs
# 生成 CA,有效期 10 年
openssl req -x509 -newkey rsa:4096 -sha256 -days 3650 -nodes \
-keyout ca.key -out ca.crt \
-subj "/C=CN/O=Example/CN=Example-RADIUS-CA"
# 生成 RADIUS 服务器证书,SAN 必须包含客户端访问时使用的主机名
openssl req -newkey rsa:2048 -nodes -keyout server.key -out server.csr \
-subj "/C=CN/O=Example/CN=radius.example.internal"
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out server.crt -days 825 -sha256 \
-extfile <(printf "subjectAltName=DNS:radius.example.internal")
# 生成客户端证书,每台终端一份
openssl req -newkey rsa:2048 -nodes -keyout client-laptop.key -out client-laptop.csr \
-subj "/C=CN/O=Example/CN=laptop-0001"
openssl x509 -req -in client-laptop.csr -CA ca.crt -CAkey ca.key \
-out client-laptop.crt -days 825 -sha256
chown -R freerad:freerad /etc/freeradius/3.0/certs
chmod 640 ca.key server.key
步骤 3:配置 EAP 模块
# /etc/freeradius/3.0/mods-available/eap
eap {
default_eap_type = peap
timer_expire = 60
ignore_unknown_eap_types = no
tls-config tls-common {
private_key_file = /etc/freeradius/3.0/certs/server.key
certificate_file = /etc/freeradius/3.0/certs/server.crt
ca_file = /etc/freeradius/3.0/certs/ca.crt
dh_file = /etc/freeradius/3.0/certs/dh
tls_min_version = "1.2"
cipher_list = "ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256"
require_client_cert = no
}
tls {
tls_min_version = "1.2"
require_client_cert = yes # EAP-TLS 必须校验客户端证书
check_cert_cn = "%{User-Name}" # 证书 CN 与账号名一致
}
peap {
tls = tls-common
default_eap_type = mschapv2
copy_request_to_tunnel = no
use_tunneled_reply = yes
}
}
其中 tls_min_version 必须设为 1.2 及以上,use_tunneled_reply 设为 yes 可避免隧道外属性被篡改。
步骤 4:限制认证者来源
# /etc/freeradius/3.0/clients.conf
client switch-core {
ipaddr = 10.10.0.2
secret = 替换为32位以上强随机共享密钥
nas_type = cisco
require_message_authenticator = yes
}
只允许交换机与 AP 的地址发起请求。共享密钥泄露等同于认证旁路,务必与交换机配置逐字一致并定期轮换。
步骤 5:交换机侧配置
! 全局启用 AAA
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.10.0.10 auth-port 1812 acct-port 1813
key 替换为32位以上强随机共享密钥
! 受控端口
interface GigabitEthernet1/0/10
switchport mode access
authentication host-mode multi-auth
authentication order dot1x mab
authentication priority dot1x mab
authentication port-control auto ! 灰度阶段先设 monitor
authentication periodic
authentication timer reauthenticate 3600 ! 每小时重认证
mab
dot1x pae authenticator
dot1x timeout tx-period 10
spanning-tree portfast
authentication host-mode 决定单端口的接入策略:single-host 只允许一个终端,multi-auth 允许多终端各自认证,multi-domain 允许数据域与语音域各一个。IP 电话较多的办公区建议用 multi-domain。
步骤 6:动态 VLAN 与隔离
# /etc/freeradius/3.0/sites-available/default 的 post-auth 段
if (&User-Name =~ /^mab-/) {
update reply {
Tunnel-Type = VLAN
Tunnel-Medium-Type = IEEE-802
Tunnel-Private-Group-Id = "30" # IoT 隔离 VLAN
}
}
把打印机、摄像头等 MAB 设备统一放入隔离 VLAN,再用 ACL 只放通必要的服务器端口,可把「设备被控」的横向影响压到最小。
步骤 7:对接目录账号与灰度回滚
企业环境通常不需要在 RADIUS 里单独维护账号,而是转发到 LDAP 或 AD:
# /etc/freeradius/3.0/mods-available/ldap
ldap {
server = 'ldaps://dc01.example.internal'
identity = 'cn=radius,ou=svc,dc=example,dc=internal'
password = 替换为服务账号口令
base_dn = 'ou=users,dc=example,dc=internal'
user {
base_dn = "ou=users,dc=example,dc=internal"
filter = "(sAMAccountName=%{%{Stripped-User-Name}:-%{User-Name}})"
}
tls {
require_cert = 'never'
}
}
两点必须守住:用 LDAPS 而不是明文 389 端口,避免账号口令在认证链路中以明文传输;服务账号只赋予目录只读查询权限,禁止写入。同时限制单账号的认证频率与失败阈值,防止该端口被当成账号枚举通道使用。
灰度与回滚方案:先在一个接入组内把端口设为 authentication port-control monitor,此时认证失败不会阻断通信,只记录日志,观察 1 至 2 天后再切到 auto。回滚动作只有一条命令——把端口改回 monitor 或直接 no authentication port-control,因此变更前应把这两条指令与涉及的端口清单写进操作单,值班人员可直接执行。
配置验证
先在服务端验证 RADIUS 链路本身:
radtest alice 'Passw0rd!' 127.0.0.1 0 testing123
# 期望:Received Access-Accept
再用 eapol_test 完整模拟一次 EAP 握手,这一步能同时验证证书与隧道配置:
# /root/eapol.conf
network={
ssid="corp-dot1x"
key_mgmt=WPA-EAP
eap=PEAP
identity="alice"
password="Passw0rd!"
phase2="auth=MSCHAPV2"
ca_cert="/etc/freeradius/3.0/certs/ca.crt"
}
eapol_test -c /root/eapol.conf -a 10.10.0.10 -s 共享密钥
# 期望末尾输出 SUCCESS
交换机侧核对会话与 RADIUS 统计:
show dot1x all summary
show authentication sessions interface GigabitEthernet1/0/10
show radius statistics | include Timeout|Access
重点看三项:认证成功计数是否增长、Timeout 是否持续升高、失败原因是否集中在证书校验。灰度期间可用 show authentication sessions 的 Status 字段确认终端是否已进入 Authz Success 状态。
常见问题
FAQ 1:启用后打印机、摄像头直接掉线
这类设备不支持 EAP。处理方式是开启 mab 并把 authentication order 设为 dot1x mab,让不支持 802.1X 的设备退回 MAC 认证;同时在 RADIUS 侧为 MAC 用户下发隔离 VLAN 与受限 ACL。切记不要把这类设备直接放行到生产网段。
FAQ 2:终端提示「无法连接到网络」,RADIUS 日志报 certificate verify failed
三个常见原因:服务器证书的 SAN 与终端配置的主机名不一致;客户端未导入 CA 根证书;服务器证书已过期。逐项核查:用 openssl x509 -in server.crt -noout -text | grep -A1 "Subject Alternative Name" 确认 SAN,确认终端信任链中只保留自建 CA,并通过 openssl x509 -in server.crt -noout -dates 检查有效期。Windows 终端还需在 PEAP 属性中勾选「验证服务器证书」并指定受信任的根 CA。
FAQ 3:认证显示成功,但终端拿不到 IP 地址
认证与地址分配是两件事。若 RADIUS 下发了动态 VLAN,而该 VLAN 在交换机上未创建、或未配置对应 DHCP 中继,终端就会停在认证成功但无地址的状态。检查顺序:确认 VLAN 已创建、interface vlan 已 up、DHCP 中继已指向正确的 DHCP 服务器;再确认端口未被静态 VLAN 配置覆盖。
总结
- 802.1X 的价值在于把网络接入权收敛到身份体系,而不是依赖端口物理位置。
- 自有终端优先 EAP-TLS;目录账号场景用 PEAP-MSCHAPv2 但必须强制证书校验;IoT 设备用 MAB 并强制隔离 VLAN。
- 服务端三处关键配置:tls_min_version = 1.2、require_message_authenticator = yes、check_cert_cn 与账号绑定。
- 交换机侧先
monitor灰度,再切auto;开启重认证周期以缩短凭证失效窗口。 - 验证以
eapol_test的 SUCCESS 与交换机 Authz Success 双确认为准。