当前位置: 首页 > 工具软件 > daloRADIUS > 使用案例 >

通过Docker安装Freeradius和daloradius【更新】

姜磊
2023-12-01

首先,我们以Ubuntu 18.04.4 LTS为例,安装Docker。
  旧版本的Docker曾被叫做:docker、docker.io或者docker-engine。如果系统中存在这些旧的版本,请卸载它们。

$ sudo apt-get remove docker docker-engine docker.io containerd runc

  更新apt软件包索引,并安装相关的软件包,使apt可以通过HTTPS来使用软件仓库。

$ sudo apt-get update
$ sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

  添加Docker官方的GPG密钥:

$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

  通过搜索GPG指纹的后8个字符,验证您现在是否拥有带有指纹9DC8 5822 9FC7 DD38 854A E2D8 8D81 803C 0EBF CD88的密钥。

$ sudo apt-key fingerprint 0EBFCD88

  出现下面的结果就表示正常:

pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) <docker@docker.com>
sub   rsa4096 2017-02-22 [S]

  使用以下命令添加Docker的稳定版仓库(其实就是向/etc/apt/source.list里添加PPA源):

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"	

  更新apt软件包索引,并安装最新版的Docker引擎和容器。

 $ sudo apt-get update
 $ sudo apt-get install docker-ce docker-ce-cli containerd.io

  为docker的dockerhub添加国内镜像

 $ sudo nano /etc/docker/daemon.json

  修改daemon.json文件,如果有注册阿里云账号,可以在仓库服务中得到一个专用的docker镜像地址,将registry-mirrors改为:

{
  "registry-mirrors": [
    "https://阿里云申请得到的地址.mirror.aliyuncs.com",
    "http://f1361db2.m.daocloud.io"
  ]
}

  如果没有阿里云账号,可以直接改成:

{
  "registry-mirrors": [
    "http://f1361db2.m.daocloud.io"
  ]
}

  如果该文件不存在,直接保存即可新建一个daemon.json。nano编辑器的快捷键Ctrl+O为保存,Ctrl+X为退出。
  重新加载服务配置文件,重启docker服务。

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker.service

  允许开机启动Docker。

$ sudo systemctl enable docker

  拉取并运行hello-world镜像测试Docker是否正常运行。

$ sudo docker run hello-world 

部署轻量级的Portainer服务器:
  Portainer服务器是一个Docker的容器,随后可以通过Portainer以Web形式管理Docker。

$ sudo docker volume create portainer_data
$ sudo docker run -d -p 8000:8000 -p 9000:9000 --name=portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

  参数–restart=always是为了达到开机自动启动容器的目的,后面安装的其他容器可以自行手动添加此参数,否则服务器重启以后,这些容器不能跟随服务器自动启动,还需要手动去启动。
  稍等片刻,等待容器完成安装,在浏览器里进入http://服务器的IP地址:9000/,第一次进入需要建立一个管理员用户并设置密码,具体使用方法可以自行百度。

安装mariadb:

$ sudo docker pull mariadb
$ sudo docker run --name mariadb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=数据库root用户密码 -d mariadb

  这里有个地方尤其需要注意,那就是数据库的字符集问题。通过上面的命令安装的mariadb,默认的字符集是latin1,在使用daloradius时,因为daloradius操作数据库使用的是较为过时的PEAR DB库,在默认情况下插入数据库的数据都是latin1字符集的数据,中文字符在UTF-8环境下会造成乱码。解决的方法有两个:
  1、在通过docker安装mariadb的时候直接加上字符集参数。命令如下:

$ sudo docker run --name mariadb -p 3306:3306 -e MYSQL_ROOT_PASSWORD=数据库root用户密码 -d mariadb --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

  2、已经安装好数据库的情况下,可以进入容器,修改mariadb的配置文件,更改数据库的默认字符集,更改完以后需要重启数据库。
查看容器ID:

$ sudo docker ps

  记住mariadb的容器ID(CONTAINER ID),用下面的命令进入容器:

$ sudo docker exec -it mariadb的容器ID /bin/bash

  用vi编辑器或者nano(不习惯用vi的可以用这个编辑器,如果容器内没有,可能需要apt-get install nano或者yum install nano安装一个,安装之前要运行apt-get update或者yum update更新一下)

$ vi /etc/mysql/mariadb.cnf

  原来的默认配置如下:

# MariaDB-specific config file.
# Read by /etc/mysql/my.cnf

[client]
# Default is Latin1, if you need UTF-8 set this (also in server section)
#default-character-set = utf8

[mysqld]
#
# * Character sets
# 
# Default is Latin1, if you need UTF-8 set all this (also in client section)
#
#character-set-server  = utf8 
#collation-server      = utf8_general_ci 
#character_set_server   = utf8 
#collation_server = utf8_general_ci 
# Import all .cnf files from configuration directory
!includedir /etc/mysql/mariadb.conf.d/

  按照下列配置修改:

# MariaDB-specific config file.
# Read by /etc/mysql/my.cnf

[client]
# Default is Latin1, if you need UTF-8 set this (also in server section)
default-character-set = utf8mb4

[mysqld]
#
# * Character sets
# 
# Default is Latin1, if you need UTF-8 set all this (also in client section)
#
character-set-server  = utf8mb4
collation-server      = utf8mb4_unicode_ci
character_set_server   = utf8mb4
collation_server = utf8mb4_unicode_ci
# Import all .cnf files from configuration directory
!includedir /etc/mysql/mariadb.conf.d/

  修改完以后保存并重启mariadb。可以使用如下mysql命令确认是否修改成功:
  修改之前:

mariadb> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.04 sec)

mariadb> show global variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | latin1                     |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.06 sec)

  修改完并重启之后:

mariadb> show variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.04 sec)

mariadb> show global variables like '%char%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8mb4                    |
| character_set_connection | utf8mb4                    |
| character_set_database   | utf8mb4                    |
| character_set_filesystem | binary                     |
| character_set_results    | utf8mb4                    |
| character_set_server     | utf8mb4                    |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.04 sec)

安装phpmyadmin:
  (当然也可以不安装这个软件直接用命令行或者类似Navicat一类的软件管理mariadb数据库)

$ sudo docker pull phpmyadmin/phpmyadmin
$ sudo docker run --name phpmyadmin -d --link mariadb:db -p 8080:80 phpmyadmin/phpmyadmin

  完成以后,在浏览器中键入http://服务器的IP地址:8080/,即可打开phpmyadmin的登录页面。
  在数据库中新建一个名称为radius的数据库和一个名称为radius的用户,将radius数据库的所有权限赋予radius用户,并且允许radius用户从任何主机访问数据库(当然也可以根据实际情况做一些限制)。
安装freeradius、daloradius(freeradius的web管理系统)集成版:

$ sudo docker pull frauhottelmann/daloradius-docker:amd64-v1.1-2-focal
$ sudo docker run -d -p daloradius的端口:80 -e TZ=Asia/Shanghai -e MYSQL_PASSWORD=数据库radius用户的密码 --env MYSQL_HOST=数据库服务器的IP地址 --name=freeradius frauhottelmann/daloradius-docker:amd64-v1.1-2-focal

【5月29日更正:】
  上面的docker run的命令有问题,需要将端口1812、1813暴露出来,并指定为udp协议端口。

sudo docker run -d -p daloradius的端口:80 -p 1812:1812/udp -p 1813:1813/udp -e TZ=Asia/Shanghai -e MYSQL_PASSWORD=数据库radius用户的密码 --env MYSQL_HOST=数据库服务器的IP地址 --restart=always --name=freeradius frauhottelmann/daloradius-docker:amd64-v1.1-2-focal

  完成以后,在浏览器里输入http://服务器的IP地址:端口号/daloradius/ ,即可进入daloradius登录界面了,具体使用方法请自行百度。

一些需要注意的坑:
  1、freeradius3.0安装路径有变动,不能照搬以前版本的命令和路径。
  2、在daloradius中做的nas相关配置,做完以后要重启freeradius,因为nas的配置只在freeradius启动的时候读取并配置,运行过程中做的任何改动都不会生效。
  3、注意各种防火墙对相应端口的屏蔽,比如使用cloudstack平台的朋友,需要在安全组中调整出口、入口规则,允许相关端口数据通过。
  4、带数据库支持的freeradius,中兴和华为BRAS设备的厂商属性(字典文件)需要手动导入数据库。freeradius自带有这两个厂商的字典文件,把内容复制出来,在daloradius的属性导入功能中粘贴并导入即可。
  5、radius和bras对接,radius-ping不通的话,可以使用抓包软件辅助查找问题,PC端可以用wireshark、linux端用tcpdump。PC端测试软件可以用NTRadPing。

2020年6月24日更新:
  限制一号多拨:
  对于单个用户,在radcheck表中对某个用户添加check属性:  Simultaneous-Use:=1。
  对于一组用户,在radgroupcheck表中对某个用户组添加  check属性:Simultaneous-Use:=1。

  限制用户帐号的有效时间(设置账号有效期):
  在radcheck表中对某个用户添加check属性:Expiration:=24 Jun 2025 10:00或者Expiration:=24 Jun 2025,注意时间应为RFC-822格式。

关于限速:
  各个厂家有自己各自不同的限速属性,中兴需要配置下列4个属性:
  ZTE-Rate-Ctrl-Scr-Down
  用户IPv4下行流量保证速率(cir),单位:kbps,
  ZTE-Rate-Ctrl-Scr-Up
  用户IPv4上行流量保证速率(cir),单位:kbps,
  ZTE-Rate-Ctrl-Burst-Max-Down
  用户IPv4下行流量保证令牌桶(cbs),单位:KB。
  ZTE-Rate-Ctrl-Burst-Max-Up
  用户IPv4上行流量保证令牌桶(cbs),单位:KB。
  Mikrotik的ROS要配置如下的属性:
  Mikrotik-Rate-Limit 客户的速率限制。字符串表示,格式为 rx-rate[/tx-rate] [rx-burst-rate[/tx-burst-rate] [rx-burst-threshold[/tx-burst-threshold] [rx-burst-time[/tx-burst-time] [priority] [rx-rate-min[/tx-rate-min]]]]

2020年7月24日更新:
  关于某些BRAS设备和Freeradius对接以后,radacct表没有用户记账数据的解决办法请参考我的这篇文章
  daloradius的日期选择器(主要用在手动添加用户的时候选择用户帐号的有效时间)年份只能选择到当前的年份,当然可以手工填入日期,这只是个非常小的问题,需要改动的朋友,请修改daloradius目录中include/management/目录下的dynamic_attributes.php文件的227行和241行,将drawHelperDateTime()和drawHelperDate()两个函数中结束年份加5(+5),从而增加未来5年的可选择年份,当然也可以自行修改。还有mng_new_quick.php文件的421行,将date(‘Y’,time())改为date(‘Y’,time())+5,也是同样的道理。
  另外radacct中记录的用户各种记账时间为UTC时间,与我们所在地区用的北京时间相差8小时,因为这是RADIUS协议所规定的,为了不引起其他麻烦,我不建议直接修改这个表中的时间为北京时间。如果在daloradius中查看起来不方便,可以修改daloradius的程序,只是让其在web端呈现的时候显示为北京时间即可。

2020年11月17日更新:
  1、如果用户的密码要使用加密格式存储在数据库中(比如MD5-Password),在BRAS/NAS上不能使用CHAP认证协议,因为CHAP认证协议的密码源必须是明文,所以只能使用PAP认证模式。所以如果用户的密码用MD5加密的方式存储在数据库中,拨号被拒绝(Access-Reject),提示错误691,密码设置成明文的时候就可以正常拨号的时候,就需要检查BRAS/NAS的认证模式是否正确了。
  2、用户密码用MD5-Password形式保存的时候,可以是大写的16进制、也可以是小写的16进制,也可以是经过base64编码过的字符串(这里需要注意的是,是对MD5加密后的16进制数据进行base64编码,而不是对加密后的字符串进行编码,这两种编码结果肯定是不相同的)。
比如:
明文密码“passme”经过MD5加密的小写的16进制

MD5-Password:=ba018160fc26e0cc2e929b8e071f052d

经过MD5加密的大写的16进制

MD5-Password:=BA018160FC26E0CC2E929B8E071F052D

以及将16进制数据base64编码过的字符串

MD5-Password:=ugGBYPwm4MwukpuOBx8FLQ==

三者都可以通过认证。
  3、最后推荐一本书《FreeRADIUS Beginner’s Guide》,貌似没有中文版,这本书对radius协议及freeradius介绍还是非常透彻的。

 类似资料: