Build FreeRADIUS server based on Ubuntu18

参考:

https://www.cnblogs.com/opsprobe/p/9420502.html

https://blog.csdn.net/lassewang/article/details/9159543

0 RADIUS

RADIUS:(Remote Authentication Dial In User Service)中文名为远程用户拨号认证服务,简称 RADIUS,是目前应用最广泛的 AAA 协议(认证、授权和计费)

202205243456723

图中 Device(例如交换机)向远程接入用户提供接入及与 RADIUS 服务器交互的服务。RADIUS 服务器上则存储用户的身份信息、授权信息以及访问记录,对用户进行认证、授权和计费服务

认证过程如下

(1)客户端向接入设备发送一个 EAPoL-Start 报文,开始 802.1x 认证接入;

(2)接入设备向客户端发送 EAP-Request/Identity 报文,要求客户端将用户名送上来;

(3)客户端回应一个 EAP-Response/Identity 给接入设备的请求,其中包括用户名;

(4)接入设备将 EAP-Response/Identity 报文封装到 RADIUS Access-Request 报文中,发送给认证服务器;

(5)认证服务器产生一个 Challenge,通过接入设备将 RADIUS Access-Challenge 报文发送给客户端,其中包含有 EAP-Request/MD5-Challenge;

(6)接入设备通过 EAP-Request/MD5-Challenge 发送给客户端,要求客户端进行认证;

(7)客户端收到 EAP-Request/MD5-Challenge 报文后,将密码和 Challenge 做 MD5 算法后的 Challenged-Pass-word,在 EAP-Response/MD5-Challenge 回应给接入设备;

(8)接入设备将 Challenge,Challenged Password 和用户名一起送到 RADIUS 服务器,由 RADIUS 服务器进行认证;

(9)RADIUS 服务器根据用户信息,做 MD5 算法,判断用户是否合法,然后回应认证成功 / 失败报文到接入设备。如果成功,携带协商参数,以及用户的相关业务属性给用户授权。如果认证失败,则流程到此结束;

(10)如果认证通过,用户通过标准的 DHCP 协议 (可以是 DHCP Relay) ,通过接入设备获取规划的 IP 地址;

(11)如果认证通过,接入设备发起计费开始请求给 RADIUS 用户认证服务器;

(12)RADIUS 用户认证服务器回应计费开始请求报文,用户上线完毕。

freeradius 是 GNU/GPL(通用公共许可证)的原则下,开发的高性能开源 radius 服务器。常见的 radius 服务器种类不多,比较强大的当属开源的 freeradius,世界上大部分的 radius 服务器都是基于 freeradius 开发而来的。

freeradius 可以对支持 radius 协议的网络设备进行账户认证、授权和记账管理,常见的开源路由器操作系统:如 Openwrt,DD-wrt 等,都支持 radius 协议,常见的电信运营商的宽带账户,上网账户管理,记账,也都是使用的 radius 服务器进行鉴权记账的。

RADIUS 服务器和 NAS 服务器通过 UDP 协议进行通信,RADIUS 服务器的 1812 端口负责认证,1813 端口负责计费工作。采用 UDP 的基本考虑是因为 NAS 和 RADIUS 服务器大多在同一个局域网中,使用 UDP 更加快捷方便,而且 UDP 是无连接的,会减轻 RADIUS 的压力,也更安全。

以下均在 Ubuntu18 上操作的,Ubuntu16 上坑太多.. 看网上教程,CentOS 更多..

1 安装 Apache Web Server 和 PHP

在 Ubuntu 上安装 Apache,运行以下命令安装 Apache Web 服务器:

1
sudo apt-get install apache2

要在 Ubuntu 18.04 上安装 PHP,请运行 (直接运行可能会不成功,因为没这个源)

1
2
sudo apt-get install php libapache2-mod-php php-gd php-common php-mail \
php-mail-mime php-mysql php-pear php-db php-mbstring php-xml php-curl

PHP 安装:

1 添加 PHP PPA

添加 ondrej/php,它包含 PHP 包和其他必需的 PHP 扩展

1
2
3
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update

通过复制以下代码并将其添加到系统的软件源中,可以手动将此 PPA 添加到系统中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# Ubuntu 18.04 拷贝
deb http://ppa.launchpad.net/ondrej/php/ubuntu bionic main
deb-src http://ppa.launchpad.net/ondrej/php/ubuntu bionic main

# 添加源
sudo vim /etc/apt/sources.list
sudo apt update && sudo apt upgrade

# 安装PHP
sudo apt-get install php libapache2-mod-php php-gd php-common php-mail \
php-mail-mime php-mysql php-pear php-db php-mbstring php-xml php-curl

# 验证
php -v

2 安装 MariaDB 并创建数据库

MariaDB 是 MySQL 的一个分支,目前最新稳定版是 10.5,以下是安装步骤

1
2
3
4
5
6
7
8
9
# 安装software-properties-common
sudo apt-get install software-properties-common
# 导入MariaDB gpg密钥
ssudo apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'
# 添加apt存储库
sudo add-apt-repository 'deb [arch=amd64,arm64,ppc64el] https://mirrors.tuna.tsinghua.edu.cn/mariadb/repo/10.5/ubuntu bionic main'
# 安装MariaDB Server
sudo apt update
sudo apt -y install mariadb-server mariadb-client

安装并运行后,为 FreeRADIUS 创建一个数据库,这将在稍后阶段使用:

数据库名称:radius

数据库用户:radius

数据库用户密码:radiuspassword

如果你有专用数据库服务器,请将 localhost 替换为源 FreeRadius 服务器的 IP:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 第一次使用,初始化MariaDB
sudo mysql_secure_installation
# 大致会经历这几个阶段
Switch to unix_socket authentication [Y/n] >> [直接Enter] 切换到unix_socket身份验证
Change the root password? [Y/n] y
New password:
Re-enter new password:
Remove anonymous users? [Y/n] >> [直接Enter] 是否删除匿名用户
Disallow root login remotely? [Y/n] >> [直接Enter] 禁止远程root角色登录
Remove test database and access to it? [Y/n] >> [直接Enter] 是否删除test数据库
Reload privilege tables now? [Y/n] >> [直接Enter] 是否重新加载权限表

# 登录
mysql -u root -p
# 输入密码 登录成功后在MariaDB中创建数据库
CREATE DATABASE radius;
# 设置通过root:password可以在任何PC上访问数据库 方便其他电脑上用navicat或datagrip
GRANT ALL ON *.* TO 'root'@'%' IDENTIFIED BY "password";
# 设置通过 radius:radiuspassword 访问radius数据库
GRANT ALL ON radius.* TO 'radius'@'localhost' IDENTIFIED BY "radiuspassword";
# 重新载入权限
flush privileges;
# 退出MariaDB
\q

完全卸载 MySQL/MariaDB

首先删除 mysql: sudo apt-get remove mysql-* 然后清理残留的数据 dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dpkg -P

  • 查看状态 sudo systemctl status mysql
  • 启动 sudo systemctl start mysql
  • 重启 sudo systemctl restart mysql
  • 关闭 sudo systemctl stop mysql

3 安装和配置 FreeRADIUS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 在Ubuntu 18.04上安装的FreeRADIUS版本是v3.0,使用以下命令从官方Ubuntu apt存储库安装
sudo apt-get install freeradius freeradius-mysql freeradius-utils
# 检测是否安装成功
ps -ef | grep freeradius

# 查看普通用户是否有读取文件权限
ll /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
# 改权限
sudo chmod 666 /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
# 导入freeradius MySQL数据库方案
mysql -u root -p radius < /etc/freeradius/3.0/mods-config/sql/main/mysql/schema.sql
# 查看创建的表
mysql -u root -p -e "use radius; show tables;"
+------------------+
| Tables_in_radius |
+------------------+
| nas |
| radacct |
| radcheck |
| radgroupcheck |
| radgroupreply |
| radpostauth |
| radreply |
| radusergroup |
+------------------+

# 在/etc/freeradius/3.0/mods-enabled/下为sql模块创建一个软链接
sudo ln -s /etc/freeradius/3.0/mods-available/sql /etc/freeradius/3.0/mods-enabled/

# 配置SQL模块并更改数据库连接参数以适合你的环境
sudo vim /etc/freeradius/3.0/mods-enabled/sql
# 修改
sql {
driver = "rlm_sql_mysql"
dialect = "mysql"
# Connection info:
server = "localhost"
port = 3306
login = "radius"
password = "radiuspassword"
# Database table configuration for everything except Oracle
radius_db = "radius"

# Set to ‘yes’ to read radius clients from the database (‘nas’ table)
# Clients will ONLY be read on server startup.
read_clients = yes
# Table to keep radius client info
client_table = "nas"
}
# 更改/etc/freeradius/3.0/mods-enabled/sql的组权限
sudo chgrp -h freerad /etc/freeradius/3.0/mods-available/sql
sudo chown -R freerad:freerad /etc/freeradius/3.0/mods-enabled/sql

# 重启freeradius服务
sudo systemctl restart freeradius.service

4 安装和配置 Daloradius

我们需要安装 Daloradius 才能获得 FreeRADIUS Web 管理界面

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 下载Daloradius
wget https://github.com/lirantal/daloradius/archive/master.zip
unzip master.zip
mv daloradius-master/ daloradius
cd daloradius
# 配置daloradius,现在导入Daloradius mysql表
mysql -u root -p radius < contrib/db/fr2-mysql-daloradius-and-freeradius.sql
mysql -u root -p radius < contrib/db/mysql-daloradius.sql
# 配置daloRADIUS数据库连接详细信息
cd ..
sudo mv daloradius /var/www/html/
# 更改http文件夹的权限并为daloradius配置文件设置正确的权限
sudo chown -R www-data:www-data /var/www/html/daloradius/
sudo chmod 664 /var/www/html/daloradius/library/daloradius.conf.php
# 修改filedaloradius.conf.php以调整数据库信息 对应/etc/freeradius/3.0/mods-enabled/sql
sudo vim /var/www/html/daloradius/library/daloradius.conf.php
# 主要是
CONFIG_DB_USER
CONFIG_DB_PASS
CONFIG_DB_NAME
# 重新启动freeradius和apache2
systemctl restart freeradius apache2

打开浏览器,访问http://ip-address/daloradius/login.php

image-20200822142751997

默认的管理员账户密码是 administrator:radius

查看 syslog 和 daloradius.log 时,可能会报错,修改 syslog 权限为 644 即可,加到用户组或许效果更好;至于 daloradius.log 去 Config>Logging Settings 中把想要监听的 log 设置成 yes 就好了

5 修改 FreeRADIUS 测试账户

FreeRADIUS 的配置默认是文件,打开测试账户

1
2
3
4
5
6
7
8
9
10
11
sudo vim /etc/freeradius/3.0/users
# 找到下面这段信息 注释全打开
73 steve Cleartext-Password := "testing"
74 Service-Type = Framed-User,
75 Framed-Protocol = PPP,
76 Framed-IP-Address = 172.16.3.33,
77 Framed-IP-Netmask = 255.255.255.0,
78 Framed-Routing = Broadcast-Listen,
79 Framed-Filter-Id = "std.ppp",
80 Framed-MTU = 1500,
81 Framed-Compression = Van-Jacobsen-TCP-IP

配置路由器或交换机的账号

1
2
3
4
5
6
sudo vim /etc/freeradius/3.0/clients.conf
# 按照这个格式 里面有个localhost 用作本机测试的
client x.x.x.x { # 路由器或交换机的ip
ipaddr = x.x.x.x # 路由器或交换机的ip
secret = xxxxx # 路由器或交换机访问radius的密码
}

重新开一终端

1
2
3
4
5
# 修改了配置文件 需要重启一下服务
service freeradius restart
# 测试账户 接收到 Received Access-Accept 就表示没问题了
radtest steve testing localhost 1812 testing123
# radtest 账号 密码 client_ip radius端口 client_secret

这也确实,表明 FreeRADIUS 是通过文件进行配置的,接下来将其改为 sql 模式,上面改得差不多了,再改俩就行

修改配置文件/etc/freeradius/3.0/sites-enabled/default

1 找到authorize { (273 行),注释其中的files,并将sql去掉注释或-

2 找到preacct { (555 行),注释其中的files

3 找到accounting { (608 行),去掉sql的注释或-

4 找到session { (677 行),去掉sql的注释或-

5 找到post-auth { (689 行),去掉sql的注释或-

6 找到pre-proxy { (861 行),注释掉files

修改配置文件/etc/freeradius/3.0/sites-enabled/inner-tunnel,和上面一样,注释掉files,去掉sql的注释或-

1
2
3
4
# 重启一下相关的服务
service mysql restart
service apache2 restart
service freeradius restart

下面进行测试,直接进入 MySQL 可以通过 Navicat 或者直接终端 (mysql -u root -p; use radius;),输入下面的 sql 语句

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 创建用户组
INSERT INTO radius.radgroupreply (groupname, attribute, op, `value`) VALUES ('locahost', 'Service-Type', ':=', 'Framed-User');
INSERT INTO radius.radgroupreply (groupname, attribute, op, `value`) VALUES ('locahost', 'Framed-Protocol', ':=', 'PPP');
INSERT INTO radius.radgroupreply (groupname, attribute, op, `value`) VALUES ('locahost', 'Framed-IP-Address', ':=', '192.168.1.109');
INSERT INTO radius.radgroupreply (groupname, attribute, op, `value`) VALUES ('locahost', 'Framed-IP-Netmask', ':=', '255.255.255.0');
INSERT INTO radius.radgroupreply (groupname, attribute, op, `value`) VALUES ('locahost', 'Framed-Routing', ':=', 'Broadcast-Listen');
INSERT INTO radius.radgroupreply (groupname, attribute, op, `value`) VALUES ('locahost', 'Framed-Filter-Id', ':=', '"std.ppp"');
INSERT INTO radius.radgroupreply (groupname, attribute, op, `value`) VALUES ('locahost', 'Framed-MTU', ':=', '1500');
INSERT INTO radius.radgroupreply (groupname, attribute, op, `value`) VALUES ('locahost', 'Framed-Compression', ':=', 'Van-Jacobsen-TCP-IP');

# 创建用户
INSERT INTO radius.radcheck (username, attribute, op, `value`) VALUES ('user1', 'Cleartext-Password', '==', 'password1');

# 将用户加入组
INSERT INTO radius.radusergroup (username, groupname) VALUES ('user1', 'locahost');

执行完之后,另打开一个终端进行本地测试

1
2
# 能接收到 Received Access-Accept 就表示没问题
radtest user1 password1 localhost 1812 testing123

由于没有路由器和交换机,就只能再开一个 Win 虚拟机,进行测试,首先向/etc/freeradius/3.0/clients.conf添加 Win 虚拟机的信息

1
2
3
4
5
6
sudo vim /etc/freeradius/3.0/clients.conf
# 按照这个格式 里面有个localhost 用作本机测试的
client 192.168.1.109 { # Win虚拟机ip
ipaddr = 192.168.1.109 # Win虚拟机ip
secret = justpwd # Win虚拟机访问radius的密码
}

好了,这时候,Win 虚拟机上需要一个软件,NTRadPing,测试手法如下

天翼云:https://cloud.189.cn/t/AFJnYfy6Jbq2(访问码:kb1q)

蓝奏云:https://sidneygod.lanzous.com/iHcxEfxkqgf

NTRadPing_Test

RADIUS Server/port 就填安装 freeradius 的 ip 和 freeradius 的默认端口 1812

Reply timeout 这一行就这样

RADIUS Secret key 就是上面配置的 secret 值

User-Name 和 Password 还是之前的 user1 和 password1

其余不用管,点击 send,右侧就会得到服务器返回的数据


毕竟我们有前端页面了,所以添加用户组和用户什么的,肯定不用手动去输 MySQL 语句,不友好。

添加用户组:Management > Profiles

添加用户:Management > Users

其实这些页面应该对应着数据库的操作.. 没咋研究,但是像 client 似乎比如通过配置文件,毕竟路由器没那么多吧..

还有,关于路由器和交换机的配置,由于手头没设备,没法玩.. 看教程,tplink 的 wap2 能设置 radius 服务器信息

6 拾遗

6.1 环境问题

用 Ubuntu16 搞了一上午,php 和 MariaDB 都不行,然后果断选择 Ubuntu18,基本上没出啥错,哦,用的是清华源,不知道和这个有没有关系,本来觉得阿里源挺好,但是 16 上用的就是,想着换一下..

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 备份
sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
# 把里面内容全换了
sudo gedit /etc/apt/sources.list

# 清华源
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ bionic-proposed main restricted universe multiverse

# 完了之后记得更新源
sudo apt-get update && sudo apt upgrade

6.1 重启服务报错

用 systemctl 或者 service 进行重启 freeradius 时,有时候会报错,说启动不了。大概长这样子

1
2
Job for freeradius.service failed because the control process exited with error code.
See "systemctl status freeradius.service" and "journalctl -xe" for details.

直接 reboot 就好,当然了,实在启动不了,也可以执行sudo freeradius -X,可以看到调试信息

6.1 关于 log

daloradius 有个 Reports 模块,默认显示四种 log:daloRADIUS Log,Radius Log,System Log,Boot Log。其中前俩正常,就是后俩,syslog 有这个文件,但是没权限;Boot Log 显示的是 dmesg,但 Ubuntu18 上却不是/var/log/dmesg这个文件,而是/var/log/kern.log

于是,修改文件:/var/www/html/daloradius/library/exten-boot_log.php,加三句话

1
2
3
4
5
6
7
8
9
10
11
$logfile_loc1 = '/var/log/dmesg';
$logfile_loc2 = '/usr/local/var/log/dmesg';
+ $logfile_loc3 = '/var/log/kern.log';

if (file_exists($logfile_loc1))
$logfile = $logfile_loc1;
else if (file_exists($logfile_loc2))
$logfile = $logfile_loc2;
+ else if (file_exists($logfile_loc3))
+ $logfile = $logfile_loc3;
else {

但是呢,还是有权限问题,因为syslog和kern.log,要是把这俩文件权限改为 644 倒是没问题,问题是重启就又不行了。顺带一提,mysql,apache2,freeradius 都是开机自启的。不是 syslog 用户或 adm 组是没有读文件权限的,于是就把www-data加到 adm 用户组了,问题解决

1
sudo gpasswd -a www-data adm

如果/var/log/下连 syslog,kern.log.. 都没有,查看/etc/rsyslog.d/50-default.conf,是不是把那些 log 给禁用了,打开注释就好了

6.1 证书配置

参考:https://blog.csdn.net/lassewang/article/details/9159543