802.1X 网络准入认证配置实战:防未授权接入

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 双确认为准。