freeradius+mysql为华为防火墙做vpn用户验证
时间:2007-02-05 来源:murong
把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-1.1.1.tar.gz
# 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 = 10.0.0.2,
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 [email protected]/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语句导入