FreeRADIUS 3.0.26 → 3.2.7 升级实战手册

适用环境:Ubuntu 22.04 LTS

目标说明

  • 在不影响现有系统的前提下,测试和部署 FreeRADIUS 的新版本。
  • 不卸载旧版,以便随时回滚或对比测试。
  • 从源码编译新版以启用所有需要的功能模块,例如 Redis 和 SQL。
  • 使新版能通过 systemd 管理,实现自动启动。

0. 准备工作

在编译前需安装基础编译工具和模块依赖。

1
2
3
4
sudo apt update
sudo apt install -y build-essential git pkg-config \
libssl-dev libtalloc-dev libpcap-dev libsystemd-dev \
libjson-c-dev libhiredis-dev libpq-dev

说明

  • libhiredis-dev 是 Redis 支持模块 rlm_redis 的依赖。
  • libpq-dev 是 PostgreSQL 支持模块 rlm_sql_postgresql 的依赖。

1. 暂停旧版 FreeRADIUS 服务

为了避免端口冲突,需要先停用 apt 安装的旧版服务。

1
2
3
sudo systemctl stop freeradius
sudo systemctl disable freeradius
sudo lsof -i :1812 # 确认 1812 端口是否被释放

2. 下载 3.2.7 源码

1
2
3
cd /usr/local/src
git clone --branch release_3_2_7 https://github.com/FreeRADIUS/freeradius-server.git
cd freeradius-server

说明:release_3_2_7 分支是官方的稳定版本。


3. 编译安装

使用以下参数编译以启用所需模块,并设置安装目录为 /usr/local

1
2
3
4
5
6
7
8
9
10
11
./configure --prefix=/usr/local \
--enable-developer \
--with-mods-dir=/usr/local/lib/freeradius \
--with-raddbdir=/usr/local/etc/raddb \
--with-logdir=/var/log/freeradius32 \
--with-systemd \
--with-modules="rlm_sql_postgresql rlm_redis"

make -j$(nproc)
sudo make install
sudo ldconfig

说明

  • --with-mods-dir 定义模块存放路径。
  • --with-raddbdir 设置配置文件位置。
  • --enable-developer 启用调试功能(可选)。
  • --with-modules 指定所需模块。

4. 新版相关目录

目录 作用
/usr/local/sbin/radiusd 新版主程序
/usr/local/etc/raddb/ 新版配置路径
/usr/local/lib/freeradius/ 编译后的插件模块目录
/var/log/freeradius32/ 自定义日志目录

5. 配置迁移或启用新配置

1
2
3
4
5
sudo mv /usr/local/etc/raddb /usr/local/etc/raddb-dist
sudo cp -a /usr/local/etc/raddb-dist /usr/local/etc/raddb

sudo rsync -av /etc/freeradius/mods-config/sql/main/postgresql/ \
/usr/local/etc/raddb/mods-config/sql/main/postgresql/

说明
新版默认使用 mods-available/mods-enabled/ 的软链接方式启用模块,避免直接编辑主配置。


6. 启用 Redis / SQL 模块

1
2
3
cd /usr/local/etc/raddb/mods-enabled
sudo ln -s ../mods-available/redis .
sudo ln -s ../mods-available/sql .

示例配置 - Redis:

1
2
3
4
5
6
servers = "127.0.0.1"
pool {
start = 5
min = 3
max = 10
}

示例配置 - PostgreSQL:

1
2
3
4
5
driver = "rlm_sql_postgresql"
dialect = "postgresql"
server = "127.0.0.1"
login = "radius"
password = "radiuspass"

7. 创建 systemd 自动启动服务

文件路径:/etc/systemd/system/freeradius32.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=FreeRADIUS 3.2.7 (local build)
After=network.target

[Service]
Type=simple
User=radiusd
Group=radiusd
ExecStart=/usr/local/sbin/radiusd -d /usr/local/etc/raddb
Restart=on-failure
LimitNOFILE=65536
Environment=LD_LIBRARY_PATH=/usr/local/lib/freeradius

[Install]
WantedBy=multi-user.target

启动服务

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable --now freeradius32
sudo journalctl -u freeradius32 -f

8. 调试与切换方案

操作 命令
恢复旧版 systemctl stop freeradius32 && systemctl start freeradius
禁用旧版 systemctl disable --now freeradius
使用新端口 radiusd -d /usr/local/etc/raddb -p 3812

9. 常见问题与解决

问题 解决方式
插件模块找不到 确保已安装依赖包并重新运行 ldconfig
systemd 启动失败 检查配置路径、权限、日志信息 journalctl -u freeradius32
SQL 无法连接 检查数据库状态与账号密码配置

10. 后续维护

  • 升级:拉取代码后重新编译 make && make install
  • 插件增加:重新运行 ./configure 启用模块后再编译
  • Docker 化部署:可将整个安装流程写入 Dockerfile 实现快速复现环境

欢迎在 GitHub Issues 或知乎评论区留言交流问题,我会持续更新完善此手册。