RADIUS(Remote Authentication Dial In User Service)是一种广泛应用于网络接入认证的协议,典型场景包括企业无线网络的802.1X认证、VPN拨号验证、交换机telnet登录管理等。FreeRADIUS是目前最流行的开源RADIUS实现,在Ubuntu系统上搭建一套FreeRADIUS服务,是网络工程师和运维人员经常需要面对的任务。本文将完整演示从安装、配置到测试验证的全过程,并补充数据库接入和常见问题排查方法。

一、RADIUS协议工作原理简介
在动手安装之前,有必要先理解RADIUS的工作模型。RADIUS采用客户端/服务器架构,但这里的客户端并不是最终用户,而是网络设备,比如无线控制器、交换机、VPN网关等,这些设备被称为NAS(Network Access Server)。当用户尝试接入网络时,NAS将用户输入的用户名密码打包成RADIUS报文发给RADIUS服务器,由服务器完成验证并返回结果。
RADIUS的三个核心环节分别是认证、授权和计费,也就是常说的AAA。认证负责确认用户身份,授权决定用户能访问哪些资源、分配什么VLAN或IP地址,计费则记录用户的上网时长和流量。FreeRADIUS对这三部分都有完整支持,默认监听1812端口处理认证授权,1813端口处理计费。
传输层上RADIUS使用UDP协议,报文简单轻量,这也意味着它自身不保证可靠性,需要依靠客户端的重传机制。了解这一点在后期排错时很重要,如果服务器没有响应,客户端会按配置的次数重发请求。
二、Ubuntu下安装FreeRADIUS
Ubuntu官方软件源中已经收录了FreeRADIUS,安装非常直接。执行以下命令即可完成主程序和实用工具的安装:
sudo apt update sudo apt install freeradius freeradius-utils -y
安装完成后服务会自动启动,可以用systemctl查看运行状态:
sudo systemctl status freeradius
如果需要修改配置后使其生效,可以重启服务:sudo systemctl restart freeradius。FreeRADIUS的默认配置目录在/etc/freeradius/3.0/,这个目录下有几十个配置文件,初学者容易眼花缭乱,但实际常用的只有少数几个:clients.conf负责定义RADIUS客户端,users文件用于本地用户验证,radiusd.conf是主配置文件。
一个非常重要的调试技巧是以前台调试模式运行FreeRADIUS,这种模式下服务器会把每个请求的处理过程详细打印到终端,包括读取了哪些模块、匹配了哪条用户记录,是排错的第一利器。先停止服务再进入调试模式:
sudo systemctl stop freeradius sudo freeradius -X
当终端最后出现Ready to process requests字样时,说明配置加载无误,服务器已经就绪,此时可以另开一个终端进行测试。
三、配置客户端和测试用户
首先配置RADIUS客户端,也就是允许哪些网络设备向本服务器发起认证请求。编辑/etc/freeradius/3.0/clients.conf,在文件末尾追加一段客户端定义:
client my-switch {
ipaddr = 192.168.1.10
secret = testing123
shortname = sw1
}其中ipaddr是NAS设备的IP地址,secret是双方共享的密钥,必须与网络设备上配置的完全一致,否则会出现握手失败的报错。shortname只是备注用途。如果NAS设备较多,也可以用subnet代替ipaddr来定义一个网段。
接着添加一个测试用户,编辑/etc/freeradius/3.0/mods-config/files/authorize文件(旧版本直接是users文件),在文件顶部加入:
testuser Cleartext-Password := "test123"
Reply-Message = "Hello, auth success"保存后在调试模式的终端中可以看到配置被重新提示的信息,调试模式会自动检测文件变更。然后使用radtest工具发起本地测试:
radtest testuser test123 127.0.0.1 0 testing123
命令中的参数依次是用户名、密码、服务器地址、端口、共享密钥。如果看到Access-Accept的返回,说明认证链路已经打通;如果返回Access-Reject则是用户名密码不匹配;返回超时则要检查防火墙是否放行了1812端口。注意本机测试默认使用clients.conf中定义的localhost客户端,其secret默认就是testing123。
四、接入MySQL实现集中账号管理
users文件适合少量测试账号,生产环境中通常需要把用户数据放到数据库里,方便与其他系统对接和批量管理。安装FreeRADIUS的MySQL模块:
sudo apt install freeradius-mysql -y
安装后需要创建数据库并导入表结构,FreeRADIUS自带了SQL脚本:
mysql -u root -p -e "CREATE DATABASE radius;" mysql -u root -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql mysql -u root -p -e "GRANT ALL ON radius.* TO 'radius'@'localhost' IDENTIFIED BY 'radiuspass';"
然后修改/etc/freeradius/3.0/mods-available/sql文件中的数据库连接参数,将dialect设为mysql,填写数据库地址、账号密码等信息。再启用该模块并重启服务:
sudo ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/sql sudo systemctl restart freeradius
用户账号存放在radius库的radcheck表中,插入一条记录后即可用radtest验证:
mysql -u root -p radius -e "INSERT INTO radcheck (username, attribute, op, value) VALUES ('dbuser', 'Cleartext-Password', ':=', 'dbpass');"导入后再次执行radtest测试dbuser账号,能返回Access-Accept就代表数据库认证配置成功。这种架构下,后续还可以扩展radreply表下发属性、结合radusergroup做分组授权,实现更精细的控制。
五、常见问题排查思路
实际部署中遇到问题时,优先使用freeradius -X调试模式观察请求的完整处理链路,绝大多数问题都能从中直接找到答案。常见的几类错误包括:一是secret不匹配,调试日志中会出现Shared secret is incorrect提示,需要核对客户端和服务端配置;二是认证返回Reject,检查用户属性书写格式是否正确,注意密码属性使用的是:=操作符。
三是端口冲突,如果系统上有其他程序占用了1812端口,FreeRADIUS会启动失败,可以用ss -ulnp | grep 1812确认。四是防火墙阻断,云服务器上需要放行UDP 1812和1813端口。五是SELinux或AppArmor的限制,Ubuntu上AppArmor一般不会拦截标准路径,但如果自定义了日志路径就可能遇到权限问题。
建议在调试通过后再把服务切回后台守护模式运行,并配置开机自启:sudo systemctl enable freeradius。对于企业级802.1X场景,还需要额外配置EAP认证相关的eap模块和证书,这部分可以在基础环境验证可用后再逐步深入。
FreeRADIUSUbuntu搭建RADIUSRADIUS认证服务器修改时间:2026-09-09 06:00:37