我们将以目前最流行、功能最强大的开源 RADIUS 服务器 FreeRADIUS 为例,结合 MariaDB/MySQL 作为后端数据库,为您提供一个完整、生产级的部署指南。

第一部分:核心概念
在开始之前,理解几个关键概念很重要:
-
RADIUS 组件:
- RADIUS Client (客户端): 请求认证的设备,如无线路由器、交换机、VPN 服务器、防火墙等,它负责向 RADIUS Server 发送 Access-Request 请求。
- RADIUS Server (服务器): 处理认证请求的中心服务器,它验证用户凭据,并返回 Access-Accept (接受) 或 Access-Reject (拒绝) 响应。
- RADIUS Proxy (代理): 可以转发 RADIUS 请求到其他 RADIUS 服务器,通常用于多租户或分布式环境。
-
RADIUS 认证流程 (简版):
- 用户在客户端设备(如 Wi-Fi)上输入用户名和密码。
- 客户端将用户名和密码打包成一个
Access-Request包,发送给 RADIUS Server。 - RADIUS Server 收到请求后,会使用 共享密钥 验证请求的合法性(防止伪造)。
- 服务器根据配置的认证方式(如检查本地文件、数据库、LDAP 等)验证用户名和密码。
- 验证通过,服务器返回
Access-Accept;失败则返回Access-Reject。 - 客户端根据收到的响应,允许或拒绝用户接入。
-
认证与授权:
(图片来源网络,侵删)- 认证: 回答“你是谁?”的问题,验证用户身份。
- 授权: 回答“你能做什么?”的问题,在认证通过后,为用户分配特定的权限(如 IP 地址、VLAN、带宽限制等),在 RADIUS 中,这通常通过返回的属性来实现。
第二部分:部署 FreeRADIUS 服务器 (以 Ubuntu/Debian 为例)
我们将安装 FreeRADIUS,并配置它使用 MariaDB 数据库来存储用户信息。
步骤 1: 安装 FreeRADIUS 和数据库
更新系统包列表并安装必要的软件。
sudo apt update sudo apt install freeradius freeradius-mysql freeradius-utils mariadb-server -y
freeradius: 核心 RADIUS 服务器包。freeradius-mysql: FreeRADIUS 的 MariaDB/MySQL 数据库支持模块。freeradius-utils: 包含radtest等有用的测试工具。mariadb-server: 作为用户信息存储的后端数据库。
步骤 2: 配置数据库
-
登录并创建数据库:
sudo mysql
在 MariaDB shell 中执行:
(图片来源网络,侵删)CREATE DATABASE radius; CREATE USER 'radius'@'localhost' IDENTIFIED BY 'your_strong_password'; GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost'; FLUSH PRIVILEGES; EXIT;
-
导入数据库结构: FreeRADIUS 提供了现成的 SQL 文件来创建用户表。
# 根据你的系统,文件路径可能略有不同 sudo mysql -u radius -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
系统会提示你输入之前为
radius用户设置的密码。 -
配置 FreeRADIUS 连接数据库: 编辑 FreeRADIUS 的 SQL 配置文件。
sudo nano /etc/freeradius/3.0/mods-available/sql
找到
driver = "rlm_sql_mysql"部分,并确保以下配置正确:# ... database = "radius" server = "localhost" login = "radius" password = your_strong_password # ... # 确保 dialect 设置为 mysql dialect = "mysql" # ...
取消注释(删除 )
read_groups和read_user这两行,因为我们使用数据库来读取用户和组信息。read_groups = yes read_users = yes
保存并退出。
-
启用 SQL 模块: FreeRADIUS 使用符号链接来启用或禁用模块。
sudo ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/
步骤 3: 添加测试用户
我们向数据库中添加一个用户,用于测试。
-
插入用户数据:
sudo mysql -u radius -p radius
在 MariaDB shell 中执行:
-- 插入一个用户,用户名 'testuser',密码 'testpass' -- 'Cleartext-Password' 是一个明文密码模块 -- 'Auth-Type := Local' 表示使用本地认证方式 INSERT INTO radcheck (username, attribute, op, value) VALUES ('testuser', 'Cleartext-Password', ':=', 'testpass'); -- 授权用户接入,设置 Framed-Protocol 为 PPP (适用于 PPPoE/PPTP/L2TP) -- Simultaneous-Use 限制同一用户只能同时在线一个设备 INSERT INTO radreply (username, attribute, op, value) VALUES ('testuser', 'Framed-Protocol', ':=', 'PPP'); INSERT INTO radreply (username, attribute, op, value) VALUES ('testuser', 'Simultaneous-Use', ':=', '1'); -- (可选) 添加用户组 INSERT INTO radusergroup (username, groupname) VALUES ('testuser', 'users'); EXIT;
步骤 4: 配置 FreeRADIUS 主配置
编辑主配置文件,让 FreeRADIUS 默认从 SQL 模块加载用户。
sudo nano /etc/freeradius/3.0/sites-available/default
-
取消注释
sql模块: 找到authorize和accounting段落,确保sql模块被取消注释并放在合适的位置(通常在files之后)。authorize { # ... sql # ... }同样,在
accounting段落中也取消注释sql。accounting { # ... sql # ... } -
(可选) 禁用
files模块: 如果你完全依赖数据库,可以注释掉files模块,避免它覆盖数据库的配置。# authorize { # files # ... # } -
配置客户端: 找到
client段落,这是配置哪些 RADIUS Client(如你的无线路由器)可以连接到服务器的部分。client localhost { ipaddr = 127.0.0.1 proto = * secret = testing123 require_message_authenticator = no limit { max_connections = 16 lifetime = 0 idle_timeout = 30 } }ipaddr: 客户端的 IP 地址。secret: 共享密钥,必须与客户端设备上的配置完全一致!testing123是默认的测试密钥,生产环境请务必修改。
步骤 5: 启动并测试服务
-
启动 FreeRADIUS 服务:
sudo systemctl start freeradius sudo systemctl enable freeradius # 开机自启
-
进行本地测试: 使用
radtest工具进行测试,它模拟一个 RADIUS Client 向本地服务器发送认证请求。# 格式: radtest <用户名> <密码> <服务器IP> <端口> <共享密钥> radtest testuser testpass localhost 0 testing123
如果一切正常,你会看到类似下面的输出:
Sending Access-Request of id 228 to 127.0.0.1 port 1812 User-Name = "testuser" User-Password = "testpass" NAS-IP-Address = 192.168.1.100 NAS-Port = 0 rad_recv: Access-A
