freeradius+mysql为华为防火墙做vpn用户验证
我们公司有VPN用户几百个,最初把用户名都设置在防火墙中,管理起来非常不方便,容易出错。上网找了些资料(在此对作者表示感谢),经过一番设置,把VPN用户认证转移到外部radius服务器上。这么做的好处有:
1、安全性高,不需要登陆防火墙就可以完成用户管理;
2、管理大量用户方便、可查询、添加、删除
3、可记录VPN用户的登录时间,传送字节数,从而对用户进行统计;
4、可在数据库中添加字段,记录VPN用户的相应中文名及其他信息。
5、节省防火墙的有限内存
radius服务器除了可以对VPN用户进行认证外,还可以对FTP、telnet等用户认证,各位有兴趣可以研究一下。
简单网络结构: 防火墙-3层交换机-linux主机
防火墙内网接口IP:192.168.80.2 ,经过一个3层交换机,linux主机连接在内网ip是:192.168.30.130
一、安装linux服务器
版本:RHAS3 U3
安装时选择定制安装,“服务”中选上“SQL”关于mysql的部分,“开发工具”全选上,其他任选。
二、安装freeradius服务:
版本:freeradius-1.1.1
下载:
1、 安装
freeradius需要openssl 库,所以如果系统里没安装的话,请先安装
# tar zxvf freeradius-
# cd freeradius-1.1.1
# ./configure
# make
# make install
默认装完后freeradius各相关目录:
配置文件:/usr/local/etc/raddb
执行文件:/sbin/radiusd
dictionary:/usr/local/share/freeradius/dictionary.
在mysql中导入radius表所需sql语句目录:/usr/local/share/doc/freeradius/examples/mysql.sql)
2、 配置
1) 修改 clients.conf
# vi /usr/local/etc/raddb/clients.conf
在最后增加如下几行:
client 127.0.0.1 { ;增加本地帐户,测试radius是否工作正常
secret = 123456 ;本地连接radius的密码
shortname = localhost
nastype = other
}
client 192.168.80.2 { ;增加防火墙连接radius的接口地址
secret = mymingya ;防火墙连接radius的密码
shortname = sec100f
nastype = other
}
2) 修改naslist
# vi /usr/local/etc/raddb/naslist
在最后加入一行:
192.168.80.2 sec100f other ;加入防火墙nas
3) 编辑users
# vi /usr/local/etc/raddb/users
在文本最后加入用户rhh: (这个用户是保存在文本文件里的,做测试用)
rhh Auth-Type:=local,User-Password==123456
Service-Type = Framed-User,
Framed-Protocol = PPP,
Framed-IP-Address =
Framed-IP-Netmask = 255.255.255.0
4) 启动radiusd,测试radiusd服务:
# /sbin/radiusd –X & (加上&在后台运行,便于下面测试命令执行)
# /sbin/radtest rhh 123456 localhost 0 123456
如果有类似 Access-Accept的字样出现,则表示radius开始工作了。
三、安装配置mysql数据库
版本:mysql-server-3.23.58.1
1、 安装
RHA3U3默认不安装mysql-server,而且找遍disk1-4也没有找到这个安装包,只能在红旗4.1安装盘的disk2中找到mysql-server-3.23.58.1.i386.rpm
#rpm –ivh mysql-server-3.23.58.1.i386.rpm
自动创建mysqld服务。
启动:#service mysqld start
停止:#service mysqld stop
重启:#service mysqld restart
2、 配置:
启动mysql;更改mysql的root用户密码为“tdrwx”;
#service mysqld start
更改密码的3种方法:
a、命令行更改:#mysqladmin –u root –password “tdrwx”
如果root已经有密码了:#mysqladmin –u root –p password “tdrwx”
b、用set password修改口令:
#mysql –u root –p
mysql> set password for root@localhost=password('tdrwxt');
c、直接修改user表的root用户口令:
#mysql –u root –p
mysql> use mysql;
mysql> update user set password=password('tdrwx') where user='root';
mysql> flush privileges;
四、建立radius和mysql的联系
1、 创建radius数据库
#mysqladmin –u root –p create radius ; 注意:磁盘空间不足回导致建库失败!!!
2、 导入radius数据表:
# cd /usr/local/share/doc/freeradius/examples/
# mysql -u root -p radius < mysql.sql ;(“<” “>”不要搞错了!)
radius数据库中有2个表需要注意:
radcheck:存放用户名和密码的表,以后在这儿添加VPN用户名和密码
radacct:计费信息,以后自动记录VPN登录的时间和收发数据的统计信息
3、 编辑 radius.conf 使其支持mysql认证
# vi /usr/local/etc/raddb/radiusd.conf
authorize {
preprocess
chap
mschap
suffix
sql 将前面#号去掉
...
}
accounting {
...
sql 将前面#号去掉
...
}
4、 编辑 sql.conf ,使radius可以访问mysql
# vi /usr/local/etc/raddb/sqlconf
sql {
driver = "rlm_sql_mysql"
server = "localhost"
login = "root"
password = "mysql的密码" ;mysql的root用户的密码
radius_db = "radius" ;刚才创建的数据库名
5、 向数据库里增加一些数据;
# /usr/local/mysql/bin/mysql -u root -p radius
先加入一些组信息:
insert into radgroupreply (groupname,attribute,op,value) values ('user','Auth-Type',':=','Local');
insert into radgroupreply (groupname,attribute,op,value) values ('user','Service-Type','=','Framed-User');
insert into radgroupreply (groupname,attribute,op,value) values ('user','Framed-IP-Netmask','=','255.255.255.255');
insert into radgroupcheck (groupname, attribute, op, value) values ("user", "Auth-Type", ":=", "Local");
然后加入第一个用户信息:
insert into radcheck (username,attribute,op,value) values ('rhh','User-Password','==','123456');
然后把用户加到组里:
insert into usergroup(username,groupname) values('rhh','user');
6、 测试radius和mysql的连接:
重启mysql:#service mysqld restart
启动radius:
# /sbin/radiusd –x & ;以debug模式运行radius
# /sbin/radtest rhh 123456 localhost 0 123456 ;用mysql中的帐号测试
出现 Access-Accept 之类的字样就表示radius和mysql之间的连接正常。
这时可以正式启动radiusd:
# ps –aux |grep radiusd ;查询radius进程号
# kill -9 xxxxx ;根据进程号,杀掉radius进程
# /sbin/radiusd & ;正式启动
五、配置华为防火墙
以下按照最简单配置来实现,更多选项请参考防火墙操作手册。
前提:关于L2TP的基础配置不详细说了。我们新建一个L2TP group,用radius来认证和计费。
1、 配置AAA认证方案
[MY] radius scheme vpnuser ;创建AAA方案名“vpnuser”
[MY-radius-vpnuser] primary authentication 192.168.30.130 ;认证主服务器IP
[MY-radius-vpnuser] primary accounting 192.168.30.130 ;计费主服务器IP
[MY-radius-vpnuser] accounting optional ;允许计费,即使计费失败也不会挂断用户
[MY-radius-vpnuser] key authentication mymingya ;与radius服务器连接密码,即前面在“/usr/local/etc/raddb/clients.conf”文件中设置的“secret”字段值
[MY-radius-vpnuser] key accounting mymingya ;与上行一样
[MY-radius-vpnuser] user-name-format without-domain
最后一行表示用户名不带域名后缀发送给radius服务器:
例如vpn用户名为rhh,则发送给radius服务器的用户名也是rhh。在mysql中设置用户名时,也只需要输入rhh即可。
如果不配置最后一行,则发送给radius服务器的用户名将是rhh@domain格式的。在mysql中设置用户名时,需要输入rhhrhh@domain。
2、 创建ISP域
[MY] domain test ;创建一个域“test”
[MY-isp-test] scheme radius-scheme vpnuser ;关联到AAA认证方案“vpnuser”
[MY-isp-test] ip pool 98 10.0.98.2 10.0.98.250 ;为vpn用户分配ip地址
3、 新建一个虚模版
[MY] interface Virtual-Template 98 ;创建虚模版98
[MY-Virtual-Template98] ppp authentication-mode chap domain test ;关联到域“test”
[MY-Virtual-Template98] ip address 10.0.98.1 255.255.255.0
[MY-Virtual-Template98] remote address pool 98 ;vpn用户地址
4、 虚模版加入firewall zone
[MY] firewall zone untrust
[MY-zone-untrust] add interface Virtual-Template 98
5、 增加一个L2TP组
[MY]l2tp-group 98
[MY-l2tp98]allow l2tp virtual-template 98 remote group98 ;关联到虚模版98
六、测试VPN用户登录
1、 在mysql的radius数据库的radcheck表中加入用户名和密码
2、 用vpn客户端软件登录
3、 radius认证成功后将开始计费,用户挂断后计费停止
登录成功的关键:
防火墙中各项配置正确;
linux主机和防火墙通讯正常;
linux中radius服务已启动;
linux中mysql服务已启动;
mysql的radius数据库中radcheck表中已添加用户名和密码;
上面各项都没有问题的话,认证计费将没有问题。
附加功能:
每次添加用户都要登录到mysql中会很麻烦,而且也不利于查询等操作。我们可以充分利用数据库的有利条件,用PHP或asp开发前台页面用来管理VPN用户,同时可以扩充数据库内容,加入更多的VPN用户的信息:例如“姓名”、“开通时间”、“关闭时间”等,使我们管理用户更方便。
其他主机要连接mysql数据库,需要创建连接用户:
1、配置mysql,允许运行其他的主机连接数据库
例如:允许192.168.30.0/24网段的主机用用户名“rhh”,密码“tdrwx”访问mysql;
#mysql –u root –p
mysql> grant all privileges on *.* to rhh@'192.168.30.0/255.255.255.0' identified by 'tdrwx' with grant option;
2、mysql数据库的备份
a、 mysql默认将数据文件放在/var/lib/mysql/目录下,我们只要将整个目录复制保存既可。
b、 正规操作:
备份:
mysqldump-制作整个数据库的一个备份:
# mysqldump -u root -p --opt radius > radius-back.sql
恢复:
mysqldump导出的是完整的SQL语句,用mysql客户程序很容易就能把数据导入了:
# mysqladmin -u root -p create radius ;建库
# mysql -u root -p radius < radius-back.sql ;从备份的sql语句导入
3、ASP连接mysql
a、安装mysql-connector-odbc-
b、set conn = server.createobject("adodb.connection")
strconnection="driver={mysql odbc 3.51 driver};database="radius";server="192.168.30.130";uid="rhh";password="tdrwx"
conn.open strconnection
sql="select * from radcheck "
Set rs=Server.CreateObject("ADODB.Recordset")
rs.Open sql,conn,2,3