FreeRADIUS 是开源社区使用最广泛的 RADIUS 服务器,支持 PAP、CHAP、EAP 等多种认证协议,也提供与 MySQL、LDAP、Active Directory 等后端的对接模块。容器化部署的核心思路是把 FreeRADIUS 及其依赖打进一个镜像,把配置文件、日志、证书等通过挂载卷暴露出来,实现运行环境与数据的分离。这样在不同宿主机之间迁移时,只需要复制目录和镜像即可恢复完整服务。

接下来说明一个完整的部署流程,覆盖镜像构建、配置调整、编排测试以及生产环境需要注意的细节点。
一、编写 Dockerfile 构建 FreeRADIUS 镜像
基础镜像可以选择 Debian 系的 slim 版本,因为官方 apt 仓库直接提供 freeradius、freeradius-mysql、freeradius-ldap 等软件包,省去手动编译的麻烦。Alpine 镜像虽然体积更小,但部分 RADIUS 模块需要额外编译,部署门槛稍高。对于大多数团队来说,优先保证可用性和兼容性更重要。
下面是一个可直接使用的 Dockerfile 示例:
FROM debian:bookworm-slim
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
freeradius \
freeradius-mysql \
freeradius-ldap \
freeradius-rest \
freeradius-utils \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
RUN mkdir -p /var/run/radiusd \
&& chown freerad:freerad /var/run/radiusd
EXPOSE 1812/udp 1813/udp
CMD ["freeradius", "-f", "-lstdout"]
这里安装了 freeradius-utils 是为了后续在容器内执行 radtest 测试命令。启动参数 -f 表示前台运行,因为容器需要一个长期存活的进程,如果 FreeRADIUS 跑到后台,容器会立刻退出。-lstdout 把日志输出到标准输出,方便使用 docker logs 查看。还要注意 /var/run/radiusd 目录的属主必须是 freerad,否则服务无法写入 PID 文件。
构建镜像的命令是:
docker build -t my-radius:1.0 .
构建完成后可以用 docker image ls | grep my-radius 确认镜像已经生成。如果网络较慢,可以在 Dockerfile 中把 apt 源换成国内镜像,但生产环境建议保持官方源以保证软件包完整性。
二、配置 FreeRADIUS 客户端和本地用户
FreeRADIUS 的默认配置目录在 /etc/freeradius/3.0。容器部署时,我们通常把这个目录完整挂载出来,例如放在本地的 ./raddb 下。这样后续修改配置、添加证书或调试都在宿主机上操作,无需进入容器。
首先要配置 clients.conf。这个文件控制哪些网络设备或应用可以向 RADIUS 服务器发起认证请求。默认只允许本机的 localhost,其他客户端必须显式添加。下面是一个典型配置:
client wifi-ap {
ipaddr = 192.168.1.10
secret = my-strong-secret
shortname = office-ap
nastype = other
}
client vpn-gateway {
ipaddr = 192.168.1.0/24
secret = vpn-secret-123
require_message_authenticator = yes
}
ipaddr 支持单个 IP 或 CIDR 网段,secret 是客户端与服务器之间的共享密钥,两端必须完全一致。对于来自 VPN 网关等设备的认证请求,建议开启 require_message_authenticator 增强安全性。
接下来配置本地测试账号。在 users 文件中添加类似如下内容:
testuser Cleartext-Password := "test123"
Reply-Message := "Hello, testuser",
Service-Type = Framed-User,
Framed-IP-Address = 192.168.2.50
alice Cleartext-Password := "alice@2024"
Service-Type = Administrative-User
明文密码只适合开发测试阶段。生产环境应优先使用 EAP 模块配合证书,或把账号迁移到 MySQL、LDAP 等后端。FreeRADIUS 的 EAP 配置位于 mods-enabled/eap 中,默认已经包含 TTLS、PEAP 等常见方式。下面是一个基于 TTLS 的配置片段:
eap {
default_eap_type = ttls
timer_expire = 60
ignore_unknown_eap_types = no
md5 {
}
ttls {
tls = tls-common
default_eap_type = pap
copy_request_to_tunnel = no
use_tunneled_reply = no
virtual_server = "inner-tunnel"
}
}
TTLS 外层使用 TLS 加密隧道,内层可以继续使用 PAP 认证,这样既降低了证书管理复杂度,又能保护密码明文传输。FreeRADIUS 自带自签名证书位于 certs/ 目录,生产环境务必替换成可信 CA 签发的证书。
三、用 Docker Compose 编排并测试
单独使用 docker run 携带大量参数容易出错,推荐使用 Docker Compose 统一管理。下面是一个完整的 docker-compose.yml 文件:
services:
freeradius:
build: .
image: my-radius:1.0
container_name: radius-server
restart: unless-stopped
ports:
- "1812:1812/udp"
- "1813:1813/udp"
volumes:
- ./raddb:/etc/freeradius/3.0
- ./logs:/var/log/freeradius
environment:
- TZ=Asia/Shanghai
healthcheck:
test: ["CMD", "radtest", "testuser", "test123", "127.0.0.1", "0", "testing123"]
interval: 30s
timeout: 5s
retries: 3
端口映射必须显式指定 /udp,因为 RADIUS 认证和计费默认使用 UDP 1812、1813 端口。如果只写 1812:1812,Docker 会按 TCP 处理,客户端无法正常通信。卷挂载将本地的 ./raddb 覆盖容器内配置目录,修改配置后需要重启容器生效,也可以执行 docker exec radius-server kill -HUP 1 触发热加载。
健康检查使用 radtest 对本机发起一次认证测试,其中 testing123 是 clients.conf 中 localhost 客户端的默认密钥。启动与测试流程如下:
docker compose up -d docker compose logs -f freeradius radtest testuser test123 127.0.0.1 0 testing123
如果配置正确,最后一条命令会输出 Access-Accept 信息。如果出现 Access-Reject 或超时,可以查看日志定位是共享密钥错误、用户不存在还是后端数据库连接失败。
四、对接 MySQL、LDAP 后端与生产建议
当账号数量较多或需要动态管理权限时,本地 users 文件不再合适。FreeRADIUS 的 sql 模块支持把用户信息存储在 MySQL、PostgreSQL 等关系型数据库中。启用该模块需要在 mods-available/sql 中配置数据库连接,并在 sites-enabled/default 的 authorize 和 authenticate 段中启用 sql。下面是一个 MySQL 连接配置示例:
sql {
driver = "rlm_sql_mysql"
dialect = "mysql"
server = "mysql-host"
port = 3306
login = "radius"
password = "radius-db-password"
radius_db = "radius"
read_groups = yes
read_profiles = yes
pool {
start = 5
min = 5
max = 20
spare = 10
uses = 0
retry_delay = 30
lifetime = 0
idle_timeout = 60
}
}
数据库中的 radcheck 表用于存放用户名和密码,radreply 表存放回复属性,radusergroup 表建立用户与组的关联。密码字段可以使用明文或加密后的值,具体由 Cleartext-Password 或 Crypt-Password 属性决定。LDAP 对接方式类似,在 mods-available/ldap 中配置目录服务器地址、绑定 DN 和查询基准,然后启用 ldap 模块即可。
生产环境部署还需要注意几个细节。证书文件不建议打入镜像,应该通过卷挂载单独管理,便于更新。日志输出到标准输出后,可以使用 ELK、Loki 之类的工具集中收集。容器默认以 freerad 用户运行,无需额外设置 root 权限,但挂载的 ./raddb 目录必须保证该用户可读写。监控方面至少要探测 1812/udp 端口的可达性,以及定期用 radtest 做一次端到端认证。最后,定期备份 ./raddb 和数据库是防止配置丢失的关键。
容器化 FreeRADIUS 可以显著降低部署复杂度,但 UDP 端口映射和配置目录挂载是容易踩坑的地方。只要前期把 Dockerfile 和 Compose 模板做好,后续新增认证域或接入点只需要修改 clients.conf、users 或后端数据,就能快速扩展认证能力。
FreeRADIUS容器化Docker部署RADIUS认证修改时间:2026-09-25 12:26:15