红帽RHEL5U4平台实现pppoe+freeradius+mysql认证服务器

时间:2023-02-11 19:27:59

原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://ourlinux.blog.51cto.com/274624/389145


软件需求: 
        红帽自带的:rp-pppoe,ppp,freeradius,freeradius-mysql,mysql,mysql-devel,mysql-server,openssl。 
        另需:freeradius-2.1.3以及ppp2.4.4的源代码包。 
有一点要说明,freeradius需要openssl 库,所以如果系统里没安装的话,还是要事先安装一下的。
第一部分:实现简单的pppoe拨号服务 
        
检查系统上的rp-pppoe以及ppp软件是否安装,命令: 
        #rpm -q rp-pppoe ppp 
        如果安装则会有显示软件包的名称,若未安装,找到安装盘上的相关rpm包安装。 


配置 /etc/ppp/options  
lock
crtscts
nobsdcomp
nodeflate
nopcomp
 然后配置/etc/ppp/pppoe-server-options文件,内容为: 
# PPP options for the PPPoE server 
# LIC: GPL
auth require-chap default-mru default-asyncmap lcp-echo-interval 60 lcp-echo-failure 5 ms-dns 202.106.0.20 noipdefault noipx nodefaultroute proxyarp noktune logfile /var/log/pppd.log
        
        文件内容不做解释,可以通过man pppd查寻相关帮助。此时pppoe服务器从/etc/ppp/ chap-secrets文件中读取验证的用户名和密码信息,此文件格式为: 

        # Secrets for authentication using CHAP 
        # client        server        secret                        IP addresses 
       aaa       *        aaa               * 

        想要多添加用户,再加入新行即可。 
        
然后可以启动pppoe服务了,命令是: 
        
# pppoe-server -I eth1 -L 10.0.0.64 -R 192.168.0.5 -N 10
  我简单介绍一下这条命令中的各个参数的意思。
  I:指定响应PPPOE请求的端口,本例中是在eth1口上。
  L:PPPOE服务器的IP地址,这是客户端所填的PPPOE服务器的地址。
  R:这是分配给客户端的地址池起始地址,本例中从192.168.0.5开始
  N:地址池的IP地址递增几个,本例中添增10,也就是从192.168.0.5开始,到192.168.0.14结束。

  可以看出我们在LINUX中将以上步骤都完成了,也就是说PPPOE服务准备好了,客户端PPPOE拨号,顺利的话就可以拨号成功了。

  当然现在客户端还不能上网,因为PPPOE服务器还没有启用NAT,我们用IPTABLES软件来实现,写一个这样的脚本即可:
  echo "1" >> /proc/sys/net/ipv4/ip_forward
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o wan -j SNAT --to 10.0.0.65
  第一行的作用是启用IP转发,第二行是启动IPTABLES进行NAT转换,下面是对各个参数的解释
  -t nat表示进行NAT转化
  -s 192.168.0.0/24表示源地址为192.168.0.0/24这个网段
  -j SNAT --to 10.0.0.65表示将源地址都转化成10.0.0.65这个外网地址
  启动NAT以后,这台PPPOE服务器就功能完整了,客户端不仅可以拨通服务器,拨通后还可以上网。

        注:红帽自带的pppoe服务器,在RHEL5至RHEL5U2的版本上与系统的syslog服务有冲突。可现关闭syslog服务,让pppoe服务器正常运行。 

 
第二部分:让pppoe服务使用freeradius服务器进行验证 

 1)首先更改/etc/ppp/pppoe-server-options,添加一行设置: 
# PPP options for the PPPoE server 
# LIC: GPL
auth require-chap default-mru default-asyncmap lcp-echo-interval 60 lcp-echo-failure 5 ms-dns 202.106.0.20 noipdefault noipx nodefaultroute proxyarp noktune plugin         /usr/lib/pppd/2.4.4/radius.so radius-config-file /etc/ppp/radiuds/radiusclient.conf logfile /var/log/pppd.log

        表示让pppoe-server在运行时加入pppd的radius查检,可以让pppoe服务通过freeradius来验证和记账。添加此行之后,可以创建/etc/ppp/radiuds/目录,创建完之后,我们需要使用一下ppp的源代码,因为红帽没有给我们提供相应的配置文件。解压ppp的源代码目录: 
      #wget ftp://ftp.samba.org/pub/ppp/ppp-2.4.4.tar.gz
        #tar xvfz ppp-2.4.4.tar.gz 
        #cd ppp-2.4.4 
        #cd pppd/plugins/radius/etc/ 
        #cp * /etc/ppp/radiuds/ 
 2) 
这个目录下有我们需要的所有相关的配置文件,其中最重要的是/etc/ppp/radiuds/radiusclient.conf,我们先打开此文件配置,其内容为(已去掉注释): 
auth_order      radius
login_tries     4 login_timeout   60 nologin /etc/nologin issue   /etc/ppp/radiuds/issue authserver      localhost:1812 acctserver      localhost:1813 servers         /etc/ppp/radiuds/servers dictionary      /etc/ppp/radiuds/dictionary login_radius    /usr/local/sbin/login.radius seqfile         /var/run/radius.seq mapfile         /etc/ppp/radiuds/port-id-map default_realm radius_timeout 10 radius_retries 3 login_local     /bin/login
        
 3) 
另外,还需更改此目录下的servers文件,此文件用来指定读取的radius服务器的主机名称以及key值(需要在freeradius配置中指定)。
编辑 /etc/ppp/radius/servers ,设定radius 服务器的位置 
localhost 123 // 这里的123是我前面设置的nas(localhost)访问radius服务器的密码
4) 编辑/etc/ppp/radius/dictionary ,修改一些路径设置,主要是最后一个dictionary.microsoft 的路径设置 INCLUDE /etc/ppp/radiuds/dictionary.microsoft #INCLUDE /etc/ppp/radiuds/dictionary.ascend #INCLUDE /etc/ppp/radiuds/dictionary.merit #INCLUDE /etc/ppp/radiuds/dictionary.compat
5) 此时pppoe服务已经可以通过radius认证了。然后进行freeradius的配置。 
        首先检查freeradius是否安装: 
        
#rpm -q freeradius freeradius-mysql 
        其中freeradius-mysql包使用来让freeradius连接mysql数据库的,本部分还用不到。 
        
首先打开/etc/raddb/clients.conf配置客户端访问控制,文件内容如下: 
        client 127.0.0.1 { 
                secret                = 123 
                shortname        = localhost 
                nastype     = othe 
        } 

        
表示客户端之允许从127.0.0.1的ip登录radius服务,并且需要验证的secret为123,就是在上面的servers文件中需要配置的信息。若要实现可以从别的机器访问,请参考注释获得帮助。 

6)  然后配置naslist文件,内容为: 

        # NAS Name                Short Name        Type 
        #----------------        ----------        ---- 
        #portmaster1.isp.com        pm1.NY                livingston 
        #portmaster2.isp.com        pm1.LA                livingston 
        localhost                local                portslave 

        此文件用来配置记录有哪些指定的nas服务器需要使用radius进行记账。现在指定的是localhost。 

 7) 主控配置文件是radiusd.conf,目前没有需要改的,可通过注释学习其中配置方法。此文件主要是用来指定freeradius服务器默认的验证和记账方式。我们目前使用本地的文件方式,就是/etc/raddb/users文件,在其中添加我们需要提供给pppoe服务认证的用户信息,内容如下(用户名前面一定不能有空格): 
aaa   Auth-Type := Local, Simultaneous-Use := 1, User-Password == "aaa" 
                     Service-Type = Framed-User, 
                      Framed-Protocol = PPP, 
                      Framed-IP-Address = 192.168.0.8, 
                      Framed-IP-Netmask = 255.255.255.255 

        其中Simultaneous-Use := 1字段用来设置每个用户同时登录的个数。所有字段信息都在freeradius的源代码中有文档给予解释。另外要注意,添加的用户字段应写在文件DEFAULT字段前面添加,否则可能不会生效。 
8) 为了让radius能正确地调用mysql,还要指定一下库的位置: 
echo /usr/lib >> /etc/ld.so.conf
ldconfig
9) 都配置完毕后,可以通过radiusd -X命令以排错方式启动,此时再启动pppoe-server,用客户端拨号验证一下,检查pppoe服务是否成功通过freeradius来验证用户。如果成功,这一部分完成。可通过 service radiusd restart来正常启动radius服务。

radiusd -X 
radtest aaa aaa localhost 0 123 
看到 Access-Accept 之类的字样就表示OK了。 这时可以正式启动radiusd  (未完)


第三部分:配置freeradius从mysql数据库读取用户信息 
1) 首先更改/etc/raddb/radiusd.conf,首先将$INCLUDE  ${confdir}/sql.conf字段这行原有的注释去掉,然后编辑/etc/raddb/radiusd.conf 使其支持mysql认证; 
authorize {
preprocess
chap
mschap
suffix
sql
...
}
accounting {
...
#radutmp (因为我要使用Simultaneous-Use:=1(同一用户一次只能登陆一台机器),用它在radiusd意外结束会有问题,所以禁用)
sql
...
}
session {
        #radutmp (同上)
        sql
}
2)需要更改sql.conf中的设置,主要是设置读取的mysql服务器的相关信息,可更改如下一些字段: 

        driver = "rlm_sql_mysql"
server = "localhost"                                                 #数据库服务器 
       login = "mysql_username"                                       #数据库用户 
       password = "mysql_password"                                 #数据库密码 
        radius_db = "radius"                                                #数据库名称 

3) 当然前提是你要现把mysql服务设置好,设置方法是:
先处理一下mysql的库,freeradius默认查找libmysqlclient_r.so,可是mysql默认为libmysqlclient.so,内容完全一样,做个链接即可:(至关重要,否则启动freeradius的时候会提示找不到rlm_sql_mysql.so:Could not link driver rlm_sql_mysql: file not found)
        # echo "/usr/lib/mysql" >> /etc/ld.so.conf
        # ldconfig
        # cd /usr/lib/mysql/
        # ln -s libmysqlclient.so.15.0.0 libmysqlclient_r.so
        先启动你的mysqld: 
                service mysqld start 
        然后设置root帐户密码: 
                mysqladmin –uroot –p password 12345 
        创建radius数据库 
                mysqladmin –uroot –p123456 create radius 
        
        建立mysql的数据库raius的表,我们可以通过软件已经给出的sql脚本导入数据库: 
                mysql -uroot –p123456 radius < /usr/share/doc/freeradius-1.1.3/examples/mysql.sql 
        这样,所有radius需要的数据库和表都已经建立好了。 
        此时可以添加测是帐号来测试是否正常工作。具体方法就不在这说了。我们待会要使用freeradius源代码自带的dialup_admin来进行数据库的管理工作,那是一个基于web的管理界面,使用php编写,要比直接用sql语句方便的多。 
        这里要注意的是,如何在数据库里添加限制没用户同时登录个数的限制,比如,我先用sql语句添加一个测试用户,然后来限制他的登录个数,语句是: 
mysql -uroot –p123456 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-Protocol','=','ppp');
insert into radgroupcheck (groupname, attribute, op, value) values ('user', 'Auth-Type', ':=', 'Local');
insert into radgroupcheck (groupname, attribute, op, value) values ('user', 'Simultaneous-Use', ':=', '1');
然后加入用户信息:
insert into radcheck (username,attribute,op,value) values ('bbb','User-Password','==','bbb');
然后把用户加到组里:
insert into usergroup(username,groupname) values('bbb','user');
        这样就给我们的数据库中添加了一个帐户测试帐户bbb,并让bbb帐户属于user组。 
        然后我们可以通过设置user组的检查属性来设置此组帐户的登录数限制,以后只要用户加入这个组,登录数都不能超过1次: 

        好了,限制完成。我们现在可以使用bbb帐户登录,并测试是否是通过mysql数据库验证的。并且可以检查是不是只能登录一个。 

第四部分:使用dialup_admin来管理radius服务器 

        服务器搭建成功后如果需要web管理,freeradius自带了一个web管理程序dialup_admin。 
        首先测试Apache与PHP安装的正确性。Apache的WEB目录在 /var/www/html 下首先测试Apache,在浏览器输入 Http://127.0.0.1 下看到Apache界面表示正常。 
        编辑一个PHP测试文件,内容为  ,保存为 phpinfo.php。在浏览器输入Http://127.0.0.1/phpinfo.php 看到php相关信息页面,表示php运作正常。 
        直接将freeradius源代码中的dialup_admin/文件夹全部拷贝到Apache网页目录下/etc/local下。 
        修改dialup_admin/conf/下的admin.conf文件中的如下参数: 
                sql_type:mysql 
                sql_server:localhost                    //sql地址 
                sql_port:3306                         //默认端口 
                sql_username:root 
                sql_password:123456                   //密码 
                sql_database:radius                     //数据库名 

                general_base_dir: /var/www/html/dialup_admin //dialup_admin主目录
general_radiusd_base_dir: /usr/sbin/radiusd
                general_domain: company.com     //这个可改也可不改,没什么影响,改了还看点而已 
                general_radius_server_auth_proto: chap   //将pap改成chap 
                general_encryption_method: clear        //将crypt改成clear 
        说明一下,general_encryption_method: clear是必须得改的,否则用web管理界面添加用户后会出现密码被加密后无法识别导致认证失败,clear方式是以明文存储密码,freeradius默认是用明文存储密码,两者要对应,所以这里要用clear方式。 
        修改dialup_admin/conf/下的naslist.conf文件如下 
                nas1_name: nas1.%{general_domain} 
                nas1_model: Computer                 //NAS服务器的类型 
                nas1_ip: 192.168.1.1                 //NAS服务器的IP地址 
                nas1_port_num: 15 
                nas1_community: public 
        其他的通通删掉或用#号注释掉,这样修改的目的是方便在web管理界面中直观的看到每个NAS服务器连接用户的情况。 
        导入相关数据库表 
                cd /var/www/html/dialup_admin/sql 
                mysql -uroot –p123456 radius < userinfo.sql 
                mysql -uroot –p123456 radius < totacct.sql 
                mysql -uroot –p123456 radius < mtotacct.sql 
                mysql -uroot –p123456 radius < badusers.sql 
        dialup_admin用的是php3格式的文件,需要web服务器支持这种格式, 
        修改/etc/httpd/conf/httpd.conf文件,在此文件最后添加 
                AddType application/x-httpd-php .php .html .htm .php3 
        并在默认的主页目录下建立一个指向/usr/local/dialup_admin/htdocs的符号连接htdocs 
        保存后重启httpd服务 
                service httpd restart 
访问:http://localhost/htdocs/index.html 
        能正常打开各页面就ok了。默认是打开的sql调试模式。可以在admin.conf中找到sql_debug.把true改为false即可关闭。
  第五部分:使用用户认证来管理radius服务器 Apache服务器已经内置用户验证机制,大家只要适当的加以设置,便可以控制网站的某些部分要用户验证。大家只要跟着我一步步做下来就应该能轻松实现用户验证。   第1步:   我们在/var/www/html/dialup_admin/htdocs   然后我们编辑httpd.conf   添加 Alias /radiusadmin "/var/www/html/dialup_admin/htdocs" <Directory "/var/www/html/dialup_admin/htdocs"> Options Indexes MultiViews AllowOverride AuthConfig #表示进行身份验证 Order allow,deny Allow from all </Directory>   #AllowOverride AuthConfig 表示进行身份验证 这是关键的设置   第2步   在/var/www/html/dialup_admin/htdocs创建.htaccess文件 vi /var/www/html/dialup_admin/htdocs/.htaccess AuthName "radius web" AuthType Basic AuthUserFile /var/www/html/dialup_admin/htdocs/.htpasswd require valid-user #AuthName 描述,随便写 #AuthUserFile /var/www/html/dialup_admin/htdocs/.htpasswd #require valid-user 或者 require user admin 限制是所有合法用户还是指定用户   #密码文件推荐使用.htpasswd,因为apache默认系统对“.ht”开头的文件默认不允许外部读取,安全系数会高一点哦。   第3步   就是创建apache的验证用户   htpasswd -c /var/www/html/dialup_admin/htdocs/.htpasswd radiusadmin   #第一次创建用户要用到-c 参数 第2次添加用户,就不用-c参数   如果你们想修改密码,可以如下 htpasswd -m .htpasswd radiusadmin   第4步:   ok,重启apache服务,然后访问 http://10.0.0.64/radiusadmin就能看到一个用户验证的弹出窗口,只要填入第4步创建的用户名和密码就行   后话,为了服务器的性能,一般不推荐使用AllowOverride AuthConfig或者AllowOverride ALL,因为这会使服务器会不断的去寻找.htaccess,从而影响服务器的效能,一般我们把一些后台管理界面或者其他特殊目录可能需要加验证这个需求。 至此,整个Radius服务器搭建完成。