华为H3C实战 | 第33章 AAA 认证与 RADIUS 对接
📚 本系列共 43 篇(第 33 / 43 篇) · 第五卷 BRAS 与认证计费篇 —— 大规模用户接入
← 上一篇:第 32 章 BRAS PPPoE 服务器配置 下一篇:第 34 章 IPoE 接入与 Web/Portal 认证 →
本章导读:BRAS 不做决策只做执行——账号在 RADIUS,带宽属性也在 RADIUS,BRAS 只是照着属性去执行。本章把 AAA 三件套、RADIUS 报文交互和两家设备上的域/方案/服务器模板配置讲清楚。
本章结构:
- 33.1 功能原理与业务场景 —— 认证/授权/计费各管什么、RADIUS 报文往返全过程(Access-Request → Accept 带授权属性 → 计费 Start/Stop)、为什么账号必须集中管理、认证通过后被拒的三种常见原因
- 33.2 华为设备配置详解 —— RADIUS 服务器模板、认证/计费方案、域与地址池绑定的完整模板
- 33.3 H3C 设备配置详解 —— RADIUS scheme 写法与差异标注
- 33.4 华为 / H3C 命令对照表
- 33.5 配置验证 —— 在线用户、认证失败记录、RADIUS 计数、计费报文状态
- 33.6 排错与故障树 —— “密码对但认证失败"“能认证但没计费"的分支定位
- 33.7 新手踩坑与注意事项
- 33.8 本章小结
重点提示:认证失败先分清是"BRAS 根本没发请求”(域/服务器模板问题)还是"服务器回了 Reject”(账号或属性问题),33.1.2 的报文图就是判断依据;想改限速却发现改 BRAS 没用,那是要改 RADIUS 属性——见 35.1 开头。 关联章节:PPPoE 服务器上线流程见第 32 章;IPoE 场景下的 Portal 与 RADIUS 见第 34 章;属性下发的执行侧(限速、ACL)见第 35 章;AAA 通用认证(设备管理登录)见第 30 章。
33.1 功能原理与业务场景
33.1.1 这功能是干嘛的(通俗版)
AAA 是三个英文词的缩写,但你可以把它想成酒店前台的三件套:
- 认证(Authentication):「请出示身份证」——你得证明你是你,也就是核对用户名和密码。
- 授权(Authorization):「您订的是行政套房」——认证通过了,接下来告诉你有什么权限、多大的带宽、哪些网站能上。
- 计费(Accounting):「您住了三晚,消费 XX 元」——你用了多少资源,记下来好结账。
RADIUS(远程认证拨号用户服务,Remote Authentication Dial-In User Service)[8] 就是前台打电话给总部查身份证的那条电话线。BRAS 是前台,RADIUS 服务器是总部档案室。
为什么 BRAS 不能自己存账号?三个理由:
- 量太大:一个学校 3 万账号,一个 BRAS 存不下、也管不过来。
- 要集中:账号要在全校/全省统一,不能每台 BRAS 各存一份。
- 要能实时改:用户欠费了要立刻断,改本地配置根本来不及。
所以BRAS 不做决策,只做执行。这个认知是本章的核心,也是新手最容易搞反的地方——你以为你要在 BRAS 上配限速,其实你要在 RADIUS 上配属性,BRAS 只是照着属性去执行。
33.1.2 RADIUS 报文是怎么走的
RADIUS 基于 UDP,认证用 1812 端口,计费用 1813 端口(老设备用 1645/1646)。完整交互:
BRAS(客户端 NAS) RADIUS 服务器
───────────────── ──────────────
① Access-Request
├─ User-Name: user1@isp_dorm
├─ CHAP-Password(或 User-Password 带 PAP)
├─ NAS-IP-Address: 10.200.0.2
├─ NAS-Port-Id: 1/0/2.1:100
└─ Called-Station-Id: 00-11-22-33-44-55
────────→
② 查库、校验
←─────────────── ③ Access-Accept(或 Access-Reject)
Access-Accept 里带授权属性:
├─ Framed-IP-Address: 10.200.10.88 (指定固定IP)
├─ Framed-Pool: pool_vip (用哪个地址池)
├─ Filter-Id: acl_campus (下发ACL)
├─ Session-Timeout: 3600 (1小时强制重认证)
└─ Idle-Timeout: 600 (空闲10分钟踢)
④ 用户上网(数据不走RADIUS,直接转发!)
⑤ Accounting-Request(Start) ────────→ 计费开始
├─ Acct-Status-Type: Start
├─ Acct-Session-Id: 8a1b2c3d
└─ User-Name / NAS-IP-Address
←─────────────── ⑥ Accounting-Response
⑦ 用户下线
⑧ Accounting-Request(Stop) ────────→ 计费结束
├─ Acct-Status-Type: Stop
├─ Acct-Session-Time: 1830 (秒)
├─ Acct-Input-Octets: 12345678 (下行字节)
├─ Acct-Output-Octets: 2345678 (上行字节)
└─ Acct-Terminate-Cause: User-Request
←─────────────── ⑨ Accounting-Response
这张图上有三个必须刻在脑子里的点:
- RADIUS 只管认证和计费,不管数据转发。用户上网流量完全不经过 RADIUS 服务器。如果 RADIUS 挂了,已经在线的用户照样能上网,只是新用户上不来——这是个非常重要的现象,第 36 章会用到。
- 认证报文和计费报文是分开的两条流。认证失败和计费失败是两个完全独立的问题,症状也不同。
Acct-Session-Id是整条会话的身份标识。一个用户多次上下线,每次的 Session-Id 都不同,这是对账的关键。
33.1.3 常用 RADIUS 属性:这才是 BRAS 的「遥控器」
属性(Attribute)是本章最核心的概念。BRAS 收到 Access-Accept 后,会逐条读取里面的属性,然后照着做。常用的属性:
| 属性 | 编号 | 作用 | BRAS 怎么执行 |
|---|---|---|---|
User-Name |
1 | 用户名 | 请求里带出去 |
User-Password |
2 | PAP 密码(加密) | 请求里带出去 |
CHAP-Password |
3 | CHAP 应答 | 请求里带出去 |
NAS-IP-Address |
4 | 客户端 IP | 请求里带出去,服务器据此识别哪台 BRAS |
Framed-IP-Address |
8 | 指定用户的 IP | 直接把这个 IP 发给用户 |
Framed-IP-Netmask |
9 | 指定掩码 | 配合上面用 |
Framed-Routing |
10 | 路由方式 | — |
Filter-Id |
11 | 下发过滤策略名 | BRAS 找到同名 ACL/策略并套用 |
Framed-MTU |
12 | 用户侧 MTU | 覆盖 VT 上的设置 |
Session-Timeout |
27 | 会话最大时长 | 到点强制下线重认证 |
Idle-Timeout |
28 | 空闲超时 | 长时间无流量就踢 |
Framed-Pool |
88 | 指定地址池 | 用户从这个池取地址 |
Framed-IPv6-Prefix |
97 | IPv6 前缀 | 双栈场景 |
Class |
25 | 服务器回传的不透明数据 | BRAS 原样带回计费包 |
四个最常用、也最容易配错的属性,重点讲:
① Framed-IP-Address(8):给用户固定 IP。 在 RADIUS 的 users 文件里给某个账号配这个属性,用户上线时就一定拿到这个 IP。适用场景:服务器、打印机、监控设备。
② Framed-Pool(88):让用户从指定池取地址。 注意它和 Framed-IP-Address 的区别:前者给「池」,后者给「具体 IP」。一个域可以绑默认池,但某些用户通过 Framed-Pool 走 VIP 池——这是做差异化服务的标准手法。
③ Filter-Id(11):下发 ACL。 这是「按用户下发访问控制」的核心。服务器返回 Filter-Id = "acl_library",BRAS 就去找本地名为 acl_library 的 ACL 并套用。关键点:ACL 本身要在 BRAS 上预先配好,RADIUS 只负责「点名」,不负责「定义」。这是新手最常搞混的:以为在 RADIUS 上写个 Filter-Id 就能凭空下发一条规则,结果 BRAS 上没这个 ACL,下发失败或静默忽略。
④ Session-Timeout(27)与 Idle-Timeout(28):会话寿命控制。 前者是「绝对时长」,后者是「空闲时长」。运营商常用 Session-Timeout 做「每 24 小时强制重拨一次」,好处是能把地址换个位置、也能重新核对一次欠费状态。
33.1.4 厂商私有属性:厂商差异的根源
标准属性不够用时,各家厂商会扩展私有属性(Vendor-Specific Attribute,VSA)。这就是跨厂商对接时最大的坑:华为和 H3C 的私有属性编号和含义完全不同,服务器要按厂商分别下发。
最典型的就是「带宽限速」这件事,标准属性里根本没有,必须用私有属性:
华为侧(举例形态) H3C 侧(已核实的官方示例)
───────────────── ──────────────────────
VSA 携带上下行速率 H3C_Input_Average_Rate
具体属性名按华为文档 H3C_Output_Average_Rate
(第35章会详细给出) (单位 bps,官方示例:4000000)
H3C 这两个属性的含义,官方 BRAS 配置举例里给得很明确:H3C_Input_Average_Rate 和 H3C_Output_Average_Rate 用来给用户下发上下行平均速率限制,单位是 bps。所以 4000000 就是 4Mbps。这个在 FreeRADIUS 里的写法(官方示例):
# FreeRADIUS users 文件:H3C 官方示例写法
User1@isp1 Cleartext-Password :="pass1"
H3C_Input_Average_Rate = 4000000,
H3C_Output_Average_Rate = 4000000
注意最后的逗号——FreeRADIUS 的属性列表用逗号分隔。
⚠ 厂商私有属性必须分别核对:华为的限速私有属性名与 H3C 完全不同,且随版本演进。本书不给出未核实的华为私有属性名,第 35 章会给出已核实的配置途径并标注待核实项。任何私有属性,都必须在厂商的《RADIUS 属性说明》文档里查到确切编号和取值格式后再用。
33.1.5 域(Domain):把用户分流到不同策略的开关
一个 BRAS 上可能同时服务多种用户,他们的认证服务器、地址池、限速策略都不一样。域就是用来分流的路由器:
用户 user1@isp_dorm → 域 isp_dorm → RADIUS-A → 池 pool_dorm → 限速 10M
用户 user2@isp_vip → 域 isp_vip → RADIUS-A → 池 pool_vip → 限速 100M
用户 user3@isp_guest → 域 isp_guest → RADIUS-B → 池 pool_guest→ 限速 2M
域名的来源有两种:
- 用户名里带后缀:
user1@isp_dorm→ 域 =isp_dorm。这是最标准的方式。 - 接口/VT 上指定默认域:用户只输
user1,则用接口上配的默认域。
最危险的情况是两者都没配:BRAS 用一个「全局默认域」,所有用户挤在一起,认证服务器、地址池全乱了。这就是为什么第 32 章反复强调必须显式配置默认域。
33.1.6 RADIUS 服务器选路与主备
一台 BRAS 通常配多台 RADIUS 服务器做备份。选路逻辑直接影响故障时的表现:
华为:radius-server algorithm loading-share | master-backup [strict|sequence]
H3C :primary / secondary 服务器 + 服务器状态探测
- 负载分担(loading-share):按权重把请求摊到多台服务器,性能好,但某台挂了会有部分用户受影响。
- 主备(master-backup):优先用主服务器,主挂了才切备用。行为简单可预测,是保守场景的首选。
一个关键细节(华为文档明确说明):如果不配 strict,计费服务器会跟随认证服务器的选择结果——即给某个用户做认证的那台服务器,也会给这个用户做计费。配了 strict 则严格按各自算法选,保证主计费优先。
这个设计的意义在于:同一个用户的认证和计费记录落在同一台服务器上,对账时不用跨服务器拼数据。这在多服务器部署时非常重要。
33.1.7 RADIUS 报文的可靠性机制:为什么「超时」是个独立问题
RADIUS 跑在 UDP 上,UDP 本身不保证送达。所以 RADIUS 自己实现了一套重传机制:
BRAS 发 Access-Request
↓
等 response-timeout(默认通常 5 秒)
↓
没回 → 重传(默认重传 3 次)
↓
3 次都不回 → 判定服务器不可用,上报"认证超时"
这套机制带来两个必须理解的后果:
后果一:超时时间决定了用户体验。 如果超时设 5 秒、重传 3 次,用户最坏要等 15 秒才看到「认证失败」。用户体验极差。所以生产上通常把超时调到 2~3 秒,重传 2 次,这样最坏 6 秒内出结果。
后果二:重传会放大服务器压力。 服务器如果只是「慢」而不是「挂」,BRAS 的重传会让它更慢,形成雪崩。这就是为什么 RADIUS 服务器性能不足时会出现「用户集体上不了线」的连锁反应。
| 参数 | 典型值 | 设太大 | 设太小 |
|---|---|---|---|
| 响应超时 | 2~5 秒 | 用户等待久 | 误判服务器不可用 |
| 重传次数 | 2~3 次 | 雪崩风险 | 一次抖动就失败 |
这两条参数的命令已核实(RADIUS 服务器组视图下):
# 进入 RADIUS 服务器组视图
radius-server group rd1
# 认证请求:重传 2 次、每次超时 3 秒
radius-server authentication retransmit 2 timeout 3
# 计费请求:重传 3 次、每次超时 5 秒
radius-server accounting retransmit 3 timeout 5
commit
已核实语法(官方原文):「Run
radius-server { authentication | accounting } retransmitretry-timestimeoutsecond — The number of transmissions and the retransmission timeout period are configured for request packets to be sent to the RADIUS server.」两个要点:① 认证和计费是分开配的(各有自己的 retransmit/timeout),因为两者对时延的容忍度不同;② 命令在 RADIUS 服务器组视图下,不在系统视图。 URL:https://support.huawei.com/enterprise/en/doc/EDOC1100367122/(User Access → AAA → Configuring a Device as a RADIUS Client)
另外还有一个配套的计费缓存重传命令:
radius-server accounting cache retransmit <n> timeout <t>(配置缓存计费报文的重传间隔),以及手动触发radius-server cache resend packet。
33.1.8 计费的三种模式:时长、流量、包月
运营商的计费模式决定了 BRAS 要关注什么:
| 计费模式 | 依据 | BRAS 要保证什么 | 服务器要算什么 |
|---|---|---|---|
| 时长计费 | Acct-Session-Time |
准确记录上下线时间 | 按时长累计 |
| 流量计费 | Acct-Input/Output-Octets |
字节计数准确、及时上报 | 按流量累计 |
| 包月/包年 | 只看是否在线 | 会话能稳定维持 | 不按量算,只判状态 |
| 阶梯/达量限速 | 流量 + 限速属性 | 能接收动态改速指令 | 达阈值后触发 CoA 改速 |
第 4 种「达量限速」是现在最主流的模式,也最能体现 AAA 的「属性驱动」威力:
用户当月用量 < 100GB → 正常速度(RADIUS 下发 100M 限速属性)
用户当月用量 ≥ 100GB → 服务器检测到超量
→ 服务器主动发 CoA 报文给 BRAS
→ BRAS 把该用户限速改成 10M
(全程用户不需要重新拨号,体验无感)
这个流程依赖本章讲的两样东西:私有属性(下发限速)和动态授权 / CoA(服务器主动改策略)。缺一个都做不成。理解了这条链路,你就理解了现代宽带运营的核心机制。
33.2 华为设备配置详解
33.2.1 命令行基础速览
华为的 RADIUS 配置在 V8 版本里集中在 radius-server group 和 aaa 两个视图:
# RADIUS 服务器组(V8)
radius-server group rd1
# AAA 视图(认证方案、计费方案、域都在这里)
aaa
# 维护与排查
display radius-server configuration
display aaa online-fail-record
⚠ 版本差异(重要):华为的 RADIUS 配置体系在 V6 到 V8 之间发生过迁移。V6 时代使用
radius-server template模板体系,V8 改为radius-server group服务器组体系。网上大量教程仍是 V6 写法,直接照抄到 V8 设备上会报「命令不存在」。动手前先用display version确认版本,再对照对应版本的文档。
33.2.2 完整配置模板
下面这份是华为 V8 的完整 AAA 配置,包含「RADIUS 服务器组 → 认证方案 → 计费方案 → 域」四层:
第一段,RADIUS 服务器组——配服务器地址、密钥、主备策略:
# 进入系统视图
system-view
# 建 RADIUS 服务器组 rd1
radius-server group rd1
# 共享密钥(必须与服务器端完全一致)
radius-server shared-key-cipher Bras@2024
# 认证服务器(IP + 端口)
radius-server authentication 10.200.1.10 1812
# 计费服务器(IP + 端口)
radius-server accounting 10.200.1.10 1813
# 选路算法:主备模式(主挂了才切备)
radius-server algorithm master-backup
# 配置源接口,保证 BRAS 侧发出的报文源地址固定
# 服务器侧的 client 配置需要按这个地址去匹配
radius-server source interface LoopBack0
# 提交
commit
quit
第二段,认证方案与计费方案:
# 进入 AAA 视图
aaa
# 认证方案 auth_radius
authentication-scheme auth_radius
authentication-mode radius
quit
# 计费方案 acct_radius
accounting-scheme acct_radius
accounting-mode radius
quit
第三段,域——把方案、服务器组、地址池串起来:
# 仍在 aaa 视图
domain isp_dorm
# 绑定认证方案与计费方案
authentication-scheme auth_radius
accounting-scheme acct_radius
# 绑定 RADIUS 服务器组
radius-server group rd1
# 绑定本地地址池(也可以由 RADIUS 的 Framed-Pool 指定)
ip-pool pool_dorm
# 提交
commit
quit
quit
第四段,几个应对异常的实用配置(这些在文档里都有,是运维救命稻草):
# 强制发送计费停止报文
# 场景:认证成功但计费失败时,服务器可能残留用户表项占着 IP
radius-server accounting-stop-packet send force
# 认证被拒后轮询其他 RADIUS 服务器
# 场景:主服务器上没有该用户,想让他去备用服务器试试
radius-server authentication rollover-on-reject
# 关闭 RADIUS 服务器不可达告警
# 场景:告警风暴时临时静音(不推荐长期关闭)
radius-server alarm disable
# 提交
commit
33.2.3 逐行讲解
| 命令 | 干什么 | 新手常填错的地方 |
|---|---|---|
radius-server group rd1 |
建服务器组 | V6 老设备用 radius-server template,抄错版本会报错 |
radius-server shared-key-cipher |
共享密钥 | 与服务器不一致 → 全部认证失败,但网络是通的 |
radius-server authentication <ip> <port> |
认证服务器 | 端口写错(1812 vs 1645)→ 报文没人应答 |
radius-server accounting <ip> <port> |
计费服务器 | 与认证端口写反 → 能认证但不出账 |
radius-server algorithm master-backup |
主备选路 | 不配则默认行为可能不符合预期 |
radius-server source interface |
源接口 | 不配则源地址随出口变,服务器 client 匹配不上 |
authentication-scheme |
认证方案 | 只建不在域里引用 → 没有效果 |
authentication-mode radius |
用 RADIUS 认证 | 想用本地兜底要另配 local |
accounting-scheme |
计费方案 | 漏配 → 能上网但没账单 |
domain isp_dorm |
建域 | 域名与用户名后缀不一致 → 走默认域 |
radius-server group rd1(域内) |
域绑服务器组 | 不绑 → 认证请求不知道发哪 |
accounting-stop-packet send force |
强制发停止报文 | 文档场景:认证成功计费失败导致 IP 被占死 |
authentication rollover-on-reject |
被拒后轮询 | 多服务器场景下有用,单服务器配了没意义 |
几个必须展开讲的关键点:
① 共享密钥(shared key)为什么这么关键? RADIUS 报文里的密码字段是用共享密钥加密的,报文还带一个用密钥算的认证字(Authenticator)防篡改。密钥不一致时,服务器连报文完整性校验都过不了,会直接丢弃——在服务器日志里可能只看到「discarding packet from unknown client」或干脆一片空白,而在 BRAS 上只看到「认证超时」。这个「两边都看不到原因」的现象,是共享密钥问题的典型特征。
② radius-server source interface LoopBack0 为什么强烈建议配? 因为服务器侧的 clients.conf 是按源 IP 来识别和放行客户端的。如果 BRAS 不配源接口,报文源地址会跟着出口接口变(比如主备链路切换后换了出口),服务器就会把这个「陌生 IP」当未知客户端丢弃。配一个稳定的 LoopBack 做源接口,是运营商级部署的标准动作。
③ accounting-stop-packet send force 是干什么的? 文档原文描述的场景很具体:正常情况下 RADIUS 服务器要等计费成功后才会生成用户表项;但某些情况下,认证成功、计费开始之前,服务器就已经建了表项。如果这时计费失败,这个 IP 就释放不了,用户用这个 IP 再也上不来线。这条命令就是让 BRAS 强制发一个 Stop 报文,把这个残留表项清掉。排「某个 IP 死活上不来线」这类怪问题时,这条命令是解药。
33.2.4 本地认证兜底与 RADIUS 优先级
生产上有时需要「RADIUS 挂了还能让管理员账号登录」,这就涉及本地认证的兜底配置:
# 创建本地账号(用于设备管理,不是宽带用户)
aaa
local-user admin password irreversible-cipher Admin@2024
local-user admin privilege level 15
local-user admin service-type telnet http
commit
本地用户命令已核实(设备管理账号,aaa 视图下):
# 进入 AAA 视图
aaa
# 创建本地用户并设置不可逆加密密码
local-user admin password irreversible-cipher Admin@2024
# 权限级别 15(最高)
local-user admin privilege level 15
# 允许的服务类型
local-user admin service-type telnet http
commit
IPoE 绑定认证用户的密码生成方式也核实了,这是 IPoE 场景真正会用到的:
# 系统视图下配置 IPoE 用户的默认密码(用于绑定认证,用户无需输入密码)
# 可按 MAC 地址自动生成密码
default-password { option77 | user-class | mac-address { noseparator | separator <c> } }
已核实:
default-password [ template <name> ] { cipher <p> | simple <p> | { option60 | vendor-class } [...] | { option77 | user-class | mac-address { noseparator | separator <c> } } }——「A password or password template is configured for an IPoE user」。也就是说 IPoE 绑定认证模式下,设备会用 MAC 地址等自动拼出用户名和密码,这就是"绑定认证"的实现机制。 URL:https://support.huawei.com/enterprise/en/doc/EDOC1100367122/(User Access → Configuring and Managing Users → Configuring Username and Password Generation Modes)⚠ 官方还有一条安全要求:密码至少 8 位,且至少含大写、小写、数字、特殊字符中的两类;建议用
cipher密文方式而不是simple明文。
强烈建议不要给宽带用户配本地兜底。原因:本地账号是静态的,一旦 RADIUS 挂了自动切本地,用户密码验证就绕过了集中管控;而且本地账号无法反映欠费状态。正确做法是:RADIUS 做主认证,本地只留给设备管理账号。
33.2.5 RADIUS 属性与 ACL 下发
Filter-Id 下发 ACL 的实际配置分两步:先在 BRAS 上定义 ACL,再让 RADIUS 点名。
# 第一步:在 BRAS 上定义 ACL(名字要和 RADIUS 下发的 Filter-Id 完全一致)
acl name acl_library advanced
rule 5 permit ip destination 10.200.20.0 0.0.0.255
rule 10 deny ip
commit
quit
# 第二步:RADIUS 侧给用户配 Filter-Id = "acl_library"
# (这是服务器侧的配置,见 32.3.4 FreeRADIUS 部分)
注意大小写和空格:Filter-Id 的值会原样传给 BRAS 去匹配 ACL 名,多一个空格、大小写不对,都匹配不上。匹配不上时的表现是最恶心的——用户正常上线、正常上网,就是策略没生效,任何日志都看不出异常。
33.2.6 排查 AAA 的核心命令
# 查看上线上线失败记录(第一现场)
display aaa online-fail-record
# 查看 RADIUS 服务器状态(是否可达)
display radius-server
# 查看 RADIUS 配置
display radius-server configuration
# 查看 AAA 相关配置
display current-configuration configuration aaa
display aaa online-fail-record 是本章最重要的命令。它能告诉你每个用户为什么上线失败,失败原因通常会区分到「认证失败」「地址分配失败」「会话数超限」等类别。华为官方知识库明确指出:它无法显示完整的上线交互信息,如果需要更细的追踪,要用 trace 功能。
官方还给出了两条配套命令(已核实):
# 开启「记录用户上线失败」功能(默认可能是关的,关着就查不到失败记录)
aaa
online-fail-record
commit
quit
# 清空上线失败记录
reset aaa online-fail-record
已核实:官方原文「The device records user login failures only when the user login failure recording function is enabled. If the device is disabled from recording user login failures, run the
aaa online-fail-recordcommand to enable this function.」以及「Run thereset aaa online-fail-recordcommand in the user view to clear the statistics about all user login failure records.」 URL:https://support.huawei.com/enterprise/en/doc/EDOC1100367122/(User Access → AAA → Maintaining AAA and User Management)这条极重要:如果你执行
display aaa online-fail-record看到的是空的,先别以为没失败过——很可能是记录功能没开。
⚠ 未核实项(如实说明):上文提到的 trace 功能(跟踪指定用户完整上线交互过程)在 NE40E 的《配置指南》中没有独立章节,它属于《诊断命令》文档(Diagnose)范畴,本轮未取到其确切命令语法。如果你的现场确实需要 trace,请在 support.huawei.com 检索该版本对应的 NE40E Diagnose/诊断文档。 ⚠ 待核实:待核实 —— NE40E trace 功能(跟踪指定用户上线全过程)在《配置指南》中无独立章节,属《诊断命令》文档范畴,需查 NE40E V800R023C10 Diagnose 文档核对确切语法
33.2.7 华为 RADIUS 属性下发能力的全景
华为在 RADIUS 属性这块提供的能力相当丰富,官方文档的《配置设备作为 RADIUS 客户端》章节列出了一长串可选项。这些能力按用途归类,能帮你快速定位该翻哪一节文档:
| 能力类别 | 用途 | 典型场景 |
|---|---|---|
| 服务器动态下发 ACL | 按用户下发访问控制 | 教学区限制访问娱乐网站 |
| 服务器控制用户 QoS | 按用户下发带宽策略 | 套餐限速(第 35 章详述) |
| RADIUS 动态授权 | 服务器主动踢人/改策略 | 欠费立即断、达量降速 |
| RADIUS 代理认证 | 报文转给其他服务器 | 多级认证架构 |
| 从服务器获取静态路由 | 按用户下发路由 | 特殊用户的回程路由 |
| 属性转换 | 兼容不同厂商的属性语法 | 与第三方服务器对接 |
| 关闭 RADIUS 属性 | 不发某些属性出去 | 服务器不认识某属性时 |
| 属性解析 | 控制哪些属性被解析 | 兼容性调优 |
| 灵活互通 | 私有限速属性的兼容处理 | 老服务器/新 BRAS 混用 |
| RADIUS 报文缓存与重传 | 提升可靠性 | 高延迟链路 |
| RADIUS 报文 DSCP | 报文优先级 | QoS 保障 RADIUS 不丢 |
| RADIUS 扩展源端口 | 提高并发会话数 | 单机十万级会话 |
| RADIUS CAR | 限制发往服务器的报文速率 | 防服务器被打爆 |
| 服务器状态探测 | 自动发现服务器不可用 | 主备切换 |
其中「属性转换」和「关闭属性」这两项,是解决跨厂商对接问题的关键武器。 举个例子:某些第三方 RADIUS 服务器不理解华为发出去的某个私有属性,会直接拒绝整个报文;这时用「关闭属性」让 BRAS 不发送该属性即可解决。反过来,如果服务器下发的属性格式和 BRAS 期望的不一致,可以用「属性转换」做映射。
还有一个实用的可选特性——本地生成并存储用户话单。官方文档描述得很清楚:如果使用 RADIUS 计费,建议配置「本地生成并存储用户话单」,这样即使对接的 RADIUS 服务器在用户上线或下线时没有响应,用户的计费信息仍然正确。这在计费纠纷时是救命的功能——把所有会话先记在本地,服务器好了再补传。
33.2.8 一个完整的对接实例:从 BRAS 到 FreeRADIUS 逐项核对
下面把 BRAS 侧和服务器侧的配置并排放,方便逐项核对。这个「对称核对法」是现场实施最有效的手段:
BRAS 侧(华为) 服务器侧(FreeRADIUS clients.conf)
────────────────────── ────────────────────────────────
radius-server source interface LoopBack0
LoopBack0 地址 = 10.200.0.2 ────────→ client bras-dorm {
ipaddr = 10.200.0.2 ← 必须一致
radius-server shared-key-cipher Bras@2024 netmask = 32
────────→ secret = Bras@2024 ← 必须一致
radius-server authentication 10.200.1.10 1812
────────→ (服务器监听 1812)
radius-server accounting 10.200.1.10 1813
────────→ (服务器监听 1813)
BRAS 侧(域) 服务器侧(users 文件)
──────────── ────────────────────
domain isp_dorm ────────────────────→ 用户名带 @isp_dorm 后缀
ip-pool pool_dorm ───────────────────← Framed-Pool = "pool_dorm"(可选,覆盖域默认)
核对时按这张表的每一行逐个确认。任何一行不一致,就会在对应环节失败,而且失败现象各不相同:
| 不一致的那一行 | 失败现象 | 失败环节 |
|---|---|---|
| 源 IP | 服务器无任何日志,BRAS 报超时 | 报文被服务器丢弃 |
| 共享密钥 | 服务器无日志或报 discarding,BRAS 报超时 | 完整性校验失败 |
| 认证端口 | BRAS 报超时,服务器完全无感知 | 报文发错端口 |
| 计费端口 | 认证正常,但无账单 | 计费报文发错端口 |
| 域名后缀 | 服务器日志显示 user not found | 授权阶段 |
| 池名 | 认证通过但地址分配失败 | 地址分配阶段 |
这张表的价值在于:看到现象就能直接定位到是哪一行没对上,不用再逐个试错。
33.3 H3C 设备配置详解
33.3.1 命令差异先说清楚
H3C 的 AAA 配置比华为少一层——没有独立的认证/计费方案,直接写在 ISP 域里。三条关键差异:
- 华为
radius-server group→ H3Cradius scheme - 华为
authentication-scheme+accounting-scheme→ H3C 域内直接authentication ppp radius-scheme rs1 - 华为的主备算法配置 → H3C 用
primary/secondary服务器角色
33.3.2 完整配置模板
下面这份是 H3C 的完整 AAA 配置:
第一段,RADIUS 方案:
# 进入系统视图
system-view
# 建 RADIUS 方案 rs1
radius scheme rs1
# 主认证服务器与主计费服务器
primary authentication 10.200.1.10
primary accounting 10.200.1.10
# 共享密钥(simple 为明文输入,另有 cipher 密文输入)
key authentication simple Bras@2024
key accounting simple Bras@2024
# 退出
quit
第二段,ISP 域:
# 建 ISP 域 isp1
domain name isp1
# PPP 用户的认证、授权、计费全部走 rs1
authentication ppp radius-scheme rs1
authorization ppp radius-scheme rs1
accounting ppp radius-scheme rs1
# 授权地址池
authorization-attribute ip-pool pool1
# 退出
quit
第三段,动态授权(DAS/DAC)——用于服务器主动踢人、改策略:
# 配置动态授权服务器
radius dynamic-author server
# 允许 DAC(服务器的动态授权客户端)10.200.1.10 连接
client ip 10.200.1.10 key simple Bras@2024
# 退出
quit
动态授权是什么? 是 RADIUS 的扩展能力(RFC 3576,也叫 CoA/Disconnect)。传统模式下服务器只能被动等 BRAS 来问;配了动态授权后,服务器可以主动向 BRAS 发指令:踢掉某个用户、改某个用户的限速、给某个用户重新下发策略。这是运营商「用户欠费立即断网」「客服在线提速」的实现基础。
第四段,其他常用配置:
# 配置 BRAS 侧的 NAS-IP(服务器据此识别是哪台 BRAS)
# 具体配置位置按版本,通常在 RADIUS 方案或全局
radius nas-ip 10.200.0.2
# 保存
save force
已核实的语法:H3C 指定 NAS IP 有三个位置,命令名各不相同,这点很容易搞错:
位置 命令 生效范围 系统视图 `radius nas-ip { ipv4-address ipv6 ipv6-address }` RADIUS 方案视图 `nas-ip { ipv4-address ipv6 ipv6-address }` 三层接口视图 `aaa nas-ip { ipv4-address ipv6 ipv6-address }` 优先级(官方原文):接口视图 > RADIUS 方案视图 > 系统视图。若三处都配了,接口那条最优先——排查「NAS-IP 不对」时要三处都看。 出处:H3C CR16000-F《02-AAA configuration》,URL:https://www.h3c.com/en/d_202001/1262629_294551_0.htm
33.3.3 逐行讲解
| 命令 | 干什么 | 与华为的差异 |
|---|---|---|
radius scheme rs1 |
建 RADIUS 方案 | 对应华为 radius-server group |
primary authentication <ip> |
主认证服务器 | 华为 radius-server authentication <ip> <port> |
primary accounting <ip> |
主计费服务器 | 华为 radius-server accounting <ip> <port> |
key authentication simple <key> |
认证密钥 | 对应华为 radius-server shared-key-cipher |
key accounting simple <key> |
计费密钥 | H3C 认证与计费密钥可以分开配 |
domain name isp1 |
ISP 域 | 华为 domain isp1 |
authentication ppp radius-scheme rs1 |
PPP 用户认证走 rs1 | 华为要绕 authentication-scheme |
authorization ppp radius-scheme rs1 |
授权走 rs1 | 华为用 authorization-scheme |
accounting ppp radius-scheme rs1 |
计费走 rs1 | 华为用 accounting-scheme |
authorization-attribute ip-pool pool1 |
授权地址池 | 华为 ip-pool pool1 |
radius dynamic-author server |
开启动态授权 | 华为有对应特性但命令体系不同 |
client ip <ip> key simple <k> |
允许的服务器 | — |
H3C 的 ppp 关键字必须注意:authentication ppp radius-scheme rs1 里的 ppp 表示「这个配置只对 PPP 类用户(PPPoE/PPP)生效」。如果同一台设备上还有 IPoE 用户,IPoE 用户走的是另一套关键字(例如官方举例里出现过的 authorization ipoe radius-scheme rs1)。这正是 H3C 设计上的灵活之处:同一个域里,不同接入类型的用户可以走不同的服务器和策略。
# H3C:同一个域里分别给 PPP 和 IPoE 用户配置不同策略(官方举例形态)
domain name isp_print
authentication ppp radius-scheme rs1
authorization ppp radius-scheme rs1
accounting ppp radius-scheme rs1
authorization ipoe radius-scheme rs1
accounting ipoe none
quit
上面这段来自 H3C 官方 BRAS 配置举例,展示了 IPoE 用户「只认证不计费」的写法——accounting ipoe none。这个需求在校园网打印服务、设备接入等场景很常见。
33.3.4 FreeRADIUS 对接要点(两家通用)
FreeRADIUS 是开源免费的 RADIUS 服务器,学校和小企业用得最多。对接要点分三块:
第一块:clients.conf —— 告诉服务器「哪些 BRAS 允许连」
# /etc/freeradius/3.0/clients.conf
# 声明一台 BRAS 客户端:IP 与共享密钥
client bras-dorm {
ipaddr = 10.200.0.2
netmask = 32
secret = Bras@2024
require_message_authenticator = no
}
要点:ipaddr 必须与 BRAS 发出报文的源地址一致(这就是为什么要配 radius-server source interface);secret 必须与 BRAS 上的共享密钥逐字节一致。
第二块:users 文件 —— 配账号与属性
# /etc/freeradius/3.0/users
# 普通用户:密码 + 从指定池取地址
"user1@isp_dorm" Cleartext-Password := "pass1"
Framed-Pool = "pool_dorm",
Session-Timeout = 86400
# 固定 IP 用户
"printer01@isp_dorm" Cleartext-Password := "Printer@123"
Framed-IP-Address = 10.200.10.200
# 带 ACL 下发的用户
"user2@isp_dorm" Cleartext-Password := "pass2"
Filter-Id = "acl_library"
# H3C 用户:带私有限速属性(官方示例写法)
"User4@isp1" Cleartext-Password := "pass4"
H3C_Input_Average_Rate = 10000000,
H3C_Output_Average_Rate = 10000000
关键点:
Cleartext-Password是明文存储。CHAP 认证必须能拿到明文密码,所以 CHAP 场景下不能用不可逆的哈希存储。- 属性之间用逗号分隔,最后一个属性后面不要留逗号(部分版本会报错)。
Framed-IP-Address的 IP 必须在地址池的网段范围内,否则 BRAS 会拒绝下发。
第三块:字典 —— 私有属性必须先定义
FreeRADIUS 默认不认识厂商私有属性,需要加载对应字典:
# 在 /etc/freeradius/3.0/dictionary 中确保引用了厂商字典
# 华为、H3C 的私有属性各有其字典文件
⚠ 厂商字典文件的准确名称与属性编号:不同 FreeRADIUS 版本自带的厂商字典覆盖范围不同,H3C/华为部分私有属性可能需要自行补充字典项。使用任何私有属性前,务必用
radtest或服务器日志确认属性被正确解析,而不是被当作未知属性丢弃。 ⚠ 待核实:待核实 —— FreeRADIUS 中华为/H3C 私有属性的官方字典文件名与属性编号需按 FreeRADIUS 版本与厂商《RADIUS 属性说明》核对
第四块:调试
# FreeRADIUS 前台调试模式(能看到每一条报文的收发与属性解析)
freeradius -X
# 命令行测试一个账号(快速验证服务器侧是否正常)
radtest user1@isp_dorm pass1 127.0.0.1 0 testing123
freeradius -X 是排 RADIUS 问题的终极武器,它会打印每一条收到的报文、解析出的属性、匹配到的用户、返回的属性。BRAS 侧看到的「认证失败」,在 -X 的输出里几乎总能一眼看出原因。
33.3.5 计费报文与对账
计费这块新手最容易忽略,但它直接关系到钱。三种计费报文:
| 报文类型 | Acct-Status-Type |
触发时机 | 关键字段 |
|---|---|---|---|
| 开始 | Start(1) |
用户上线成功 | Acct-Session-Id |
| 更新 | Interim-Update(3) |
周期性上报(如每 10 分钟) | Acct-Session-Time、流量计数 |
| 停止 | Stop(2) |
用户下线 | Acct-Session-Time、上下行字节、下线原因 |
为什么需要 Interim-Update(中间计费)? 因为如果只在 Start 和 Stop 时记账,一旦 BRAS 意外重启,Stop 发不出来,这次会话的时长和流量就全丢了。中间计费相当于「定期存档」,丢了也只丢最后一个周期的数据。生产环境一定要开中间计费。
常见的计费问题:
| 现象 | 原因 | 排查 |
|---|---|---|
| 完全无账单 | 计费方案没配 / 计费端口错 | 看 accounting-scheme 与端口 |
| 有 Start 无 Stop | BRAS 重启 / 链路断 | 查中间计费是否开启 |
| 时长明显偏长 | Stop 没收到,按最长时间兜底 | 查 RADIUS 日志 |
| 流量对不上 | 计费方向理解反了 | Acct-Input-Octets 是从用户进来的(上行) |
流量方向的坑必须说清楚:Acct-Input-Octets 是「进入 BRAS 的字节数」,对 BRAS 来说就是从用户方向来的,也就是用户的上行流量;Acct-Output-Octets 是发往用户的,即下行流量。很多新手把这两个搞反,导致报表上下行颠倒。
33.3.6 双栈用户的 AAA 与计费分离
IPv6 普及后,一个绕不开的问题是:双栈用户的 IPv4 和 IPv6 流量要不要分别计费?
两种做法:
做法一:合并计费(推荐)
一次认证 → 一个会话 → 一份账单 → 流量是 v4+v6 合计
优点:简单、用户易懂
缺点:无法区分 v4/v6 用量
做法二:分离计费
分别统计 IPv4 与 IPv6 的流量,出两份账单数据
优点:精细
缺点:配置复杂,且对 keepalive 参数有特殊要求
如果选择分离计费,H3C 官方有一条明确的注意事项:当需要把 PPPoE 用户的 IPv4 与 IPv6 流量分开计费,且用户是通过三层聚合接口或三层聚合子接口上线时,VT 接口上的 keepalive 间隔必须不小于 60 秒。这条限制的意义在于:计费分离依赖周期性的统计采样,keepalive 太频繁会干扰采样周期。
绝大多数校园网和企业网用做法一就够了,不必为了精细拆分去承担额外复杂度。
33.3.7 H3C 的 RADIUS 服务器状态与业务连续性
H3C 的 display radius scheme 输出里能看到服务器状态。这里有个新手极易误判的点需要提前说清楚:
服务器状态显示 Active → 正常,报文会发过去
服务器状态显示 Blocked → H3C 已判定该服务器不可用,不再发报文
Blocked 状态是怎么来的?H3C 通过探测或连续超时判定服务器宕机后,会把它标记为不可用,后续所有认证请求都不再发往这台服务器。这带来的现象是:
- 用户全部认证失败;
- 服务器端日志里一条记录都没有(因为报文根本没发出去);
- 此时不管你怎么查服务器都查不出问题。
这个现象和第 32.1 节讲的「共享密钥问题」表现几乎一模一样(都是「两边都没日志」),但根因完全不同。区分方法:如果是共享密钥问题,服务器可能还有「discarding」类的日志;如果是 Blocked,服务器真的收不到任何东西,且 BRAS 侧 display radius scheme 能看到状态异常。先看 BRAS 侧的服务器状态,再看服务器侧日志,顺序别反。
H3C 侧主动探测服务器状态的命令已核实,配在系统视图下:
# 配置 RADIUS 认证服务器状态探测模板(interval 为探测间隔,单位秒)
radius-server test-profile probe1 username probeuser interval 60
它会周期性地拿一个专门用于探测的账号去试认证,以此判断服务器是否还活着。注意它是系统视图下的「探测模板」,不是配在 RADIUS 方案里的——这点和直觉不同。
出处:H3C CR16000-F《02-AAA configuration》「Configuring a test profile for detecting the status of RADIUS authentication servers」,原文命令
radius-server test-profile profile-name username name [ interval interval ]。URL:https://www.h3c.com/en/d_202001/1262629_294551_0.htm实务提醒:探测账号要专门建一个权限最小、不会真正上线的账号,别拿真实用户账号去探测,否则会污染计费和在线表。
33.4 华为 / H3C 命令对照表
| 功能 | 华为(VRP / NE40E) | H3C(Comware / CR16000-F) | 差异说明 |
|---|---|---|---|
| RADIUS 服务器组/方案 | radius-server group rd1 |
radius scheme rs1 |
V6 老华为用 radius-server template |
| 认证服务器 | radius-server authentication <ip> <port> |
primary authentication <ip> |
华为显式写端口 |
| 计费服务器 | radius-server accounting <ip> <port> |
primary accounting <ip> |
华为显式写端口 |
| 认证密钥 | radius-server shared-key-cipher <k> |
key authentication simple <k> |
语法不同 |
| 计费密钥 | 同上(共用密钥) | key accounting simple <k> |
H3C 可分开配 |
| 源接口 | radius-server source interface <if> |
按版本的 nas-ip 等 |
目的相同:固定源地址 |
| 选路算法 | radius-server algorithm master-backup |
primary/secondary 角色 |
概念对应 |
| 认证方案 | authentication-scheme + authentication-mode radius |
域内 authentication ppp radius-scheme rs1 |
H3C 少一层 |
| 计费方案 | accounting-scheme + accounting-mode radius |
域内 accounting ppp radius-scheme rs1 |
同上 |
| 授权方案 | authorization-scheme(可选) |
域内 authorization ppp radius-scheme rs1 |
— |
| 域 | domain isp1 |
domain name isp1 |
H3C 多 name |
| 域绑定服务器 | radius-server group rd1(域内) |
由 radius-scheme rs1 隐含 |
— |
| 域绑地址池 | ip-pool pool1 |
authorization-attribute ip-pool pool1 |
— |
| 按接入类型区分 | 靠不同域/不同 BAS 接口 | ppp / ipoe 关键字区分 |
H3C 更灵活 |
| 计费停止强制发送 | radius-server accounting-stop-packet send force |
按版本命令参考 | 解 IP 占用问题 |
| 认证被拒轮询 | radius-server authentication rollover-on-reject |
按版本命令参考 | 多服务器场景 |
| 动态授权 | 有对应特性(命令不同) | radius dynamic-author server + client ip ... key ... |
服务器主动踢人/改策略 |
| 上线失败记录 | display aaa online-fail-record |
按版本的 display 命令 | 排错第一现场 |
| 提交/保存 | commit + save |
save force |
华为特有 |
33.5 配置验证
AAA 的验证要从服务器侧往回查,因为大部分问题出在服务器而不是 BRAS。按顺序四步:
第一步:确认 BRAS 能到服务器
# 华为:先确认网络可达(RADIUS 走 UDP,ping 只能证明 IP 层通)
ping -a 10.200.0.2 10.200.1.10
ping 通只说明 IP 层通,不代表 UDP 1812/1813 通。中间有防火墙时,很可能 ping 得通但 RADIUS 报文被拦。这种情况要去查防火墙策略。
第二步:确认 BRAS 侧配置正确
# 华为:查看 RADIUS 服务器状态
display radius-server
期望看到服务器状态为 Up 或 Active。如果显示 Down,说明 BRAS 认为服务器不可达。
# 华为:查看 RADIUS 配置
display radius-server configuration
核对服务器 IP、端口、共享密钥类别(不能用 display 看到明文密钥,但能确认已配)。
第三步:让用户拨号,看结果
# 华为:上线失败记录
display aaa online-fail-record
# 华为:在线用户
display access-user domain isp_dorm
online-fail-record 里应该能看出失败原因类别。常见类型:
| 失败记录中的关键词 | 含义 | 转向 |
|---|---|---|
| 认证失败 / Authentication failed | 服务器返回了 Reject | 查服务器 users 文件 |
| 无响应 / No response | 服务器没回 | 查共享密钥、网络、服务器状态 |
| 地址分配失败 | 认证过了但没地址 | 查地址池 |
| 会话数超限 | 达到上限 | 查 access-ip-limit |
第四步:在服务器侧验证
# FreeRADIUS 前台调试(最关键的一步)
freeradius -X
在 -X 的输出里,看两件事:
- 能不能收到 Access-Request:如果完全没收到,问题在网络或共享密钥(被丢弃)。
- 返回的是 Accept 还是 Reject:Reject 的话,输出里会写明哪个属性没匹配上。
正常的一次成功认证,-X 输出里应该能依次看到:
(0) Received Access-Request Id 123 from 10.200.0.2:1234 to 10.200.1.10:1812 length 95
(0) User-Name = "user1@isp_dorm"
(0) NAS-IP-Address = 10.200.0.2
(0) # Executing section authorize
(0) [files] = ok
(0) # Executing section authenticate
(0) [pap] = ok ← 或 [chap] = ok
(0) Sent Access-Accept Id 123 from 10.200.1.10:1812 to 10.200.0.2:1234 length 44
(0) Framed-Pool = "pool_dorm"
(0) Session-Timeout = 86400
如果看到 [files] = notfound,说明用户名在 users 文件里找不到——多半是域后缀不匹配(比如用户配的是 user1 但 BRAS 发来的是 user1@isp_dorm)。
第五步:验证计费
# FreeRADIUS 前台调试,观察计费报文
freeradius -X
用户上线后应看到 Acct-Status-Type = Start,下线后应看到 Stop。如果只有 Start 没有 Stop,说明下线时 BRAS 没发停止报文(可能是异常掉线或 BRAS 重启)。
33.6 排错与故障树
AAA 的故障树和 PPPoE 不同:PPPoE 是「分阶段卡」,AAA 是「分方向查」——要么是请求到不了服务器,要么是服务器拒绝了,要么是服务器答应了但 BRAS 执行不了。
认证失败
│
├─ Q1: 服务器收到 Access-Request 了吗?(看 freeradius -X)
│ │
│ ├─ 没收到 ──┬─ ① 网络不通(防火墙拦 UDP 1812)
│ │ ├─ ② 共享密钥不一致(报文被丢弃)
│ │ ├─ ③ 服务器 clients.conf 没这条记录(源 IP 不匹配)
│ │ └─ ④ BRAS 发到错服务器/错端口
│ │
│ └─ 收到了 ──→ Q2
│
├─ Q2: 服务器回的是 Accept 还是 Reject?
│ │
│ ├─ Reject ──┬─ ① 用户不存在(域后缀不匹配最常见)
│ │ ├─ ② 密码错误
│ │ ├─ ③ 账号被禁用/过期
│ │ └─ ④ 认证方式不匹配(服务器只支持 PAP,客户端发 CHAP)
│ │
│ └─ Accept ──→ Q3
│
└─ Q3: BRAS 收到 Accept 后能执行吗?
│
├─ 地址分配失败 ──→ ① 池耗尽 ② Framed-Pool 指向的池不存在 ③ 域没绑池
├─ 策略没生效 ──→ ① Filter-Id 对应的 ACL 不存在 ② 属性被丢弃
└─ 计费不成功 ──→ ① 计费端口错 ② 计费密钥与认证密钥不同且配错
逐条对应排查表:
| 症状 | 可能原因 | 排查命令/方法 | 定位要点 |
|---|---|---|---|
| 全部用户认证失败 | 共享密钥不一致 | freeradius -X 看有无报文 |
两边日志都无原因 → 强怀疑密钥 |
| 全部用户认证失败 | 防火墙拦 UDP | display radius-server |
状态 Down |
| 全部用户认证失败 | 服务器 clients.conf 无此 IP | 对照源 IP | 源接口没配导致 IP 变了 |
| 部分用户失败 | 域后缀不匹配 | freeradius -X 看 User-Name |
服务器上找不到该用户名 |
| 部分用户失败 | 密码错 | 日志 | — |
| 认证通过但拿不到地址 | Framed-Pool 池不存在 | display ip pool |
池名拼错 |
| 认证通过但策略不生效 | Filter-Id 的 ACL 不存在 | display acl |
静默失败,无日志 |
| 能认证但无账单 | 计费端口/密钥错 | RADIUS 日志 | 只看到 Access 无 Acct |
| 某 IP 永远上不来 | 残留表项占着 IP | 服务器数据库 | 用 accounting-stop-packet send force |
几个高频场景的完整路径:
场景一:整个 BRAS 的用户全部认证失败,服务器日志一条记录都没有。
这是最典型的共享密钥问题(或网络问题)。排查顺序:
# 1. BRAS 侧确认服务器可达
display radius-server
# 2. 服务器侧开启调试
# freeradius -X
# 3. 让一个用户拨号,观察 -X 输出
# 完全无输出 → 报文没到服务器
# 4. 确认源 IP(在 BRAS 上)
display radius-server configuration
# 看源接口配置,再用该接口地址去比服务器的 clients.conf
# 5. 逐字节核对共享密钥
# 特别注意:有没有多余空格、引号、大小写
共享密钥问题的诊断技巧:把服务器上的 secret 临时改成和 BRAS 完全一样(复制粘贴而不是手敲),再试一次。如果立刻好了,就是密钥问题。
场景二:能认证、能上网,但策略(限速/ACL)没生效。
这是 Filter-Id 或私有属性下发失败。按顺序查:
# 1. 服务器侧确认属性确实下发了
# freeradius -X 里看 Access-Accept 的回复属性
# 2. BRAS 侧确认 ACL 存在且名字完全一致
display acl name acl_library
# 3. 查用户实际拿到的策略
display access-user username user1@isp_dorm
# 看输出里的 ACL/策略字段
# 4. 如果是私有属性(如限速),确认属性编号/格式被正确解析
Filter-Id 匹配不上 ACL 时的表现是完全静默——没有错误日志,用户正常上网,只是策略没生效。所以这条要靠「服务器侧确认下发了 → BRAS 侧确认 ACL 存在」两头核对。
场景三:某个用户突然怎么都上不来,其他人正常。
# 1. 查是否有残留会话
display access-user username user1@isp_dorm
# 2. 有残留 → 踢掉
cut access-user username user1@isp_dorm
# 3. 无残留但仍上不来 → 查失败记录
display aaa online-fail-record
# 4. 如果记录里显示"地址分配失败",可能这个用户的 Framed-IP-Address 被占用
场景四:能认证但一直没账单。
# 1. 确认计费方案已配且被域引用
display domain isp_dorm
# 看 Accounting-scheme-name 是否为空
# 2. 确认计费服务器地址和端口
display radius-server configuration
# 3. 服务器侧看有没有 Acct 报文
# freeradius -X 中搜索 "Acct-Status-Type"
33.7 新手踩坑与注意事项
- 共享密钥不一致——症状是「两边日志都看不到原因」。这是 AAA 排错的第一嫌疑,先查它。
- 没配源接口,导致 BRAS 源 IP 变化——主备链路切换后服务器不认了。配
radius-server source interface LoopBack0。 - 在 V8 设备上抄 V6 的
radius-server template——命令不存在,别怀疑设备坏了。 - 以为 RADIUS 下发策略就能凭空生效——
Filter-Id只是「点名」,ACL 必须在 BRAS 上先定义好。 Filter-Id大小写/空格不匹配——静默失败,用户正常上网但策略没生效,极难发现。- 把上行下行计费字段搞反——
Acct-Input-Octets是用户上行。报表反了要赔钱。 - 不开中间计费——BRAS 一重启,整段时间的用量全丢。
- 给宽带用户配本地兜底认证——RADIUS 一挂,欠费用户全放行了。
- 端口配错(1812 vs 1645)——老设备用 1645/1646,新设备 1812/1813,配错就是无响应。
Framed-IP-Address不在池网段内——BRAS 拒绝下发,用户上不来,但日志里原因很隐晦。- 域后缀和服务器用户表不匹配——用户配置成
user1但 BRAS 发user1@isp_dorm,服务器查不到。 - 不看
freeradius -X就瞎改 BRAS 配置——RADIUS 问题九成能在-X里看明白,别在 BRAS 上瞎试。
33.8 本章小结
- AAA = 认证(你是谁)+ 授权(你能干什么)+ 计费(你用了多少)。RADIUS 是实现这三件事的协议。
- BRAS 不做决策,只做执行。策略配在服务器上,BRAS 按属性执行。这是本章最核心的认知。
- 认证报文走 1812,计费报文走 1813,数据流量不经过 RADIUS。RADIUS 挂了,在线用户照样能上网。
- 四个核心属性:
Framed-IP-Address(固定 IP)、Framed-Pool(指定池)、Filter-Id(下发 ACL)、Session-Timeout(会话时长)。 - 系统属性不够用时靠厂商私有属性扩展,华为与 H3C 的属性名完全不同,必须分别对接。
- 华为的 RADIUS 体系在 V6→V8 有过迁移(
radius-server template→radius-server group),抄文档务必对版本。 - H3C 的 AAA 比华为少一层(无独立方案),并且能用
ppp/ipoe关键字按接入类型分流。 - 排错三问:服务器收到了吗?回的是 Accept 还是 Reject?BRAS 能执行吗?
适用版本:华为 NE40E V800R023C10 系列(RADIUS 命令体系以 V8 为准,V6 设备请对照
radius-server template文档);H3C CR16000-F Release 795x;FreeRADIUS 3.0 系列。
自测题
- RADIUS 服务器宕机后,已经在线上的用户能不能继续上网?为什么?
Filter-Id下发 ACL 时,ACL 是定义在 BRAS 上还是 RADIUS 服务器上?- 华为的 RADIUS 配置在 V6 和 V8 之间有什么主要变化?
Acct-Input-Octets对应的是用户的上行还是下行流量?- 为什么一定要配
radius-server source interface?
- 能。因为 RADIUS 只负责认证和计费,用户数据流量直接由 BRAS 转发,不经过 RADIUS 服务器。RADIUS 挂掉只会导致新用户无法认证上线,并影响计费上报。
- ACL 必须定义在 BRAS 上。RADIUS 只通过
Filter-Id属性「点名」一个 ACL 名称,BRAS 用这个名字去本地查找已有的 ACL 并套用。名字不匹配时静默失败。 - V6 使用
radius-server template模板体系,V8 改为radius-server group服务器组体系。在 V8 设备上执行 V6 命令会报「命令不存在」。 - 上行流量。
Acct-Input-Octets指进入 BRAS 的字节数,即从用户方向发来的流量;Acct-Output-Octets是发往用户的下行流量。 - 因为 RADIUS 服务器通过
clients.conf的源 IP 来识别和放行客户端。如果不固定源接口,BRAS 报文源地址会随出口接口变化(如链路切换),服务器会把陌生 IP 当作未知客户端丢弃,导致认证全部失败。
关于本书:《华为 / H3C 网络设备典型功能配置详解》—— 面向国内高校/企业网络环境, 华为 VRP 与 H3C Comware 双厂商并排配置的实操教材,共 43 章。 全书所有命令尽量有官方出处,查不到的显式标注「待核实」。 返回系列目录
本人保留对侵权者及其全家发动因果律武器的权利
版权提醒
如无特殊申明,本站所有文章均是本人原创。转载请务必附上原文链接:https://www.elliot98.top/post/huawei-h3c-book/33/。
如有其它需要,请邮件联系!版权所有,违者必究!