我们将使用 FreeRADIUS 这款业界最流行、功能最强大的开源 RADIUS 服务器来搭建,本教程将以 Ubuntu 22.04 为例,但步骤同样适用于其他 Debian/Ubuntu 系列发行版,以及稍作修改后的 CentOS/RHEL 系列。

第一步:规划与准备
在开始之前,先明确我们的目标:
- 服务器: Ubuntu 22.04
- 软件: FreeRADIUS, MariaDB/MySQL (用于存储用户和密码)
- 客户端: 另一台 Linux 机器或一台支持 802.1X 的设备,我们将使用
radtest命令进行测试。 - 认证方式: 我们将配置最常用的 PAP (Password Authentication Protocol),并使用数据库来存储用户凭据。
第二步:安装 FreeRADIUS 和数据库
-
更新系统并安装 FreeRADIUS
sudo apt update sudo apt install freeradius freeradius-mysql -y
安装过程会提示是否启动 FreeRADIUS 服务,选择
Yes或直接回车确认。 -
安装数据库服务器 为了让用户信息持久化且易于管理,我们使用数据库,这里安装 MariaDB(MySQL 的一个分支)。
(图片来源网络,侵删)sudo apt install mariadb-server mariadb-client -y
安装完成后,安全地配置数据库:
sudo mysql_secure_installation
根据提示进行操作:
- 输入 root 密码(刚安装时通常为空,直接回车)
- 设置 root 密码 (Y)
- 移除匿名用户 (Y)
- 禁止 root 远程登录 (Y)
- 移除测试数据库 (Y)
- 重新加载权限表 (Y)
-
创建 RADIUS 数据库和用户 登录到 MariaDB 控制台:
sudo mysql -u root -p
然后执行以下 SQL 语句,创建一个名为
radius的数据库,一个名为radius的用户,并授予相应权限。请务必替换your_strong_password为一个安全的密码。
(图片来源网络,侵删)-- 创建数据库 CREATE DATABASE radius; -- 创建用户并授权 GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost' IDENTIFIED BY 'your_strong_password'; -- 刷新权限使设置生效 FLUSH PRIVILEGES; -- 退出 EXIT;
第三步:导入数据库结构
FreeRADIUS 提供了现成的 SQL 脚本来创建用户表、组表等结构。
-
找到 SQL 脚本文件的位置,通常在
/etc/freeradius/3.0/mods-config/sql/main/mysql/目录下。ls /etc/freeradius/3.0/mods-config/sql/main/mysql/
你会看到一个名为
schema.sql的文件。 -
导入该脚本到我们刚刚创建的
radius数据库中。mysql -u radius -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
系统会提示你输入为
radius用户设置的密码your_strong_password。
第四步:配置 FreeRADIUS 连接数据库
我们需要告诉 FreeRADIUS 如何连接到我们刚刚创建的数据库。
-
编辑
sql.conf文件sudo nano /etc/freeradius/3.0/mods-available/sql
找到并修改以下几行,确保它们与你的数据库设置匹配:
driver = "rlm_sql_mysql" # ... server = "localhost" port = 3306 login = "radius" password = your_strong_password # ... radius_db = "radius"
保存并退出 (
Ctrl+X,Y,Enter)。 -
启用 SQL 模块 FreeRADIUS 使用模块化的设计,需要手动启用
sql模块。# 创建一个指向 mods-available/sql的软链接到 mods-enabled/ sudo ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/
第五步:配置用户认证方式
我们配置使用数据库进行认证,并启用 PAP 协议。
-
编辑
clients.conf文件 这个文件定义了哪些 RADIUS 客户端(如交换机、AP、VPN 服务器)可以连接到你的 RADIUS 服务器,为了测试,我们先允许来自本机的连接。sudo nano /etc/freeradius/3.0/clients.conf
找到或添加一个客户端定义,使用
localhost作为 IP 地址,并设置一个共享密钥。client localhost { ipaddr = 127.0.0.1 secret = testing123 require_message_authenticator = no limit { max_connections = 50 lifetime = 0 idle_timeout = 30 } }secret(共享密钥) 是 RADIUS 客户端和服务器之间通信的密码,必须保持一致。 -
编辑
default策略文件 这个文件定义了认证的逻辑。sudo nano /etc/freeradius/3.0/sites-available/default
我们需要做两处关键修改:
-
启用
sql模块: 找到authorize和accounting段,取消注释(删除 )sql。authorize { # ... sql # ... } accounting { # ... sql # ... } -
设置
pap认证: 找到authenticate段,确保pap被启用。authenticate { # ... Auth-Type PAP { pap } # ... }保存并退出。
-
第六步:添加测试用户
我们需要在数据库中添加一个可以用来测试的用户。
-
登录到 MariaDB:
mysql -u radius -p radius
-
使用 SQL 语句插入用户,用户名是
testuser,密码是testpass。INSERT INTO radcheck (Username, Attribute, op, Value) VALUES ('testuser', 'User-Password', ':=', 'testpass');radcheck表用于存储用户的检查属性。User-Password是 RADIUS 属性,表示用户的密码。- 是赋值操作符。
testpass是明文密码(FreeRADIUS 会在认证时自动进行加密处理)。
-
退出数据库:
EXIT;
第七步:测试 RADIUS 服务器
-
启动并检查 FreeRADIUS 服务
# 启动服务 sudo systemctl start freeradius # 检查服务状态 sudo systemctl status freeradius
确保状态是
active (running)。 -
使用
radtest进行本地测试radtest是一个命令行测试工具,它将模拟一个 RADIUS 客户端发送认证请求。radtest testuser testpass localhost 0 testing123
testuser: 用户名testpass: 密码localhost: RADIUS 服务器地址0: RADIUS 服务器 UDP 端口(默认为 1812/1813)testing123: 我们在clients.conf中为localhost设置的共享密钥
-
查看测试结果 如果配置成功,你会在终端输出中看到类似下面的内容,关键在于
Access-Accept:Sending Access-Request of id 210 to 127.0.0.1 port 1812 User-Password = "testpass" rad_recv: Access-Accept packet from host 127.0.0.1 port 1812, id=210, length=20如果看到
Access-Reject,说明认证失败,请检查前面的每一步配置(用户密码、数据库连接、共享密钥等)。 -
调试模式(非常重要) 如果
