2021年11月

一、安装FreeRadius
以CentOS7.9为例,用yum安装

yum install freeradius freeradius-utils -y
systemctl enable radiusd
systemctl start radiusd

需要放开防火墙的1812和1813的udp端口,这里有个坑,启动radiusd的时候可能会报错,可以用radius -X来启动调试模式看一下错误信息,如果提示:

Failed reading certificate file "/etc/raddb/certs/server.pem" 
Permission denied

这个是因为radius的编译脚本有点小bug,导致/etc/raddb/certs/目录下的一些文件权限600设的不够,改成644权限就可以了。
修改/etc/raddb/clents.conf,在client localhost上面添加

client all_client {
    ipaddr = 0.0.0.0/0
    secret = secret2021
    require_message_authenticator = no
}

secret是共享密钥。
二、安装daloRadius和配置FreeRadius
1.安装MariaDB不再赘述,创建radius数据库

mysql>create database radius;
mysql>grant all on radius.* to radius@localhost identified by "radpass"; 
mysql>exit;

2.导入radius表

mysql -u root radius < /etc/raddb/mods-config/sql/main/mysql/scheama.sql

共导入了7个表,分别是:
radcheck 用户检查信息表
radreply 用户回复信息表
radgroupcheck 用户组检查信息表
radgroupreply 用户组检查信息表
radusergroup 用户和组关系表
radacct 计费情况表
radpostauth 认证后处理信息,可以包括认证请求成功和拒绝的记录。
3.建立组信息:(在此新建组名称为H3C)

insert into `radgroupreply` (`id`, `groupname`, `attribute`, `op`, `value`) values('1','H3C','Huawei-Exec-Privilege',':=','3');
insert into `radgroupreply` (`id`, `groupname`, `attribute`, `op`, `value`) values('2','H3C','Service-Type',':=','Login');
insert into `radgroupreply` (`id`, `groupname`, `attribute`, `op`, `value`) values('3','H3C','Login-Service',':=','Telnet');

注意,老版本的H3C交换机的reply属性是Huawei-Exec-Privilege,新版本的已经变更为Exec_Privilege,参见https://www.h3c.com/cn/d_201708/1023166_30005_0.htm#_Ref224994526
4.建立用户信息:(在此新建用户名为test,密码为testpwd)

insert into radcheck (username,attribute,op,value) values ('test','Cleartext-Password',':=','testpwd');

5.将用户加入组中:

insert into radusergroup (username,groupname) values ('test','H3C'); 

6.修改 FreeRADIUS中的mysql 认证配置

cd /etc/raddb/mods-enabled
ln -s ../mods-available/sql

7.修改 FreeRADIUS中的mysql 配置文件
该配置文件位于/etc/raddb/mods-available目录,名称为sql
可以通过vi来修改,命令如下:

vi /etc/raddb/mods-available/sql

找到driver = “rlm_sql_null”这一行,修改为driver = “rlm_sql_mysql”,找到dialect = "sqlite"改成dialect = "mysql",在这行下面的Connection info修改radius的mysql登录信息,取消前面的行注释,然后保存并退出。
8.安装daloRADIUS和nginx、php不再赘述,注意:php需要gd库和php-pear(php74-php-pear)

yum install php74-php-pear
php74-pear install db
php74-pear channel-update pear.php.net

9.导入daloRADIUS的数据库
注意:/home/daloradius/为假设你的daloradius的安装目录

cd /home/daloradius/contrib/db
mysql -uradius -pradpass radius < ./mysql-daloradius.sql
mysql -u root -p radius < fr2-mysql-daloradius-and-freeradius.sql

10.设置daloRADIUS的数据库连接
具体操作可以查看INSTALL文档。
11.nginx配置不再赘述
配置完成后,通过浏览器就可以访问daloRADIUS的管理界面,第一次登录的用户是administrator,密码是radius。如果生产环境使用的话一定要修改以下密码,这个用户的信息在表operators里面。
三、配置H3C交换机
1.首先通过console口登录交换机,执行以下命令

radius scheme yourname
primary authentication 172.20.68.225
primary accounting 172.20.68.225
key authentication cipher $c$3$kbh9Ex7mC6yftMzlDevC1EYKiOvNO7vxhWsN
key accounting cipher $c$3$HbzbEM/xUnYjN/IgTvmGYI5rfSzavhjf5nQj
user-name-format without-domain
quit

domain yourname
authentication default radius-scheme yourname
authorization default radius-scheme yourname
accounting default radius-scheme yourname
quit

domain default enable yourname

注意:key部分,是radius的共享密钥,在radius服务器的/etc/raddb/clients.conf里有配置。
2.开启ssh或telnet不赘述,但是,不需要再添加local-user了
以上完成后,就可以开始测试了,如果有问题,可以先关闭radius服务,在radius的调试模式下进行。

radiusd -X

在调试模式下,可以看到详细的连接情况和错误信息
注意:华为华三交换机一定要在radreply表添加以下信息才能登录并获取最高权限

id    username    attribute    op    value
1    test    Huawei-Exec-Privilege    :=    3
2    test    Service-Type    :=    Login
3    test    Login-Service    :=    Telnet

四、一些常见的错误
1.daloradius提示Unknown column ‘acctupdatetime’ in ‘field list’错误,并且无法连接vpn、无法查看在线用户
查看日志显示如下信息

rlm_sql_mysql: MySQL error ‘Unknown column ‘acctupdatetime’ in ‘field list”

解决方法如下:
删除radacct表 并重新建立

mysql -u radius -p

输入密码
在sql中执行如下语句

use radius;
DROP TABLE radacct;
CREATE TABLE radacct (
  radacctid bigint(21) NOT NULL auto_increment,
  acctsessionid varchar(64) NOT NULL default '',
  acctuniqueid varchar(32) NOT NULL default '',
  username varchar(64) NOT NULL default '',
  groupname varchar(64) NOT NULL default '',
  realm varchar(64) default '',
  nasipaddress varchar(15) NOT NULL default '',
  nasportid varchar(15) default NULL,
  nasporttype varchar(32) default NULL,
  acctstarttime datetime NULL default NULL,
  acctupdatetime datetime NULL default NULL,
  acctstoptime datetime NULL default NULL,
  acctinterval int(12) default NULL,
  acctsessiontime int(12) unsigned default NULL,
  acctauthentic varchar(32) default NULL,
  connectinfo_start varchar(50) default NULL,
  connectinfo_stop varchar(50) default NULL,
  acctinputoctets bigint(20) default NULL,
  acctoutputoctets bigint(20) default NULL,
  calledstationid varchar(50) NOT NULL default '',
  callingstationid varchar(50) NOT NULL default '',
  acctterminatecause varchar(32) NOT NULL default '',
  servicetype varchar(32) default NULL,
  framedprotocol varchar(32) default NULL,
  framedipaddress varchar(15) NOT NULL default '',
  PRIMARY KEY (radacctid),
  UNIQUE KEY acctuniqueid (acctuniqueid),
  KEY username (username),
  KEY framedipaddress (framedipaddress),
  KEY acctsessionid (acctsessionid),
  KEY acctsessiontime (acctsessiontime),
  KEY acctstarttime (acctstarttime),
  KEY acctinterval (acctinterval),
  KEY acctstoptime (acctstoptime),
  KEY nasipaddress (nasipaddress)
) ENGINE = INNODB;

systemctl restart radiusd