小马也要拉大车
——实施低成本宽带接入
江苏 董武
笔者单位为员工家属上网实现宽带接入,一根光纤带着多台PC接入互联网。网关使用SmoothWall搭建的软路由NAT,网关绑定IP和MAC。客户需要到信息中心注册,然后为其分配固定IP地址。这一接入方式简单方便,成本低廉。
低成本实现宽带接入
宽带共享弊端
上述连接方式刚开始,可以较好地满足需求。但近来这种接入方式的弊端日益明显,表现在以下几个方面:
(1)客户新开户或者客户计算机重新安装操作系统,需要设置IP地址及其他相关网络环境,步骤相对烦琐。而如果客户对这些步骤不熟悉,网管员就要亲自为其设置,工作量大。
(2)由于网关绑定了MAC,客户计算机更换或者网卡更换,都要告知网管员重新绑定,缺乏一定的灵活性。
(3)由于是共享光纤上网,为ARP病毒的泛滥提供了可乘之机,一台机器中病毒全网瘫痪的情况时有发生。所谓的“双向绑定”法无法从根本上解决这个问题,而且在管理相对粗放的情况下,这种方法的可操作性也不是很好。每到这个时候,查找“真凶”,登门造访就成了网管员的家常便饭,工作状态相对被动。
(4)缺乏流量控制机制。大量的P2P上传最终会导致全网的流量异常。
总的来说,传统的以太网宽带共享,只解决了“可以上网”的问题,但涉及到“如何更好地上网”,一方面要“少花钱”,一方面要“多办事”,我们需要寻找一个更好的解决方法。
PPPoE拨号服务搭配Radius服务器
经过一段时间的摸索,我们找到了PPPoE拨号服务搭配Radius服务器,这对老搭档可以对宽带接入进行更加精细的管理。客户端只需获得属于自己的用户名和密码,通过PPPoE拨号工具拨号,成功后自动获得IP地址随后接入互联网。
这种方式与大家熟知的电信ADSL宽带拨号在客户端是没有区别的。账号的认证方式采用第三方Radius认证。路由器将账号和密码对发往Radius服务器,服务器安装后端数据库,存储用户的认证信息,客户端通过认证接入网络。网络拓扑图如图1所示。
图1 网络拓扑图
1.硬件需求
硬件的基础要求包括:
(1)路由器(支持PPPoE拨号服务,支持Radius客户端),本文使用的路由器是H3C AR18-22-8。
(2)Radius服务器。为了进一步节省成本,可使用高端PC代替。
2.软件需求
软件的基础要求包括:
(1)Radius服务器采用的系统为Ubuntu 7.04,也可自由选择Linux发布版。需要安装的软件包括:Apache、PHP、MySQL、Freeradius、Freeradius-Dialupadmin。Freeradius是Radius服务器的主程序,Freeradius-Dialupadmin是Freeradius的前端Web管理工具,需要Apache、PHP和MySQL的支持。MySQL用于存储所有的用户认证授权信息和Radius服务器的设置参数。
之所以选择基于Debian的Ubuntu,是因为所有的安装和初始配置可以使用apt-get,方便快捷,且解决软件间依赖关系也相对方便。如果选择从源码安装,也是完全可以的。
(2)客户端安装PPPoE拨号软件。Windows XP中自带了拨号工具。第三方工具如Raspppoe、EnterNet、星空极速等。除了路由器和服务器等硬件资源需要一些费用外,所有的服务端软件都是开源的,只要细心配置,我们完全可以让这些开源软件安全稳定高效地运行起来。
方案优势
这种形式的宽带接入,其优势体现在以下几个方面:
(1)用户记忆自己的账号信息比记忆IP地址等相关配置参数要容易。
(2)取消了MAC地址绑定,增强了灵活性,减少了网管员的工作量。
(3)因为PPPoE连接是在传统的以太网中为各拨号用户分别建立了属于自己的会话,在逻辑上,客户端和网关实现了点到点通信。因此,彻底解决了局域网中ARP病毒的问题。客户计算机就算中了病毒,也无法影响到网中其他的计算机。
(4)可以对PPPoE协议已经绑定的路由器虚拟接口进行限速,重点限制上传流量,避免P2P连接占用过多的网络资源。
如图1所示,整个方案的关键在于配置H3C接入路由器与Radius服务器。
以下一组文章中会出现一些配置参数,如表1所示,后文出现这些数据的时候将不再另行说明。
表1 配置参数
配置H3C接入路由器
本文我们来介绍如何配置H3C路由器,使其支持PPPoE拨号服务,以接受终端客户的拨号请求,同时配置其支持Radius客户端,使其与Radius服务器正常通信。
限于篇幅,笔者省略了对H3C路由器基本WAN、LAN、NAT配置的介绍。关于这些信息的配置方法及路由器配置命令的基础知识,您可以到H3C的网站上下载命令手册。
配置过程见图2。配置命令如下:
图2 配置流程
1.创建虚拟模板,配置PPPoE拨号服务
<h3c>system-view [h3c]interface Virtual-Template 2 [h3c-Virtual-Template2] ppp authentication-mode chap do- main jiashu [h3c-Virtual-Template2]ppp ipcp dns 61.147.37.1 61.177.7.1 [h3c-Virtual-Template2]ip address 2.2.2.1255.255.255.0 [h3c-Virtual-Template2]remote address pool 2 [h3c-Virtual-Template2]quit [h3c]interface Ethernet1/0 [h3c-Ethernet1/0]pppoe-server bind Virtual-Template 2 [h3c-Ethernet1/0]quit
2.创建Radius方案
[h3c]radius scheme adsl [h3c-radius-adsl]primary authentication 192.168.0.2 [h3c-radius-adsl]primary accounting 192.168.0.2 [h3c-radius-adsl]accounting optional [h3c-radius-adsl]key authentication xzjiashuqu [h3c-radius-adsl]key accounting xzjiashuqu [h3c-radius-adsl]quit
3.创建ISP域并配置相关属性
[h3c]domain jiashu [h3c-isp-jiashu]scheme radius-scheme adsl [h3c-isp-jiashu]access-limit enable 130 [h3c-isp-jiashu]accounting optional [h3c-isp-jiashu]ip pool 2 2.2.2.2 2.2.2.150 [h3c-isp-jiashu]quit
4.QoS限速
[h3c] qos carl 1 source-ip-address range 2.2.2.2 to 2.2.2. 254 per-address [h3c] qos carl 2 destination-ip-address range 2.2.2.2 to 2.2. 2.254 per-address [h3c]interface Virtual-Template 2 [h3c-Virtual-Template2] qos car inbound carl 1 cir 256000 cbs 256000 ebs 256000 green pass red discard [h3c-Virtual-Template2] qos car outbound carl 2 cir 2048000 cbs 2048000 ebs 2048000 green pass red discard [h3c-Virtual-Template2]quit [h3c]save
其中,61.147.37.1、61.177.7.1为客户端拨号成功后绑定的DNS地址,2.2.2.2-2.2.2.150为客户端拨号成功后绑定的IP地址,需根据实际情况进行调整。
注意
PPPoE协议(以太网上的点对点协议),将以太网和PPP协议结合,通过PPPoE技术和宽带调制解调器,我们就可以实现高速宽带网的个人身份验证访问,为用户创建虚拟拨号连接,实现高速连接到Internet。
配置Radius服务器
本文的主旨是Radius服务器的配置,有针对性地介绍FreeRadius的配置、FreeRadius-Dialupadmin的配置,以及Radius服务器的数据库备份。
配置FreeRadius
FreeRadius是一个开源的Radius Server,在Linux中搭建Radius服务,这是我们可以选择的性价比最高的软件。如果要了解更多的信息,请参考http://www.freeradius.org。
使用root用户(注意不是Linux系统的root用户)连接MySQL数据库。然后添加数据库用户“radiuser”,设定密码,创建数据库“radius”并设置“radiuser”用户对“radius”数据库的访问权限。
利用FreeRadius自带的数据库模板初始化“radius”数据库,笔者所安装的系统中,这个数据库模板是/usr/share/doc/freeradius/examples/mysql.sql.gz,解压缩后,在shell中执行以下命令初始化数据库:
mysql -u radiuser -p 12345 radius < mysql.sql
FreeRadius所有配置文件默认存放于/etc/freeradius目录中,配置文件中关于SQL模块默认是基于MySQL的,因此除非您选用其他数据库,否则保持默认即可。修改所涉及到的具体配置文件有clients.conf、radiusd.conf、sql.conf,“#”后为注释。
1.修改配置文件clients.conf
编辑clients ipaddress{}区块(“ipaddress”为Radius客户端的IP地址,这里为192.168.0.1)
secret=xzjiashuqu #Radius服务器的认证/授权/计费报文的共享密钥 shortname=Nas #设置Radius客户端别名 nastype=other #设置Radius客户端类型,默认为“other”
2.修改配置文件radiusd.conf
log_auth=yes #在日志中记录认证请求信息 log_auth_badpass=yes #在日志中记录被拒绝的口令 log_auth_goodpass=no #不在日志中记录通过的口令
编辑authorize {}区块,去掉“auth_log”前的注释,去掉“sql”前的注释。
编辑accounting{}区块,在“radutmp”前加上“#”把这一行注释掉,表示把判断重复登录的过程交给mysql数据库。去掉“sql”前的注释。
编辑session{}区块,去掉“sql”前的注释。
编辑post-auth{}区块,去掉“sql”前的注释。
3.修改配置文件sql.conf
编辑sql{}区块 server="localhost" #数据库安装在本地 login="radiuser" #连接用户 password="12345" #连接密码 radius_db="radius" #要连接的具体的Radius数据库
查找“Authorization Queries”,将所有关于大小写敏感的查询语句注释掉,使大小写不敏感。
查找“Accounting Queries”,将其下若干行SQL语句前的注释去掉。
查找“Simultaneous Use Checking Queries”,将其下若干行SQL语句前的注释去掉。
基本的文件配置结束后,还需对数据库进行设置。连接数据库“radius”,如表2所示在数据库中添加如下记录。
表2中“Simultaneous-Use”字段设置为“1”,这样同一用户同一时间不能重复登录。
设置完后,在Ubuntu系统中,切换到目录/etc/init.d/,执行“./freeradius start”,如果没有错误,FreeRadius就成功运行了。当然,如果您需要调试FreeRadius,那么执行“/usr/sbin/freeradius -X ”后,会有详细的输出用于调试或排错。
表2(a)在数据库中添加记录(数据表radgrou pcheck)
表2(b)在数据库中添加记录(数据表radgrou preply)
配置FreeRadius-Dialupadmin
FreeRadius-Dialupadmin是一个用PHP编写的FreeRadius Server的Web管理工具,其界面如图3所示。
图3 FreeRadius-Dialupadmin界面
由于是基于Web的程序,我们首先需要配置Apache。FreeRadius-Dialupadmin的主文件放置在/usr/share/freeradius-dialupadmin/目录,我们现在只需要关注其中的htdocs目录,即/usr/share/freeradius-dialupadmin/htdocs/,在Apache的Web主目录中建立此目录的一个软链接,ln -s /usr/share/freeradius-dialupadmin/htdocs/var/www/htdocs/dialup。因为FreeRadius-Dialupadmin默认没有任何访问控制措施,我们需要借助Apache对其实施基本的访问控制。
在shell中执行“htpasswd -c/etc/apache2/htpasswd-m adm-inistrator password”,“administrator”是用户名,“password”是密码。编辑Apache的配置文件apache2.conf,添加以下内容:
<Directory/var/www/htdocs/dialup> AuthName"Restricted Area" AuthType Basic AuthUserFile/etc/apache2/htpasswd require user administrator </Directory>
除了FreeRadius已经创建的“radius”数据库中已经存在的数据表外,FreeRadius-Dialupadmin也需要另外建立四个表,分别是“badusers”、“mtotacct”、“totacct”和“userinfo”。当然,安装好FreeRadius-Dialupadmin后,我们已经有了四个表的模板文件,导入即可。在Ubuntu中,它们都在/usr/share/FreeRadius-Dialupadmin/sql/目录中,切换shell到其中,执行以下命令:
mysql-u radiuser-p 12345 radius<badusers.sql mysql-u radiuser-p 12345 radius<mtotacct.sql mysql-u radiuser-p 12345 radius<totacct.sql mysql-u radiuser-p 12345 radius<userinfo.sql
下面我们可以对FreeRadius-Dialupadmin的配置文件进行设置,路径是/etc/freeradius-dialupadmin/。涉及到的具体配置文件有admin.conf、naslist.conf。
1.配置admin.conf
general_charset:gb2312 #设置网页中显示的字符编码 general_domain:jiashu #设置ISP域 general_radius_server_auth_proto:chap #认证方式为chap general_encryption_method:clear #认证口令保存为明文 sql_type:mysql sql_server:localhost sql_port:3306 sql_username:radiuser sql_password: 12345 sql_database:radius #连接数据库的部分环境变量 sql_debug:true #打开debug模式,在网页中显示详细的SQL语句,便于我们 对程序进行调试或者排错。注释掉此选项后显示正常的界面 counter_default_daily:none counter_default_weekly:none counter_default_monthly:none #用户计费没有任何时间限制
2.配置naslist.conf
nas1_model: H3C AR1822-8 #NAS的型号,可以自行设置 nas1_ip: 192.168.0.1 #NAS的IP地址
Radius服务器数据库备份
笔者编写了简单的备份脚本,将脚本加入到cron中,每周二、四、六凌晨一点脚本运行,备份数据库到指定目录(/var/databack/),备份目录只保留最新的四个备份文件。如脚本保存为/bin /backdata.sh,在/etc/crontab文件中加入一行“0 1 * * 2,4,6 root /bin/backdata.sh”。
backdata.sh脚本代码如下:
#!/bin/bash cd/var/databack f_num=`ls|wc-l` if[$f_num-eq 4];then ls>/tmp/temp.log delete_f=`cat/tmp/temp.log|sort-rn|tail-1` rm-f$delete_f rm-f/tmp/temp.log fi back_f=`date+%F|awk-F-'{print$1$2$3}'` mysqldump -u radiuser --password=12345 --lock-all-tables radius>/var/databack/${back_f}.sql
Radius与PPPoE
想让“小马”拉“大车”,很显然离不开PPPoE拨号服务及Radius服务。理论基础即PPPoE协议和Radius协议。关于这两个协议,读者可以参考RFC文档自行攻关。这里,笔者结合自己的理解,给大家一个基本的介绍。
PPPoE协议使用Client/Sever方式,将PPP报文封装于传统的以太网帧中,在以太网上提供点到点的连接。PPPoE连接的建立分为两个阶段,第一是Discovery阶段。客户端通过识别接入端的MAC地址,建立PPPoE Session ID。这个Session ID便是这一个PPPoE连接维持期间内的唯一标识。第二是PPP Session阶段。PPP报文作为PPPoE帧的净负荷封装在以太网帧中发送。在这个阶段中,连接双方任何一方都可以发送PPPoE Active Discovery Terminate报文通知对方结束本次连接。
Radius协议是AAA管理框架中的一种非常重要的认证授权计费方式,Radius也是基于Client/Server模型的。通常,路由器作为Radius客户端,负责传输用户信息到特定的Radius服务器,然后根据从服务器返回的信息进行相应的处理。如接入或者挂断连接,Radius服务器负责接收用户的连接请求,认证用户,给路由器返回所有需要的信息。
Radius服务器支持多种方法来对用户进行认证,如基于PPP的CHAP、PAP,基于UNIX的Login。另外,Radius协议定义了UDP/1812为认证端口,定义了UDP/1813为计费端口。
方案的改进与提高
看完前面的内容,您也许在某些方面仍感困惑,请继续阅读以下几点:
(1)H3C路由器的配置、Radius服务器的配置过程相对复杂,对于基础的背景知识,文章没有涉及,没有说明为什么这样做。感兴趣的读者可自行参考相关资料后再进行操作。
(2)介绍FreeRadius-Dialupadmin时,仅仅是配置Apache支持普通的HTTP协议,其实在笔者的实际应用中,采用了更加安全的HTTPS协议来传输Web信息。
(3)为进一步加强Radius服务器的访问安全,笔者设置了简单的iptables包过滤防火墙,默认的入口过滤策略为DROP并且控制TCP/443、TCP/22(SSH)、UDP/1812、UDP/1813只接受指定IP地址。
(4)判断客户是否重复登录等一系列认证授权计费信息,完全是基于Radius服务器数据库,而不是通过Radius服务器和NAS接入路由器之间的SNMP。这时如果Radius服务器偶然死机,数据库中的所有客户信息都保持了死机前的状态,这样,用户再次登录时,会被误认为已经登录而拒绝登录。对这个问题,可以通过运行FreeRadius-Dialupadmin提供的脚本来解决。笔者采取的办法是,修改FreeRadius-Dialupadmin源程序,将批量修改、删除radacct中相关用户信息的代码整合进来。
(5)本方案所有客户端都是无限时上网,如果有计费限时的需求,需要深入挖掘甚至自己编写代码定制FreeRadius- Dialupadmin的功能,这样才能够满足我们的特定需求。