en
×

分享给微信好友或者朋友圈

使用微信“扫一扫”功能。
目录 contents

    摘要

    本文针对如何有效管理天生桥一级水电开发有限责任公司水力发电厂(以下简称“天一电厂”)WIFI用户问题,天一电厂设计开发了一套基于MAC地址认证的无线管理系统。本文就设计思路、借助的开发平台及如何开发进行了描述。开发的系统不仅有效的帮助了天一管理员对无线终端用户的管理,还大大提高了天一电厂的网络安全性。

    Abstract

    This article is about how to effectively manage tianyidianchang WIFI users.Tianyidianchang Designed and developed a wireless management system based on MAC address authentication.This article describes the design ideas, the development platform and how to develop it.The developed system not only effectively helped Tianyi administrators manage wireless terminal users, but also greatly improved the network security of Tianyi Power Plant.

    大型水电厂基于WiFi认证系统开发及应用

  • 前言

    天生桥一级水电开发有限责任公司水力发电厂(下文简称“天一电厂”)位于珠江流域红水河上游的南盘江上,地处广西、贵州、云南三省(区)交界,是我国红水河水电资源梯级开发的龙头电站,国家“八五计划”的重点建设项目,“西电东送”工程南线的骨干电站。电厂共安装4台300兆瓦水轮发电机组,总装机容量1200兆瓦。设计年发电量52.26亿千瓦•时,水库总库容102.57亿3

    2001年11月18日,天生桥一级水电开发有限责任公司水力发电厂(简称天一电厂)挂牌成立,在天一公司领导下负责电站的生产运行管理。历经十多年的运行发展,截至2018年12月31日,天一电厂固定资产净值约45亿元,在职员工198人,累计发电约844亿千瓦•时,实现连续安全生产5923天,上缴税费33多亿元。先后荣获国家电力公司“双文明单位标兵”、中国电力企业联合会“全国优秀电力企业”、广东省“五一劳动奖状”等多项荣誉。

  • 1 开发实施背景

    随着无线网络信息技术的快速发展,无线网络成为天一电厂办公不可缺少的网络。随着无线WIFI覆盖区域的增加,天一电厂无线用户呈爆发式增长,在线并发无线用户数由原来的50多个,增加到现在300来个。

    无线网络的应用面增大了,但无线安全管理仍停留在原有的基础上,即只需提供无线接入密码WPA/WPA2进行认证就可进入天一电厂无线网络。如何有效的管理天一电厂无线用户?如何构建天一电厂无线网络安全空间?成了天一电厂迫切要解决的问题。

  • 2 设计思路

    总所周知,MAC地址是网络设备中不变的物理地址,如同我们身份证上的身份证号码,具有全球唯一性,基于MAC地址的接入控制就成了最直接、最有效的控制手段。天一电厂采用了基于MAC地址认证,来加强无线WiFi终端接入的安全。

    天一电厂采用了两套不同厂商(思科与华为)的无线WiFi系统,对于所有无线接入设备,都需在两套WIFI系统中增加MAC地址。但无线控制器增加本地MAC地址存在一定的上限(上限值为1024条记录)。当无线控制器设备中的MAC地址数量超出上限,新终端MAC地址将无法增加,只有删除无线控制器设备中现有的MAC地址。但无线控制器上现有的MAC地址无法与用户进行关联,无法从无线控制器设备中获得哪些MAC地址最近使用过,只能够随机删除。如何解决这一难题?天一电厂采用了开源的Freeradius+Mysql进行了开发。

  • 3 系统开发环境部署

  • 3.1 前端环境

    前端环境需求采用Linux+Apache+Mysql+PHP,此组合是Linux中运行PHP环境较常见的组合。此组合优点为:安全性能好,防御功能强大,性能高,可扩展性强。

    ThinkPHP是一个开源的PHP框架,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的,能够解决应用开发中的大多数需要。

  • 3.2 后端radius部署

    后端服务采用开源的freeradius系统进行搭建。Freeradius是一个模块化、高性能并且功能丰富的一套Radius程序,包含服务器、客户端(radius client)、开发库和一些额外的相关radius工具

  • 3.3 数据库

    Radius认证系统采用Mysql数据库,Mysql是最流行的关系数据库系统,在WEB应用方面也是最好应用软件之一。天一电厂通过在Mysql数据库中增加相应的字段,来实现更多可自定的功能及需求。增加的字段有:

    (1)终端最后一次认证时间

    (2)终端与用户的关系

    (3)认证成功与失败日志

    (4)用户无线WiFi流量排名

    (5)用户及终端信息的添加与删除

  • 3.3.1 数据库创建

    在mysql数据库中创建radius用户及radius数据库,创建命令如下:

    CREATE DATABASE IF NOT EXISTS radius DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

    CREATE USER 'radius'@'localhost';

    SET PASSWORD FOR 'radius'@'localhost' = PASSWORD('radpass');

    GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost' WITH GRANT OPTION;

    FLUSH PRIVILEGES;

  • 3.3.2 数据库导入

    将freeradius文件夹下的mysql数据库文件导入至radius数据库中,导入后默认表及表功能定义如下:

    (1)radcheck 用户检查信息表

    (2)radreply 用户回复信息表

    (3)radgroupcheck 用户组检查信息表

    (4)radgroupreply 用户组回复信息表

    (5)radusergroup 用户和组关系表

    (6)radacct 计费情况表

    (7)radpostauth 认证后处理信息,可以包括认证请求成功和拒绝的记录

    radius数据库存放于mysql数据库中,radius数据库下的所有表结构均可按照用户的需求进行调整。这为后期前端页面开发过程中实现查看当前在线用户数、记录终端MAC地址最后上线的时间等功能,需要修改radius数据库对应表的相关字段,提供了便捷。

  • 3.4 在线用户数查看

    在无线终端进行认证时,radius服务器会收到三种状态Start(开始)、Interim-Update(临时更新)、Stop(停止)。通过三种状态值则可以判断当前终端的实时状态,知道当前所有用户在线情况。

  • 3.5 如何获取终端认证日志信息

    通过修改/usr/local/etc/raddb/mods-config/sql/main/mysql/queries.conf文件,将Acct-Status-Type的状态值写入radacct的Status字段中,以获取存储状态值。

    在修改时需要注意,各种状态下的sql语句均需要进行增加。增加完成后在mysql中查看radacct表的状态如下:

  • 3.6 如何快速获取当前终端状态

    由于radacct表为记帐表,同一个终端在该表中会存在多条信息,为了更快更方便的获得当前终端的状态值,我们将该状态值传递至一个MAC地址唯一的表中进行存储,以方便后期查询使用。在radcheck表中存有终端MAC地址的唯一信息,将radacct表由来自radius协议写入过来的记账数据时,通过mysql自带的触发器,将该状态信息更新至radcheck表中。

    CREATE TRIGGER `radacct_insert_after_on_radcheck` AFTER INSERT ON `radacct`

    FOR EACH ROW IF (UPPER(NEW.Status) = UPPER('Start')) THEN

    UPDATE radcheck

    SET online = '1'

    WHERE UPPER(username) = UPPER(new.username);

    ELSEIF (UPPER(NEW.status) = UPPER('Interim-Update')) THEN

    UPDATE radcheck

    SET online = '1'

    WHERE UPPER(username) = UPPER(new.username);

    ELSEIF (UPPER(NEW.Status) = UPPER('Stop')) THEN

    UPDATE radcheck

    SET online = '0'

    WHERE UPPER(username) = UPPER(new.username);

    END IF

    CREATE TRIGGER `radacct_update_after_on_radcheck` AFTER UPDATE ON `radacct`

    FOR EACH ROW IF (UPPER(NEW.Status) = UPPER('Start')) THEN

    UPDATE radcheck

    SET online = '1'

    WHERE UPPER(username) = UPPER(new.username);

    ELSEIF (UPPER(NEW.status) = UPPER('Interim-Update')) THEN

    UPDATE radcheck

    SET online = '1'

    WHERE UPPER(username) = UPPER(new.username);

    ELSEIF (UPPER(NEW.Status) = UPPER('Stop')) THEN

    UPDATE radcheck

    SET online = '0'

    WHERE UPPER(username) = UPPER(new.username);

    END IF

    注:通过radcheck查看的效果如下图所示:

    在radcheck表的online字段中,0表示离线、1表示在线,通过执行select count(*) from radcheck where online = 1 SQL语句则能够统计出当前所有在线用户数。

  • 3.7 如何记录终端MAC地址最后上线的时间

    随着智能终端设备的普及,越来越多的智能终端将通过无线连入天一电厂网络,那认证系统中将存放越来越多的终端用户信息。如何及时清除僵尸无线终端,天一电厂WiFi认证系统开发的另一重点在统计无线终端最后一次上线的时间,以来查询近3个月或6个月未上线的终端,并进行删除。

    radpostauth表是存放认证后的处理信息,包括认证请求成功和拒绝的记录及对应的时间(如下图所示)。

    在上表的reply字段中,有Access-Accept与Access-Reject两种状态,Access-Accept表示该终端认证成功,Access-Reject表示该终端认证失败。通过获取Access-Accept的状态,将对应的authdate字段内的认证时间更新至radcheck对应的记录以获取无线终端最近上线时间。

    实现方式为:首先在radcheck表中创建lastlogintime字段,用于存储radpostauth传递过来的日期,再radpostauth通过mysql的触发器去更新radcheck表中的lastlogintime字段值。

    触发器代码编写如下:

    CREATE TRIGGER `t_after_on_radcheck` AFTER INSERT ON `radpostauth`

    FOR EACH ROW IF (UPPER(NEW.reply) = UPPER('Access-Accept')) THEN

    UPDATE radcheck SET lastlogintime = new.authdate

    WHERE UPPER(username) = UPPER(new.username);

    END IF

    通过以上开发,radius认证系统已满足天一电厂WiFi认证需求。实现了思科无线控制器、华为无线控制器的统一认证,实现了当前各终端的状态(在线、离线)的记录、无线终端最后一次认证的时间等功能。

  • 4 前台管理界面开发

    freeradius的部署后仅为radius服务,供各无线终端进行认证。在管理radius认证数据需要直接操作数据库,不方便天一电厂管理人员维护。天一电厂通过PHP开发语言进行了前端认证管理界面的开发。

  • 4.1 在前端认证界面中需要实现如下功能

    (1)查看各服务的运行状态(Apache、Mysql、Radius);

    (2)统计当前在线用户数

    (3)统计本季度上线的用户数

    (4)统计当前使用无线的流量排名

    (5)用户终端的添加、修改、删除

    (6)查看认证日志

    (7)NAS设备的添加、修改、删除

  • 4.2 认证系统管理界面如下图所示

  • 5 认证系统优点

    2017年年底,天一电厂完成了基于MAC地址认统无线管理系统的开发,2018年年初正式投入了使用。经过一年的运行,此认证系统运行稳定、操作简单,安全性高,大大减少了天一电厂管理员工作量,提高了天一电厂网络的安全性。此认证系统推广性也非常强,适合所有单位的无线管理。目前此认证管理系统仅用于无线的认证管理,在后期天一电厂将有线终端也接入至该认证系统,以实现网络的统一管理和维护。

  • 5.1 部署简单

    此WiFi认证系统对服务器硬件资源要求较低。天一电厂采用的1颗两核CPU、4G内存、100G硬盘服务器来部署认证系统。管理员通过成熟的LNMP脚本快速部署了Apache+MySql+PHP。利用yum工具快速安装了freeradius认证服务。经过一年的运行,认证系统运行稳定,使用情况良好。

  • 5.2 成本低

    此认证系统服务器采用的CentOS操作系统,CentOS是linux操作系统,目前是免费的。Freeradius为开源软件,开发人员可借助此开源软件进行需求的开发,也无需购买此软件。LNMP脚本已较成熟,可在网上免费下载。

  • 5.3 管理方便

  • 5.3.1 维护量小

    天一电厂认证服务器采用的虚拟服务器,虚拟服务器相对实体服务器维护工作本来都要少很多。服务器操作系统是CentOS操作系统,CentOS是一款可靠性高、兼容性强、生命周期长的操纵系统,需要维护的工作非常少。

  • 5.3.2 登录便捷

    管理界面录采用B/S结构,B/S最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件,只要有一台能上网的电脑就能使用,客户端零安装、零维护。因此管理员只需通过浏览器即可完成大部分维护工作。

  • 5.3.3 操作简单

    管理员通过可视化界面简单操作即可完成增减用户工作,无需对无线控制器做任何操作,如下图所示:

    (增加用户)

    (增加用户)

  • 5.4 统计功能强

    可通过姓名、部门、状态、登录时间等了解wifi用户信息,大大提高了管理员的效率。

    我们也可统计出实时在线终端数、近1个月与近3个月的在线时长、当前或当月终端流量排行等。若需统计更多信息,我们可在mysql数据库增加相应的字段即可完成。

  • 5.5 安全性高

    天一电厂原无线WiFi通过一个SSID就可以访问天一电厂网络(内部和互联网),为了增加其网络安全性,将无线SSID由一个分为两个。一个为内网SSID,可以访问天一电厂任何网络,认证方式采用MAC地址+WPA/WPA2密码认证。另一个SSID为Guest,仅能够访问互联网。任何一个需进入天一电厂内网的设备,必须经过管理员在认证系统进行MAC地址认证,保证了无线终端的可控性和可信性,从而也保证了网络的安全性。无线网络结构示意图如下图所示:

天生桥一级水电开发有限责任公司水力发电厂
贵州省
兴义市

CREATE DATABASE IF NOT EXISTS radius DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

CREATE USER 'radius'@'localhost';

SET PASSWORD FOR 'radius'@'localhost' = PASSWORD('radpass');

GRANT ALL PRIVILEGES ON radius.* TO 'radius'@'localhost' WITH GRANT OPTION;

FLUSH PRIVILEGES;

html/zyyxdh/20190919002/media/1c4cd38b-30e8-4a78-902e-a53adfffe54d-image001.png

CREATE TRIGGER `radacct_insert_after_on_radcheck` AFTER INSERT ON `radacct`

FOR EACH ROW IF (UPPER(NEW.Status) = UPPER('Start')) THEN

UPDATE radcheck

SET online = '1'

WHERE UPPER(username) = UPPER(new.username);

ELSEIF (UPPER(NEW.status) = UPPER('Interim-Update')) THEN

UPDATE radcheck

SET online = '1'

WHERE UPPER(username) = UPPER(new.username);

ELSEIF (UPPER(NEW.Status) = UPPER('Stop')) THEN

UPDATE radcheck

SET online = '0'

WHERE UPPER(username) = UPPER(new.username);

END IF

CREATE TRIGGER `radacct_update_after_on_radcheck` AFTER UPDATE ON `radacct`

FOR EACH ROW IF (UPPER(NEW.Status) = UPPER('Start')) THEN

UPDATE radcheck

SET online = '1'

WHERE UPPER(username) = UPPER(new.username);

ELSEIF (UPPER(NEW.status) = UPPER('Interim-Update')) THEN

UPDATE radcheck

SET online = '1'

WHERE UPPER(username) = UPPER(new.username);

ELSEIF (UPPER(NEW.Status) = UPPER('Stop')) THEN

UPDATE radcheck

SET online = '0'

WHERE UPPER(username) = UPPER(new.username);

END IF

media/1c4cd38b-30e8-4a78-902e-a53adfffe54d-image002.pngalternativeImage/1c4cd38b-30e8-4a78-902e-a53adfffe54d-F002c.pngmedia/1c4cd38b-30e8-4a78-902e-a53adfffe54d-image002.png
html/zyyxdh/20190919002/media/1c4cd38b-30e8-4a78-902e-a53adfffe54d-image003.png
html/zyyxdh/20190919002/media/1c4cd38b-30e8-4a78-902e-a53adfffe54d-image004.png

CREATE TRIGGER `t_after_on_radcheck` AFTER INSERT ON `radpostauth`

FOR EACH ROW IF (UPPER(NEW.reply) = UPPER('Access-Accept')) THEN

UPDATE radcheck SET lastlogintime = new.authdate

WHERE UPPER(username) = UPPER(new.username);

END IF

html/zyyxdh/20190919002/media/1c4cd38b-30e8-4a78-902e-a53adfffe54d-image005.png
html/zyyxdh/20190919002/media/1c4cd38b-30e8-4a78-902e-a53adfffe54d-image006.png
html/zyyxdh/20190919002/media/1c4cd38b-30e8-4a78-902e-a53adfffe54d-image007.png
html/zyyxdh/20190919002/media/1c4cd38b-30e8-4a78-902e-a53adfffe54d-image008.png
html/zyyxdh/20190919002/media/1c4cd38b-30e8-4a78-902e-a53adfffe54d-image009.png
html/zyyxdh/20190919002/media/1c4cd38b-30e8-4a78-902e-a53adfffe54d-image010.png
html/zyyxdh/20190919002/media/1c4cd38b-30e8-4a78-902e-a53adfffe54d-image011.png

image /

无注解

无注解

通过radcheck查看的效果如下图所示:

无注解

无注解

无注解

无注解

无注解

无注解

无注解

无注解

无注解

无注解