网管员世界2009超值精华本
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

小马也要拉大车

——实施低成本宽带接入

江苏 董武

笔者单位为员工家属上网实现宽带接入,一根光纤带着多台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的功能,这样才能够满足我们的特定需求。