FreeRADIUS 3.2.10 常用 CLI 命令与工具详解
FreeRADIUS 3.2.10 工具链实测详解:freeradius -v/-C/-X 服务端三式与调试轨迹逐行解读、radtest 四要素 PAP 成功/失败/EAP-MD5 实测、radclient 计费闭环、radwho/radlast/radzap 会话管理与 deb 路径坑、radsecret/radcrypt/radmin/radsniff 辅助工具与排障链路。
FreeRADIUS 3.2.10 常用 CLI 命令与工具详解
目标:掌握 FreeRADIUS 3.2.10 的全套命令行工具——服务端本体的运行与调试(
freeradius -v/-C/-X)、认证测试四件套radtest(PAP 成功/失败/EAP-MD5 实测)、通用测试器radclient(计费闭环实测)、会话查询与清理(radwho/radlast/radzap)、辅助工具(radsecret/radcrypt/radmin/radsniff)。全部命令与回显均在 Ubuntu 22.04 + FreeRADIUS 3.2.10 实机逐条跑出。
一、环境信息
- 操作系统:Ubuntu 22.04 LTS(jammy),x86_64,systemd 托管
- FreeRADIUS 版本:3.2.10-1(官方 InkBridge deb 仓库,包
freeradius+freeradius-utils) - 服务端:
freeradius.service(监听 UDP 1812 认证 / 1813 计费 / 18120 内层),配置根/etc/freeradius/ - 实测账号:
admin/q1w2e3r4(users 文件平面账号,配置见 《FreeRADIUS 3.2.10 配置参数详解》5.3 节) - 实测客户端:
localhost(127.0.0.1,共享密钥testing123)与office-nas(10.89.56.0/24,密钥nasSecret2026) - 工具包清单来源:
dpkg -L freeradius-utils
二、工具概览
3.2.10 的 CLI 分两族:服务端本体(/usr/sbin/freeradius,另有管理工具 radmin、raddebug)与 客户端工具族(freeradius-utils 包,装在 /usr/bin/)。实测清点:
| 工具 | 路径 | 用途 |
|---|---|---|
freeradius | /usr/sbin | 服务端本体(调试/校验/前台运行) |
radmin | /usr/sbin | 运行中服务的管理控制台(经控制 socket) |
raddebug | /usr/sbin | 按条件给在线请求动态开调试 |
radtest | /usr/bin | 最常用认证测试器(PAP/CHAP/MSCHAP/EAP-MD5) |
radclient | /usr/bin | 通用 RADIUS 报文测试器(认证/计费/CoA/断线) |
radeapclient | /usr/bin | 专用 EAP 报文测试器 |
radwho | /usr/bin | 查看当前在线会话(读 radutmp) |
radlast | /usr/bin | 查看历史会话(读 radwtmp) |
radzap | /usr/bin | 清理 NAS 上的残留会话记录 |
radsecret | /usr/bin | 生成强共享密钥 |
radcrypt | /usr/bin | 口令 crypt 哈希(users 文件 Crypt-Password 用) |
radsniff | /usr/bin | 网线侧 RADIUS 流量抓取与统计 |
raduat | /usr/bin | User-Authenticator 测试辅助 |
radsqlrelay | /usr/bin | sql 日志缓冲回放(数据库故障缓冲) |
smbencrypt | /usr/bin | 生成 NT/LM 密码哈希(MSCHAP 对接 Samba 用) |
rlm_ippool_tool | /usr/bin | IP 池模块的地址查看与操作 |
各发行版命名提醒:Ubuntu/Debian deb 包的服务端可执行名是 freeradius;源码编译版与 RHEL 系叫 radiusd,两者命令行参数完全一致(freeradius -v 与 radiusd -v 等价)。
三、前置条件
- FreeRADIUS 3.2.10 服务端已安装并在运行(
systemctl is-active freeradius→active);安装过程见 《Ubuntu 22.04 安装 FreeRADIUS 3.2.10 指南》。 - 至少有一个可用测试账号与客户端定义。本文沿用实机配置:users 文件中的
admin(Cleartext-Password q1w2e3r4)与 clients.conf 默认的localhost(secret testing123)。 - 验证环境就绪:
freeradius -v | head -1
systemctl is-active freeradius
实测回显:
radiusd: FreeRADIUS Version 3.2.10 (git #9071ea041), for host x86_64-pc-linux-gnu
active
四、服务端本体:freeradius
4.1 版本与编译信息:freeradius -v
freeradius -v
实测回显(完整):
radiusd: FreeRADIUS Version 3.2.10 (git #9071ea041), for host x86_64-pc-linux-gnu
FreeRADIUS Version 3.2.10
Copyright (C) 1999-2026 The FreeRADIUS server project and contributors
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE
You may redistribute copies of FreeRADIUS under the terms of the
GNU General Public License
For more information about these matters, see the file named COPYRIGHT
FreeRADIUS is developed, maintained, and supported by InkBridge Networks.
For commercial support, please email sales@inkbridgenetworks.com
https://inkbridgenetworks.com/
版本行自带 git 提交号(#9071ea041),对账官方 Release 时以此为准确口径。
4.2 配置校验:freeradius -C
改完配置先校验再重启,是 FreeRADIUS 运维的标准动作:
freeradius -C
echo "exit=$?"
实测回显(配置合法):
exit=0
合法时零输出、退出码 0;语法错误时退出码 1,但 deb 默认日志配置下控制台不打印错误细节。要看清错误文件与位置,用调试模式:
# 实测:配置文件含未配对 '}' 时
freeradius -X 2>&1 | tail -1
实测回显:
Errors reading or parsing /etc/freeradius/radiusd.conf
4.3 调试模式:freeradius -X
-X 是 FreeRADIUS 排障的终极手段:前台运行、日志直落控制台、每个请求的流水线轨迹逐行打印。生产服务器上的标准姿势是「停服务 → 前台调试 → 复现问题 → Ctrl-C → 起回服务」:
systemctl stop freeradius
freeradius -X
# ...另开终端跑 radtest 复现问题,看完 Ctrl-C
systemctl start freeradius
实测启动输出(头部节选,配置加载清单):
Starting - reading configuration files ...
including dictionary file /usr/share/freeradius/dictionary
including dictionary file /usr/share/freeradius/dictionary.dhcp
including dictionary file /usr/share/freeradius/dictionary.vqp
including dictionary file /etc/freeradius/dictionary
including configuration file /etc/freeradius/radiusd.conf
including configuration file /etc/freeradius/proxy.conf
including configuration file /etc/freeradius/clients.conf
including files in directory /etc/freeradius/mods-enabled/
加载完模块后以 Ready to process requests 收尾。此时从另一终端发一次认证,-X 终端即打出完整处理轨迹(实测一次成功的 PAP 认证,节选关键段):
(0) Received Access-Request Id 54 from 127.0.0.1:51998 to 127.0.0.1:1812 length 75
(0) User-Name = "admin"
(0) User-Password = <<< secret >>>
(0) # Executing section authorize from file /etc/freeradius/sites-enabled/default
(0) authorize {
(0) policy filter_username { ... }
(0) [preprocess] = ok
(0) eap: No EAP-Message, not doing EAP
(0) [eap] = noop
(0) files: users: Matched entry admin at line 209
(0) [files] = ok
(0) [pap] = updated
(0) } # authorize = updated
(0) Found Auth-Type = PAP
(0) Auth-Type PAP {
(0) pap: Comparing with "known good" Cleartext-Password
(0) pap: User authenticated successfully
(0) [pap] = ok
(0) } # Auth-Type PAP = ok
(0) Sent Access-Accept Id 54 from 127.0.0.1:1812 to 127.0.0.1:51998 length 54
(0) Reply-Message = "Welcome, admin"
(0) Finished request
读轨迹的口诀:(0) 是请求序号;authorize 段看模块返回值(ok/noop/notfound 继续走,reject 中断);Found Auth-Type = X 决定 authenticate 段走哪个分支;最后一行 Access-Accept/Reject 即结果。
五、认证测试:radtest(四要素实测)
5.1 用法与参数
radtest -h
实测回显:
Usage: radtest [OPTIONS] user passwd radius-server[:port] nas-port-number secret [ppphint] [nasname]
-d RADIUS_DIR Set radius directory
-t <type> Set authentication method
type can be pap, chap, mschap, or eap-md5
-P protocol Select udp (default) or tcp
-x Enable debug output
-4 Use IPv4 for the NAS address (default)
-6 Use IPv6 for the NAS address
-b Mandate checks for Blast RADIUS (this is not set by default).
五个位置参数就是「认证四要素 + 服务器」:用户名、密码、服务器地址[:端口]、NAS 端口号、共享密钥。
💡 技术拓展:
-t可选的认证方法不止一种,主流 RADIUS 认证协议对比——
方法 原理 特点 PAP 明文密码随报文(RADIUS 加密层保护) 最简单,服务端可比对任意哈希 CHAP 挑战-应答,不传明文 服务端必须存明文或 MD5 可逆形式 MSCHAPv2 微软变体挑战-应答 对接 AD/Samba 场景 EAP-MD5 EAP 框架内 MD5 挑战 802.1X 最小实现,实验常用 EAP-TLS/PEAP TLS 隧道系 生产 Wi-Fi 主流(radtest 不支持,需 eapol_test) 本文实测 pap(默认)与 eap-md5 两种;radtest 定位是快速验证,完整 802.1X 模拟用 eapol_test(wpa_supplicant 套件)。
5.2 PAP 认证成功用例
radtest admin q1w2e3r4 127.0.0.1 0 testing123
实测回显:
Sent Access-Request Id 122 from 0.0.0.0:55558 to 127.0.0.1:1812 length 75
User-Name = "admin"
User-Password = "q1w2e3r4"
NAS-IP-Address = 10.89.56.2
NAS-Port = 0
Message-Authenticator = 0x00
Cleartext-Password = "q1w2e3r4"
Received Access-Accept Id 122 from 127.0.0.1:1812 to 127.0.0.1:55558 length 54
Message-Authenticator = 0x19fab81f61b1897f77d4c8320b6f50d6
Reply-Message = "Welcome, admin"
要点:请求行 Sent Access-Request → 响应行 Received Access-Accept 即成功;users 文件里的 Reply-Message 原样返回。注意 3.2.10 的 Access-Request 自动携带 Message-Authenticator 属性(Blast-RADIUS 防护的一部分)。
5.3 PAP 认证失败用例(密码错误)
radtest admin wrongpass 127.0.0.1 0 testing123; echo "exit=$?"
实测回显:
Sent Access-Request Id 157 from 0.0.0.0:38615 to 127.0.0.1:1812 length 75
User-Name = "admin"
User-Password = "wrongpass"
NAS-IP-Address = 10.89.56.2
NAS-Port = 0
Message-Authenticator = 0x00
Cleartext-Password = "wrongpass"
Received Access-Reject Id 157 from 127.0.0.1:1812 to 127.0.0.1:38615 length 54
Message-Authenticator = 0x87504d65316915b39181c4558fdac0b5
Reply-Message = "Welcome, admin"
exit=1
失败判定有三个信号:Access-Reject、退出码 1、首行 Expected Access-Accept got Access-Reject(radtest 期望成功但被拒)。另注意:users 文件命中的 Reply-Message 在 Reject 分支同样下发——回复属性不带业务敏感信息是配置纪律。
5.4 用非默认 client 定义测试(跨网段 NAS)
服务端把 clients.conf 里的 office-nas 定义为 10.89.56.0/24 网段。用本机地址落在该网段的接口测试(密钥换 nasSecret2026):
radtest admin q1w2e3r4 10.89.56.2 0 nasSecret2026
实测回显:
Sent Access-Request Id 53 from 0.0.0.0:53033 to 10.89.56.2:1812 length 75
User-Name = "admin"
User-Password = "q1w2e3r4"
NAS-IP-Address = 10.89.56.2
NAS-Port = 0
Message-Authenticator = 0x00
Cleartext-Password = "q1w2e3r4"
Received Access-Accept Id 53 from 10.89.56.2:1812 to 10.89.56.2:53033 length 54
Message-Authenticator = 0xc3ae96b0b3e6066ce684488642c1146a
Reply-Message = "Welcome, admin"
这验证了「客户端按来源 IP/网段匹配 client 定义」的机制:同一台服务器、同一账号,换密钥即切换 client 身份。
5.5 共享密钥错误:静默丢弃排障实录
对同一 client 用错误密钥:
radtest admin q1w2e3r4 10.89.56.2 0 wrongsecret; echo "exit=$?"
实测回显:
Sent Access-Request Id 52 from 0.0.0.0:33076 to 10.89.56.2:1812 length 75
User-Name = "admin"
User-Password = "q1w2e3r4"
NAS-IP-Address = 10.89.56.2
NAS-Port = 0
Message-Authenticator = 0x00
Cleartext-Password = "q1w2e3r4"
Sent Access-Request Id 52 from 0.0.0.0:33076 to 10.89.56.2:1812 length 75
...(同一报文重发 3 次)
(0) No reply from server for ID 52 socket 3
exit=1
客户端表现是「No reply」+ 3 次重传,极易误判为防火墙问题。定位靠服务端日志——radius.log 实测记录了丢弃原因:
Dropping packet without response because of error: Received packet from 10.89.56.2
with invalid Message-Authenticator! (Shared secret is incorrect.) (from client office-switch)
排障链路:客户端 No reply → 看服务端 tail /var/log/freeradius/radius.log → 出现 Shared secret is incorrect. 即密钥不一致 → 核对 clients.conf 与测试命令的 secret。
5.6 EAP-MD5 认证实测
radtest -t eap-md5 admin q1w2e3r4 127.0.0.1 0 testing123
实测回显(完整交互过程):
Loading input data...
Read 1 element(s) from input: stdin
Loaded: 1 input element(s).
Adding new socket: src: 0.0.0.0:0, dst: 127.0.0.1:1812
Added new socket: 5 (num sockets: 1)
Sent Access-Request Id 165 from 0.0.0.0:39843 to 127.0.0.1:1812 length 69
User-Name = "admin"
Cleartext-Password = "q1w2e3r4"
NAS-IP-Address = 10.89.56.2
NAS-Port = 0
Message-Authenticator = 0x00
EAP-Code = Response
EAP-Type-Identity = 0x61646d696e
EAP-Message = 0x02b0000a0161646d696e
Received Access-Challenge Id 165 from 127.0.0.1:1812 to 0.0.0.0:39843 length 80
Message-Authenticator = 0x3020ca7b82b3352d27dedc560677d114
EAP-Message = 0x01b10016041085406db89d5b4ba42f8337ac15f138e1
State = 0x5260194352d11dad09c31b0f1a961a37
EAP-Id = 177
EAP-Code = Request
EAP-Type-MD5-Challenge = 0x1085406db89d5b4ba42f8337ac15f138e1
Sent Access-Request Id 227 from 0.0.0.0:39843 to 127.0.0.1:1812 length 99
User-Name = "admin"
Cleartext-Password = "q1w2e3r4"
NAS-IP-Address = 10.89.56.2
NAS-Port = 0
Message-Authenticator = 0x00
EAP-Code = Response
EAP-Type-MD5-Challenge = 0x105c1b1358085a4df88e91bc88072a2d79
EAP-Id = 177
State = 0x5260194352d11dad09c31b0f1a961a37
EAP-Message = 0x02b1001604105c1b1358085a4df88e91bc88072a2d79
failed decoding EAP: EAP packet is too short
Received Access-Accept Id 227 from 127.0.0.1:1812 to 0.0.0.0:39843 length 51
Message-Authenticator = 0xe547936cffc15af3649e7091b20bd736
EAP-Message = 0x03b10004
User-Name = "admin"
Main loop: done.
EAP transaction finished, but reply does not contain EAP-Code = Success
实测结论:EAP-MD5 三步交互完整走通(Identity → MD5-Challenge → MD5-Response),服务端最终返回 Access-Accept(报文中 EAP-Message = 0x03b10004 即 EAP-Code=Success 封装)。radtest 最后一跳解码报 EAP packet is too short 并输出 EAP transaction finished, but reply does not contain EAP-Code = Success、退出非零——这是 3.2.10 radtest 客户端侧对短 Success 包的解码表现问题,认证本身是成功的(服务端 -X 可见完整 Accept 链路)。判定 EAP-MD5 结果时以服务端日志/调试输出为准,不要被 radtest 的结尾报错误导。
六、通用测试器:radclient
radclient 是全能报文工具:认证(auth)、计费(acct)、状态探测(status)、CoA、断线(disconnect)都靠它。比 radtest 灵活,可从文件批量读包。
6.1 用法与参数
radclient -h
实测回显(节选):
Usage: radclient [options] server[:port] <command> [<secret>]
<command> One of auth, acct, status, coa, disconnect or auto.
-4 Use IPv4 address of server
-6 Use IPv6 address of server.
-b Mandate checks for Blast RADIUS issue (this is not set by default).
-c <count> Send each packet 'count' times.
-d <raddb> Set user dictionary directory (defaults to /usr/local/etc/raddb).
-D <dictdir> Set main dictionary directory (defaults to /usr/local/share/freeradius).
-f <file>[:<file>] Read packets from file, not stdin.
If a second file is provided, it will be used to verify responses
-F Print the file name, packet number and reply code.
-n <num> Send N requests/s
-p <num> Send 'num' packets from a file in parallel.
-q Do not print anything out.
-r <retries> If timeout, retry sending the packet 'retries' times.
-s Print out summary information of auth results.
-S <file> read secret from file, not command line.
-t <timeout> Wait 'timeout' seconds before retrying (may be a floating point number).
-v Show program version information.
-x Debugging mode.
-P <proto> Use proto (tcp or udp) for transport.
注意 -d/-D 的默认路径是 /usr/local/...(编译前缀口径),deb 机器上读自定义字典时要显式传 -d /etc/freeradius -D /usr/share/freeradius。
6.2 计费报文实测(Acct-Status-Type = Start)
先写报文文件(每行一个 属性 = 值,报文间空行分隔):
printf "User-Name = admin\nAcct-Status-Type = Start\nNAS-IP-Address = 10.89.56.2\nAcct-Session-Id = 43219380\n" > /tmp/acct.packet
cat /tmp/acct.packet
实测回显:
User-Name = admin
Acct-Status-Type = Start
NAS-IP-Address = 10.89.56.2
Acct-Session-Id = 43219380
发送到计费端口 1813(acct 命令自动用 Accounting-Request):
cat /tmp/acct.packet | radclient -x 127.0.0.1:1813 acct testing123
实测回显:
Sent Accounting-Request Id 15 from 0.0.0.0:54667 to 127.0.0.1:1813 length 49
User-Name = "admin"
Acct-Status-Type = Start
NAS-IP-Address = 10.89.56.2
Acct-Session-Id = "43219380"
Received Accounting-Response Id 15 from 127.0.0.1:1813 to 127.0.0.1:54667 length 20
Received Accounting-Response 即计费入账成功(服务端 detail 文件与 sql 的 radacct 表落账)。
带会话属性的 Start 包(让 radwho 能列出会话):
printf "User-Name = admin\nAcct-Status-Type = Start\nService-Type = Framed-User\nNAS-IP-Address = 10.89.56.2\nNAS-Port = 1\nAcct-Session-Id = 43219381\nCalling-Station-Id = aa-bb-cc-dd-ee-ff\nFramed-IP-Address = 10.89.56.100\n" | radclient 127.0.0.1:1813 acct testing123
实测回显:
Sent Accounting-Request Id 225 from 0.0.0.0:45408 to 127.0.0.1:1813 length 86
Received Accounting-Response Id 225 from 127.0.0.1:1813 to 127.0.0.1:45408 length 20
6.3 计费结束与状态探测
会话结束发 Stop 包(含时长与下线原因):
printf "User-Name = admin\nAcct-Status-Type = Stop\nService-Type = Framed-User\nNAS-IP-Address = 10.89.56.2\nNAS-Port = 1\nAcct-Session-Id = 43219381\nAcct-Session-Time = 120\nAcct-Terminate-Cause = User-Request\n" | radclient 127.0.0.1:1813 acct testing123
实测回显(末行):
Received Accounting-Response Id 67 from 127.0.0.1:1813 to 127.0.0.1:59370 length 20
服务存活探测(Status-Server,security { status_server = yes } 时启用):
echo "Message-Authenticator = 0x00" | radclient 127.0.0.1:1812 status testing123
服务正常时收到 Access-Accept(Status-Server 探测的响应语义);无响应则服务或密钥异常。
七、会话工具:radwho / radlast / radzap
7.1 radwho:当前在线会话
radwho 读服务端的 radutmp 文件。实测发现的路径坑:deb 包的 radwho 编译默认找 /usr/local/var/log/radius/radutmp,直接跑会报:
Tue Oct 27 06:28:41 2026 : Error: Unable to check file "/usr/local/var/log/radius/radutmp": No such file or directory
radwho: Error reading /usr/local/var/log/radius/radutmp: No such file or directory
用 -F 显式指定 deb 实际的 radutmp 路径(/var/log/freeradius/radutmp)。先看帮助:
radwho -h 2>&1
实测回显:
Usage: radwho [-d raddb] [-cfihnprRsSZ] [-N nas] [-P nas_port] [-u user] [-U user]
-c Show caller ID, if available.
-d Set the raddb directory (default is /usr/local/etc/raddb).
-F <file> Use radutmp <file>.
-i Show session ID.
-n No full name.
-N <nas-ip-address> Show entries matching the given NAS IP address.
-p Show port type.
-P <port> Show entries matching the given nas port.
-r Print output as raw comma-delimited data.
-R Print output as RADIUS attributes and values.
includes ALL information from the radutmp record.
-s Show full name.
-S Hide shell users from radius.
-u <user> Show entries matching the given user.
-U <user> Like -u, but case-sensitive.
-v Show program version information.
-Z Include accounting stop information in radius output. Requires -R.
发送过带 Service-Type = Framed-User 的 Start 计费包后(见 6.2),查询在线会话:
radwho -F /var/log/freeradius/radutmp
实测回显:
Login Name What TTY When From Location
admin admin shell S1 Tue 06:29 10.89.56.2 10.89.56.100
原始格式(便于脚本处理):
radwho -F /var/log/freeradius/radutmp -r
实测回显:
admin,admin,shell,S1,Tue 06:29,10.89.56.2,10.89.56.100
⚠️ 实测细节:不带
Service-Type的裸 Start 包不会出现在 radwho 列表里(6.2 第一个包即如此,列表只有表头);补Service-Type = Framed-User后会话可见。Stop 包发出后该会话从列表消失。
7.2 radlast:历史会话
radlast 底层调用 last 读 radwtmp。deb 机上同样有编译路径坑(默认找 /usr/local/var/log/radius/radwtmp,报 cannot open ... No such file or directory),radlast -f 不透传参数,实测直接用 last 指定文件:
last -f /var/log/freeradius/radwtmp
实测回显:
radwtmp begins Tue Oct 27 02:50:41 2026
radwtmp 只在服务端收到 Start/Stop 计费对时追加历史行;本文实验的会话由 radzap 清理场景覆盖,历史行为空是正常现象(文件从 02:50 服务首启开始记账)。
7.3 radzap:清理残留会话
NAS 掉线没发 Stop 时,radutmp 会残留「僵尸会话」,占用 Simultaneous-Use 名额。radzap 的机制是向服务器补发 Stop 计费报文:
radzap -h
实测回显:
Usage: radzap [options] server[:port] secret
-h Print usage help information.
-d raddb_directory: directory where radiusd.conf is located.
-D dict_directory: directory where the dictionaries are located.
-N nas_ip_address: IP address of the NAS to zap.
-P nas_port: NAS port that the user is logged into.
实测行为(诚实记录):在 deb 包 3.2.10 上执行 radzap 127.0.0.1 testing123 与 radzap -d /etc/freeradius 127.0.0.1 testing123,均打印 radwho 的用法帮助并报 radclient: Nothing to send,radutmp 中的会话未被清除——其内部会话枚举依赖编译前缀路径,与 deb 布局不匹配。可靠的清理方式是 radclient 直发 Stop 包(同 6.3,实测 Stop 后 radwho 列表即清空)。radzap 在源码编译布局(/usr/local 前缀一致)的机器上可用。
八、辅助工具:radsecret / radcrypt / radmin / radsniff
8.1 radsecret:生成强共享密钥
radsecret
实测回显:
qh/HOmmIpvcsGPay
每次运行输出一个随机强密钥,可直接填进 clients.conf 的 secret。生产密钥要求 22 字符以上——默认 testing123 在服务端启动日志里会被警告 Shared secret for client localhost is short, and likely can be broken by an attacker.。
8.2 radcrypt:口令哈希
users 文件用 Crypt-Password 属性时需要 crypt 哈希值,radcrypt 就是生成/校验工具:
radcrypt q1w2e3r4
实测回显(MD5 crypt,盐随机每次不同):
ONpWh2wtrvQG.
radcrypt --des q1w2e3r4
实测回显(DES crypt):
R3T9WXLfJUCs2
校验模式把明文与哈希一起传入:radcrypt --check q1w2e3r4 'ONpWh2wtrvQG.',匹配输出 match。用法总览(实测 radcrypt 无参输出):
Usage: radcrypt [--des|--md5|--check] plaintext_password [crypted_password]
8.3 radmin:运行中服务的管理控制台
radmin 通过 Unix 控制socket 与运行中的服务端交互(查状态、动态调试、重载调试级别)。实测路径坑:直接跑报 Could not find control socket in /usr/local/etc/raddb/radiusd.conf——deb 机器要 -d /etc/freeradius 指向真实配置目录:
echo "show version" | radmin -d /etc/freeradius
实测回显:
radmin version 3.2.10, built on Oct 27 2026 at 03:21:49 - FreeRADIUS Server administration tool.
Copyright (C) 2008-2019 The FreeRADIUS server project and contributors.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
控制socket 默认位于 /var/run/freeradius/,仅当服务以对应配置运行时可连。
8.4 radsniff:线路侧抓包统计
radsniff 直接抓网卡上的 RADIUS 流量(默认 udp port 1812/1813/3799 过滤),可统计时延与丢包:
radsniff -h
实测回显(节选):
Usage: radsniff [options][stats options] -- [pcap files]
options:
-a List all interfaces available for capture.
-c <count> Number of packets to capture.
-C Enable UDP checksum validation.
-d <directory> Set dictionary directory.
-d <raddb> Set configuration directory (defaults to /etc/freeradius).
-D <dictdir> Set main dictionary directory (defaults to /usr/share/freeradius).
-e <event>[,<event>] Only log requests with these event flags.
-f <filter> PCAP filter (default is 'udp port <port> or <port + 1> or 3799')
-h This help message.
注意 radsniff 的 deb 默认路径是正确的(/etc/freeradius、/usr/share/freeradius),无需像 radwho/radmin 那样显式传参。抓包定位 NAS 与服务器之间的重传/无响应问题特别有效:radsniff -e norsp(输出节选自帮助)专看「发了没回」的报文。
九、注意事项
- 密钥排障链路优先:认证失败先分两类——有
Access-Reject是「认证逻辑」问题(看-X轨迹);无任何响应是「传输/准入」问题(密钥不一致、IP 不在 client 定义、服务未监听),服务端 radius.log 的Dropping packet ... Shared secret is incorrect.是最快定位点。 - deb 工具的 /usr/local 路径坑:radwho/radlast/radzap/radmin/radclient 的编译默认 raddb 与日志路径带
/usr/local前缀,与 deb 布局(/etc/freeradius、/var/log/freeradius)不一致。radclient 有-d/-D可显式传参;radwho 用-F;radlast 用last -f替代;radmin 用-d /etc/freeradius。 - radtest 的 eap-md5 尾包误报:见 5.6 实测结论,认证成功与否以服务端记录为准。
- 生产慎用
auth_goodpass:-X与日志开关都可能落盘密码(radpostauth 默认模板就含明文密码),生产开启前先审配置篇 5.4 节的警告。
十、常见问题
Q1:radtest 提示 radtest: command not found?
工具在 freeradius-utils 包里,apt-get install freeradius-utils 后即有;只装了服务端包 freeradius 是不含 radtest 的(deb 包依赖通常会带上,显式安装最稳妥)。
Q2:radiusd 命令不存在?
Ubuntu/Debian 用 freeradius 命令;radiusd 是源码编译版/RHEL 系命名,参数一致。
Q3:radclient 发自定义属性报 Unknown attribute "..."?
字典没加载对。用 -D /usr/share/freeradius 指定主字典目录、-d /etc/freeradius 指定站点字典;厂商私有属性还要在 dictionary 里 $INCLUDE 对应厂商字典文件。
Q4:radwho 一片空白但用户确实在线?
三步核查:① radutmp 路径(用 -F /var/log/freeradius/radutmp);② NAS 的计费包是否真的到了服务端(看 /var/log/freeradius/radacct/<NAS-IP>/detail-*);③ 计费包里有没有 Service-Type = Framed-User(实测缺它会话不显示)。
Q5:freeradius -X 起不来报端口占用?
systemd 服务还在跑。-X 与 freeradius.service 不能并存(同抢 1812/1813),先 systemctl stop freeradius 再调试,完毕 systemctl start freeradius 收回。
十一、参考链接
- FreeRADIUS 官方文档站(工具 man 页索引):https://freeradius.org/documentation/
- radtest/radclient 等 man 手册(服务器本机):
man radtest、man radclient - Blast-RADIUS 背景(-b 选项语义):https://freeradius.org/security/blastradius/
- 本平台配套篇目:《FreeRADIUS 3.2.10 介绍与选型指南》、《Ubuntu 22.04 安装 FreeRADIUS 3.2.10 指南》、《FreeRADIUS 3.2.10 配置参数详解》