debian上使用apt-get安装和配置freeradius
目录
Freeradius是一个集中管理的工具,可以用来集中管理vpn的验证,当然就少不了mysql了,因此最合适的是使用lnmp构架了.
freeradius的安装及调试
1、首先先确定本机没有安装radius的任何软件包、以确定干净安装、可以使用dpkg的命令来查看
1 |
dpkg -l | grep radius |
如果返回没有的话就继续下一步、如果存在、使用dpkg -P来把freeradius的程序文件和配置文件完全删除、然后就开始干净的安装freeradius。
2、安装freeradius
安装freeradius之前先要确保已经安装了mysql、因为后来要用到,接下来安装freeradius的部件
1 |
apt-get install freeradius freeradius-ldap freeradius-mysql |
3、调试freeradius
安装完成后freeradius就会自动启动了、由于我们要使用调试模式来启动freeradius、所以先关闭freeradius服务先
1 |
service freeradius stop |
注意:
使用ubtuntu的apt-get方式来安装freeradius的位置会和源码不同、源码安装的默认位置是
/usr/local/etc/raddb/
而使用ubuntu的apt-get方式的配置文件则安置在
/etc/freeradius/
然后修改/etc/freeradius/下的users文件
1 2 3 4 5 6 7 8 9 |
steve Cleartext-Password := "testing" Service-Type = Framed-User, Framed-Protocol = PPP, Framed-IP-Address = 172.16.3.33, Framed-IP-Netmask = 255.255.255.0, Framed-Routing = Broadcast-Listen, Framed-Filter-Id = "std.ppp", Framed-MTU = 1500, Framed-Compression = Van-Jacobsen-TCP-IP |
把这几行反注释、也就是使用一个名为steve、密码为testing的用户来测试一下是否通则登录freeradius服务器、保存后退出然后启动radius的调试模式
1 |
freeradius -X |
然后打开另一个终端、使用radtest来测试用户是否能够通过,这里的测试就是上述的users文件里面的用户名和密码,还没有使用到mysql里面的,后面启用mysql后,这个就无效了,因此这里测试成功后,后面对接mysql完成,就不用管它了
1 |
radtest steve testing localhost 1812 testing123 |
这句前steve和testing代表用户和密码、localhost和1812则是freeradius的IP地址和端口号、testing123则是freeradius服务端与客户端之间通讯的key、由/etc/freeradius目录下的clients.conf定义、在client localhost字段的secret参数
1 2 3 4 5 6 7 |
client localhost { ... ... secret = testing123 ... ... } |
注意这个secret字段最好不要少于8个字节、更多具体的详细说明请看clients.conf文件中secret参数前面的注释说明
adtest成功通过后则会显示Access-Accept状态
另外、如果你一个不好运、确实在linux系统中存在steve的用户、这样子的话freeradius服务器则会跳过你现在的用户配置直接去查询系统的配置、这时的密码就会以系统密码为准、这里在users文件中定义的密码就会失效、而且如果改用户是禁止在linux上登录的话、则会直接把用户打回成 Access-Reject
另外、如果你打算把freeradius的服务器和客户端分开两个服务器来运行、就需要自行在服务器端的client.conf加上客户端的IP地址好通知服务器
1 |
vim /etc/freeradius/client.conf |
如你的freeradius客户端IP是10.0.0.124、那么便要在freeradius服务端的client.conf加上如下内容
1 2 3 4 5 6 |
client 10.0.0.124 { ipaddr = 10.0.0.124 secret = testing123 require_message_authenticator = no nastype = other } |
保存client.conf然后重启服务器、便可以在IP为10.0.0.124的radius客户端来访问服务器了、可以使用radtest命令来测试一下、测试把localhost改成相应的服务器IP地址、
P.S.:如果客户端不具备公网地址或者由于处于某种防火墙之下、会有可能造成访问失败
mysql与freeradius连接
接下来的工作是使用mysql数据库与freeradius连接
1、建立radius数据库
首先要做的就是建立相应的radius数据库、进入mysql
1 |
mysql -u root -p |
然后建立radius数据库
1 |
CREATE DATABASE radius; |
之后使用exit退出mysql、然后建立一系统的表格、freeradius已经自带有sql脚本、我们执行这些脚本就可以自行建立了、首先定位到这些脚本的位置先
1 |
cd /etc/freeradius/sql/mysql |
看见有不少sql文件
1 2 3 4 5 6 7 8 9 10 11 12 |
-rw-r--r-- 1 root root 661 2010-01-04 21:56 admin.sql -rw-r----- 1 root freerad 4543 2010-01-04 21:56 counter.conf -rw-r--r-- 1 root root 1242 2010-01-04 21:56 cui.conf -rw-r--r-- 1 root root 452 2010-01-04 21:56 cui.sql -rw-r----- 1 root freerad 14375 2012-01-31 23:26 dialup.conf -rw-r----- 1 root freerad 14379 2012-01-31 23:25 dialup.conf.bak -rw-r----- 1 root freerad 4058 2010-01-04 21:56 ippool.conf -rw-r----- 1 root freerad 579 2010-01-04 21:56 ippool.sql -rw-r----- 1 root freerad 400 2010-01-04 21:56 nas.sql -rw-r----- 1 root freerad 4318 2010-01-04 21:56 schema.sql -rw-r--r-- 1 root root 1844 2010-01-04 21:56 wimax.conf -rw-r--r-- 1 root root 407 2010-01-04 21:56 wimax.sql |
其中admin.sql可以为mysql建立一个专门管理radius数据库的管理员
schema.sql则是用来建立radius数据库最基本的表格、
其它的sql就不用管先了、是其它附加模块才需要导入的
首先导入admin.sql
1 |
mysql -uUSERNAME -pPASSWD radius < admin.sql |
其中的USERNAME和PASSWD代表mysql管理员的帐户和密码、通常是使用最高权限的root用户来执行、
schema.sql同样也是照此格式来执行导入到数据库、如果结果正常的话、可以使用radius账户进入mysql数据库
1 |
mysql -uradius -p |
默认密码是”radpass”(没有引号)、登录后再查看数据库
1 2 |
use radius; show tables; |
会看到已经建立有相应的表格了、现在就完成了mysql数据库的部署了、之后再去配置freeradius的相关数据
2、配置freeradius
修改/etc/freeradius/radiusd.conf、定位到该行
1 |
$INCLUDE sql.conf |
将之反注释、启动sql.conf
然后编辑/etc/freeradius/sql.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
sql { # # Set the database to one of: # # mysql, mssql, oracle, postgresql # database = "mysql" # # Which FreeRADIUS driver to use. # driver = "rlm_sql_${database}" # Connection info: server = "localhost" #port = 3306 login = "radius" password = "radpass" # Database table configuration for everything except Oracle radius_db = "radius" ... } |
默认情况下、使用apt-get命令来安装freeradius会自动检测到已经安装了mysql而自动把database设置为mysql、如果迩的不是这样显示请设置成mysql、然后再再看password这个参数、如果你之前已经更改了radius用户的密码、这里要做相应的修改、其余的参数就默认好了
修改了sql.conf、再设置相应的设备通知其使用mysql作为数据存储设备
1 |
vim /etc/freeradius/sites-available/default |
把authorize{}字段下的file注释掉、反注释sql、这里的file指的就是usrs文件、将不再把用户信息写在users而使用mysql来存储用户信息
把accounting{} 字段下的sql反注释、启用sql来记录统计信息
把session{}字段下的sql反注释、启用用户同时登录限制功能、这里还需要修改其它地方、一会再说
把post-auth{} 字段的sql反注释、启用用户登录后进行数据记录功能
整个文件如下所示
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 |
authorize { ... ... # files sql ... } ... ... accounting { ... sql ... } ... ... session { radutmp # # See "Simultaneous Use Checking Queries" in sql.conf sql } post-auth { ... sql ... ... } |
如果你之前如我一样启动了启用用户同时登录限制功能、那么接下来还要做这一步
编辑dialup.conf文件
1 |
vim /etc/freeradius/sql/mysql/dialup.conf |
找到这几行、将之反注释
1 2 3 4 5 |
# Uncomment simul_count_query to enable simultaneous use checking simul_count_query = "SELECT COUNT(*) \ FROM ${acct_table1} \ WHERE username = '%{SQL-User-Name}' \ AND acctstoptime IS NULL" |
之后整个对mysql的radius配置就已经完成了
3、测试是否连接成功
之后在radius数据库建立几条用户信息以测试mysql+freeradius的用户认证是否成功
1 2 3 4 5 6 |
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.0'); INSERT INTO radcheck (UserName, Attribute, Value) VALUES ('sqltest', 'Password', 'testpwd'); insert into radusergroup(username,groupname) values('sqltest','user'); INSERT INTO radgroupcheck (GroupName, Attribute, op, Value) values("user", "Simultaneous-Use", ":=", "1"); |
插入后整个数据库表的内容如下,注意:上述插入的用户和组,跟下面的不完全一样,主要看是否存在上述插入的用户和组即可
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 |
mysql> select * from radusergroup; +---------------+-----------+----------+ | UserName | GroupName | priority | +---------------+-----------+----------+ | fredf | dynamic | 1| | barney | static | 1| | dialrouter | netdial | 1| +---------------+-----------+----------+ 3 rows in set (0.01 sec) mysql> select * from radcheck; +----+----------------+--------------------+------------------+------+ | id | UserName | Attribute | Value | Op | +----+----------------+--------------------+------------------+------+ | 1 | fredf | Cleartext-Password | wilma | := | | 2 | barney | Cleartext-Password | betty | := | | 2 | dialrouter | Cleartext-Password | dialup | := | +----+----------------+--------------------+------------------+------+ 3 rows in set (0.01 sec) mysql> select * from radreply; +----+------------+-------------------+---------------------------------+------+ | id | UserName | Attribute | Value | Op | +----+------------+-------------------+---------------------------------+------+ | 1 | barney | Framed-IP-Address | 1.2.3.4 | := | | 2 | dialrouter | Framed-IP-Address | 2.3.4.1 | := | | 3 | dialrouter | Framed-IP-Netmask | 255.255.255.255 | := | | 4 | dialrouter | Framed-Routing | Broadcast-Listen | := | | 5 | dialrouter | Framed-Route | 2.3.4.0 255.255.255.248 | := | | 6 | dialrouter | Idle-Timeout | 900 | := | +----+------------+-------------------+---------------------------------+------+ 6 rows in set (0.01 sec) mysql> select * from radgroupreply; +----+-----------+--------------------+---------------------+------+ | id | GroupName | Attribute | Value | Op | +----+-----------+--------------------+---------------------+------+ | 34 | dynamic | Framed-Compression | Van-Jacobsen-TCP-IP | := | | 33 | dynamic | Framed-Protocol | PPP | := | | 32 | dynamic | Service-Type | Framed-User | := | | 35 | dynamic | Framed-MTU | 1500 | := | | 37 | static | Framed-Protocol | PPP | := | | 38 | static | Service-Type | Framed-User | := | | 39 | static | Framed-Compression | Van-Jacobsen-TCP-IP | := | | 41 | netdial | Service-Type | Framed-User | := | | 42 | netdial | Framed-Protocol | PPP | := | +----+-----------+--------------------+---------------------+------+ 12 rows in set (0.01 sec) |
注意了、这些数据类型的属性值attribute都是特定的字符、不是随随便便自己写上去的、要查看定义这些属性的文件请查看迩当前配置文件的dictionary目录、其实里面也啥内容没定义到、只是写上了路径、一般会写上包含在
$INCLUDE /usr/share/freeradius/dictionary
这里的意思就是整个dictionary文件被放置在这个文件中、其实这个文件也是个路径信息、所以真正定义的dictionary文件是放在/usr/share/freeradius/这个目录、比如Framed-IP-Address属性被定义在dictionary.rfc2865文件中、Cleartext-Password被定义在dictionary.freeradius.internal文件中
然后启动freeradius的调试模式
1 |
freeradius -X |
注意之前的freeradius服务必须先停掉、不然会出现冲突、然后再使用以上用户来测试
如使用fredf用户、密码为wilma
1 |
radtest fredf wilma localhost 1812 testing123 |
返回Access-Accept状态的同时会返回相应reply表格的内容、先返回radreply的用户返回信息、再返回radgroupreply的所属组返回信息、返回成功就表示配置已经正确了。
限制VPN流量的方法
1 |
vim /etc/freeradius/radiusd.conf |
取消注释,
1 |
$INCLUDE sql/mysql/counter.conf |
然后编辑
1 |
vim /etc/freeradius/sql/mysql/counter.conf |
最底行加入
1 2 3 4 5 6 7 8 9 |
sqlcounter monthlytrafficcounter { counter-name = Monthly-Traffic check-name = Max-Monthly-Traffic reply-name = Monthly-Traffic-Limit sqlmod-inst = sql key = User-Name reset = monthly query = "SELECT SUM(acctinputoctets + acctoutputoctets) FROM radacct WHERE UserName='%{%k}' AND UNIX_TIMESTAM(AcctStartTime) > '%b'" } |
上面代码意思是按月进行统计,从数据库的radacct表中,根据用户名(%k)将所有入站和出站流量累加。
时间也是可以自定义的(months、weeks、days、hours),也可以指定具体值,如三天重置一次 “reset = 3 d”
继续编辑
1 |
vim /etc/freeradius/sites-enabled/default |
找到
1 2 3 4 |
authorize { ... } #在 " } " 前面一行加入monthlytrafficcounter |
编辑字典
1 |
vim /etc/freeradius/dictionary |
最底行插入
1 2 |
ATTRIBUTE Max-Monthly-Traffic 3003 integer ATTRIBUTE Monthly-Traffic-Limit 3004 integer |
限制用户组流量SQL操作
1 |
mysql> INSERT INTO radgroupcheck (GroupName, Attribute, op, Value) values("user1", "Max-Monthly-Traffic", ":=", "1024"); |
这里是限制user1这个组,每个月最大流量1024字节
至此,Freeradius的服务端配置告一段落,下面会在另外一篇介绍客户端也就是VPN服务器的配置。
近期评论