基于routercli的dosnipe防火墙终端控制本科论文.docx
《基于routercli的dosnipe防火墙终端控制本科论文.docx》由会员分享,可在线阅读,更多相关《基于routercli的dosnipe防火墙终端控制本科论文.docx(30页珍藏版)》请在冰豆网上搜索。
基于routercli的dosnipe防火墙终端控制本科论文
基于routercli的DOSNIPE防火墙终端控制
刘亮亮
(自动化与电气工程学院指导教师:
邵世凡)
摘要:
随着科技的不断发展,越来越多人感觉到网络已经成为生活中不可或缺的一部分了。
人们通过网络来购物,通过网络来进行交易,通过网络来进行转帐,等等。
但随之而来的就是网络安全问题。
是的,网络安全已经成为现今计算机领域的一大主题,而在所有的网络安全产品中,防火墙就当之无愧的稳当霸主地位。
为了极大限度的发挥防火墙的功效,对防火墙进行各种配置,状态查看就成为必然。
比如,设置ip地址,设置过滤规则,设置保护主机;查看主机流量,查看攻击种类,
查看系统日志等等。
而选择合适的控制手段将会大大提高防火墙的防御能力,虽然WEB页面控制具有非常直观的用户交互界面,但还需加上终端控制手段方能如虎添翼。
routercli就是一款操作简单,而功能强大的控制终端.本文从其产生背景,应用领域,使用方法,以及项目部署等各个方向对其进行详细描述.
关键词:
网络安全;防火墙;routercli
Abstract:
Withthedevelopmentoftechnology,moreandmorepeoplecan’tlivewithoutnetworking.Theydoshopping,makebusinessdeal,transferaccountsthroughnetwork.However,Itinvokesthenetworkingsecurityproblem,whichisveryharmful.Yes,networkingsecurityhasbecomeoneofthehottesttopicincomputerarea,anditgoeswithoutsayingthatFirewallproducthasestablishedthehegemonyinallofthenetworksecurityproducts.
Itbecomesnecessarytodokindsofconfigurationsandinspecttherunningstatusforfullyplayingtheperformanceoffirewall.Suchassettingipaddress,filterrules,protectedhostsandinspectingflows,typesofattacking,systemlogsandsoon..Underthissituation,itwillgreatimprovethedefenseabilityoffirewall,aslongasyouchooseapropercontrolstrategy.although
WEB-basedcontrollinghasafriendlyuserinterface.,Terminal-basedcontrollingshouldbeaddedasaappurtenance.
RouterCliisapowerfulcontrolterminal.Thisarticledescribesitindetailfromitsbackground,applicationarea,usage,projectdeploymentandthelike.
Keywords:
NetworkSecurity;Firewall;routercli
1前言
网络的出现,极大的便利了人的生活.现在人们可以在网上进行购物,登陆到网上银行
进行业务管理,当然还能够在网络上开辟一片属于自己的空间.
但是,如果以上的操作被某个心怀不轨的黑客所介入的话,那么你就要当心了!
你可能在进行购物的时候,将资金汇入到别人的帐户;当你试图登陆网上银行的时候,却提示你密码错误,而这个密码你是那么的熟悉;当你要访问自己的网上空间时却老是出现拒绝服务!
如果出现上述现象的话,那么,你极有可能遭到别人的攻击,换句话说,网络已不安全.在这个时候,各种形式的防火墙应运而生,比如防病毒感染的,防垃圾邮件的,防流氓软件的,防DOS/DDoS的.而DOS/DDoS攻击由于其独特性,至今国内还没有一款能够彻底解决此类攻击的防火墙产品,国内做的比较出色的主要是绿盟的黑洞防火墙,金盾防火墙,冰盾防火墙,当然还有Dosnipe防火墙,在理想状态下可以抵抗800M的流量攻击。
DOSNIPE就是一款针对于DOS/DDoS攻击的硬件防火墙,而本文的routercli是为其量身定做的控制终端.
Routercli主要被应用于路由器的终端控制中,在防火墙还没有得到普及。
由于它内置了许多针对于路由器的控制命令,所以在防火墙里需要加入许多与防火墙匹配的控制命令。
本文讨论的问题就是针对DOS/DDoS防火墙的终端控制.
在毕业设计阶段,项目主管分配此项任务之后,我根据要求,制定项目进度表。
并负责所有的编码工作,在编写程序的过程中,出现了许多问题,但通过各种调试手段最终攻克各种难关,程序已经可以进行控制,查询等操作了。
2DOS/DDoS攻击介绍
所谓知己知彼方能百战百胜,要有效的防护DOS/DDoS攻击的话,首先就得熟悉它的原理!
2.1DOS/DDoS攻击原理
DOS是DenialOfService的缩写,意为:
拒绝服务攻击.而DDoS是DistributedDenialofService的简写,意为分布式拒绝服务攻击.两者的目的只有一个:
就是让你的服务器停止对外提供服务.
2.2DOS攻击
DOS攻击其实是一对一的攻击方法,它说白了就是单挑,攻击者通过发送大量的数据包
来攻击你的机器,如果你的机器性能较差的话,那么就极可能瘫痪.比如攻击者一秒钟发1000个数据包给你,而你一秒却只能处理100个,那么你的cpu将会非常的忙碌,最终还可能停止响应.当然,随着科技的飞速发展,现在服务器的硬件配置一般都比较高,所以DOS攻击基本上不会造成系统瘫痪,但也不可小觑.
2.3DDoS攻击
DDoS攻击是在传统的DOS攻击的基础上建立起来的.比如1对1的情况下你能够处理10000个数据包,那么攻击者以1000个数据包的DOS攻击将不会对你造成影响.但是,有没有考虑到这种情况,那就是攻击者同时发动10台机器以同样的速率来进行攻击,那么情况又会有所不同了,如果用100台呢?
结果可想而知.而DDOS就是采用很多的傀儡机来进行大规模的攻击.它看起来象"群欧".
随着网络的不断发展,黑客所使用的傀儡机的范围也就更广,但在低速网络时代,黑客只会选择附近的机器作为傀儡机,因为经过的路由少,效果会更好.
下面来看看它的步骤(见图1-1):
(图1-1:
DDoS攻击模型)
I.首先,攻击者从自己的机器(client)出发,找到几个管理松散的站点,并且通过入侵手段取得此机器的控制权(handler).
II.其次,依照同样的方法,再次寻找有安全漏洞的机器(Agent),取得控制权之后,再植入daemon程序,潜伏在系统之中,等待Handler发来的控制命令,发动攻击.这些daemon程序一般都有发送大量数据包的能力,并且能够隐藏IP地址,使得难以追查攻击源.
III.发动攻击,这是最后一步,攻击者只要在登陆到(handler)机器上键入控制命令,Agent就会疯狂的向受害机发动大规模的进攻.他们可能会监控攻击的效果,最常用的方法就是不停的向被攻击主机发送ping包,如果还能够响应的话,就会继续加大攻击力度(见下面一个攻击程序控制终端).
被攻击的现象:
*被攻击的主机上充斥着大量等待的tcp连接
*网络上充斥着大量无用的,源地址为假的数据包
*制造高流量无用数据,造成网络拥塞,使受害主机无法正常和外界通讯
*利用受害主机提供的服务或传输协议上的缺陷,反复高速的发出特定的服务请求,使受害主机无法及时处理所有正常请求
*严重时出现死机
3LINUX开源项目
3.1开源项目
LINUX是opensource(开源的),这就意味着LINUX的核心代码都可以从网络上免费获得,最著名的就是:
www.kernel.org.而linux的发布是在GNU/GPL许可证下发布的,这是一种copyleft的版权机制,意为:
无版权.对应于常见的copyright(版权).你可以在GPL许可证的保护或约束下修改源代码并进行发布,但在发布的时候要明确修改点,且允许别人再度修改.不仅其内核本身,在linux操作系统下的绝大多数应用软件都是开源的,你都可以对其进行二度开发.而routercli正是这样一款基于GPL的应用软件.
3.2Routercli
3.2.1简介
Routercli是一个Cisco-like的shell程序[10],它设计的初衷主要是应用于linux无盘系统
或者软盘系统。
但是,在当今的应用中有许多路由器厂家都采用了Routercli作为其控制
终端,比如:
cisco,Juniper,3com,paradyne等网络巨头。
正如它开放源代码的特性,使得很多商业厂家都会从下面网站下载由开发者提供的源代码包:
当从下载下来后,通过向里面增加源代码,就可以实现针对于自己产品的特殊功能。
3.2.2基本命令
我们先看看其原来的一些功能。
(图2-1:
基本命令)
可以看到,它包括了一些常用的命令,如ping,telnet等,exit是用来退出程序的常用命令。
在这些命令的基础,大多厂家都会增加一些命令进去,或者替换掉一些命令。
我们来看看其功能:
I.enable:
进入特权命令模式
II.help:
帮助信息
III.exit:
从EXEC退出
IV.ping:
发送icmp报文
V.trace:
到目的地的路由跟踪
VI.telnet:
打开一个telnet连接
3.2.3特权命令
当我们通过键入enable命令时就会进入特权命令模式,如下所示:
(图2-2:
特权模式)
从上图我们可以看到进入特权模式之后命令有所不同,下面来简要介绍一下:
I.configure:
进入configuration模式
II.clock:
对系统时钟进行操作
III.copy拷贝配置文件或映像文件
IV.disable:
关闭特权命令
V.help:
打印命令帮助信息
VI.exit:
退出
VII.ping发送ping包
VIII.trace:
路由路径跟踪
IX:
show:
显示系统运行信息
X:
shell:
执行shell程序
XI:
write:
把运行配置写入到内存
3.2.4配置模式
在特权模式下我们再键入configuret[或term,terminal]命令就可以进入配置模式了:
(图2-3:
配置模式)
我们对其命令简要解释一下:
I.access-list:
增加一个访问列表入口
II.banner:
定义一个登陆的图标
III.clear:
复位功能
IV.help:
打印命令帮助信息
V.hostname:
设置系统的网络名
VI.exit:
退出此模式到上级模式
VII.line:
配置终端命令行
VIII.router:
使能一个路由进程
IX.interface:
选择一个网络接口来配置
X.ip:
ip配置子命令
XI.no:
忽略一个命令或设置它的默认植
XII.enable:
修改enable密码参数
好了,routercli的自带的命令集已经基本介绍完毕,现在我们来看看它的一个应用的例子。
3.2.5ping命令
Ping命令相信大家都比较熟悉了,它是用来检测网络状态的常用命令。
我们切换到正常模式。
为了演示方便,就通过ping回环设备来看看它的运行效果:
(图2-4:
ping结果)
我们可以看到有5个包被传送,5个包收到了。
说明回环设备正常。
我们再退出routercli终端,在默认的linux终端(bash)中输入ping命令,可以看到如下信息:
(图2-5:
bashping结果)
通过比较可以发现,bash与routercli中的ping命令似乎不同,但其实它们在实现原理上
是一样的,只不过在表现形式上有所不同。
这正是开源代码的特性。
4项目规划
这一章节主要讨论实现其功能需要进行哪些前期工作.
4.1目录结构
在根目录下有以下主要文件或目录:
(图3-1:
目录结构)
以下是主要目录或文件的描述信息:
*Makefile(工程管理文件)
*LICENSE(版权)
*cli目录(下面包含主要的源文件,我们将在下面添加自己的源文件)
*INSTALL(安装帮助文件)
4.2功能实现
此次任务主要是向其中添加针对于防火墙的特殊命令:
*网络接口的配置,状态显示,对应添加的源文件(nif.c以及nif_cs.c).
*系统重启(reboot.c)
*系统信息(sysinfo.c)
*被保护主机的设置和信息查看(host_flow.c,host_traffic.c,host_protect.c,
host_unpro.c,host_sus.c,host_adel.c).
*防火墙设置(denyattack.c,denyip.c,dosdev.c,limit.c)
4.3程序调试
程序调试在程序的开发过程中可谓至关重要,程序的bugs都是通过调试的方法来修正的.在linux世界中,有很多开源的调试工具,其中最著名的当属gdb.这是一个非常实用的调试工具.具体信息可参考其manpage.
除了采用专门的调试工具以外,利用printf打印函数调试程序也是非常的便利的,你可以利用它来检测程序崩溃的精确位置,还可探测程序的内部运行状态,这也是本人在写程序时使用最频繁的手段了.
还有一种方法就是通过写日志文件,这样就可以在因程序崩溃时,检测程序运行的时间等等信息.
5具体实现
在作好以上的准备工作时,就可以进行代码的具体编程工作了.限于篇幅,我们只挑选其中的部分实现来作为对象.
5.1程序运行原理
所有的子功能都是通过routercli命令来实现的.我们首先把程序编译好,就会看到如下的控制终端:
(图4-1:
运行子终端)
这样routercli的终端就已经起来了.我们就可以在里面输入命令等等.
5.2系统重启
为了增加此项功能,我们需要做以下步骤:
*修改cli/main.c增加reboot入口.
*在Makefile文件里增加reboot.o
*在cli/目录添加reboot.c,并且编辑.
下面我们来看看其代码实现[2](src.4-1):
externintreboot_main(char*name)
{
returnkill(1,SIGINT);
}
(src4-1:
reboot)
函数reboot_main(),在main.c里被调用(当我们键入reboot时),它执行的功能非常简单,就是重启系统.而代码实现也非常简单,就一个语句:
kill(1,SIGINT);
我们知道在linux系统中,进程1为INIT进程,在一定意义上来讲其他的进程都是其子进程.
当我们将1号进程杀掉之后,其他进程也回被杀掉,所以系统将重启.
5.3网络接口
同样为了增加此项功能,要做如下步骤:
*在cli/main.c中增加nif入口;
*在Makefile中增加nif.o,nif_cs.o
*在cli/目录下添加nif.c,并且编辑好.
5.3.1功能
我们来看看其功能是什么,可以通过nif--help命令来查看:
(图4-1:
nif命令)
5.3.2设置
I.通过键入nif直接可以进入设置ip,dns,gateway,netmask的界面,按照提示即可进行操作:
(图4-2:
网卡设置)
II.启动或停止网络接口
III.查看网络接口状态
(图4-3:
状态)
通过上面的信息可以看出网卡接口以及回环接口都处于up状态。
5.3.3代码实现
通过nif_main()函数来进入主入口,完整代码见[附录]。
/*****************************************************************************
*mainentry
*****************************************************************************
*/
externintnif_main(char*name)
{
intsys_status;
intgw_exist_status;
charip_addr[16],netmask[16],gw[16],dns[16];
signal(SIGINT,handler);
if(!
strlen(name)){
/*doitfirst,whenfiledoesnotexsit,
*thencreatitwithdefaultvalue,ordonothing
*/
empty_def_conf();
printf("******************************************\n"
"*配置IP,子网掩码,网关,DNS\n"
"*请按照提示进行操作\n"
"******************************************\n");
/*shouldaddtheinterruptandipaddrcheck*/
/********************ipconfiguration**************************/
printf("pleaseinputipaddr:
\t");
scanf("%s",ip_addr);
if(ip_parse("",ip_addr)!
=0){
return-1;
}
if(ip_exist("ip",ip_addr)==IP_EMPTY){
sys_status=sys_sk("ip",ip_addr);
if(sys_status==-1){
return-1;
}
}
if(ip_write_to_file("ip",ip_addr)){
printf("error360:
failtowritetoipfile\n");
}
/*******************netmask*********************************/
printf("inputnetmask:
\t\t");
scanf("%s",netmask);
if(ip_parse("",netmask)!
=0){
return-1;
}
if(ip_exist("netmask",netmask)==IP_EMPTY){
sys_status=sys_sk("netmask",netmask);
if(sys_status==-1){
return-1;
}
}
if(ip_write_to_file("netmask",netmask)){
printf("error433:
failtowritetoipfile\n");
}
/********************gateway**********************************/
printf("inputgateway:
\t\t");
scanf("%s",gw);
if(ip_parse("",gw)!
=0){
return-1;
}
gw_exist_status=ip_exist("gateway",gw);
if(gw_exist_status==IP_EMPTY){
sys_status=sys_sk("gateway",gw);
if(sys_status==-1){
return-1;
}
}
elseif(gw_exist_status==GW_EXIST_OLD){
if(gw_del()!
=0){/*deletetheoldgw*/
printf("deletefail\n");
return-1;
}
sys_status=sys_sk("gateway",gw);/*addthenewone*/
if(sys_status==-1){
return-1;
}
}
if(ip_write_to_file("gateway",gw)){
printf("error469:
failtowritetoipfile\n");
}
/*******************dns**************************************/
printf("inputdnsserver:
\t");
scanf("%s",dns);
if(ip_exist("dns",dns)==IP_EMPTY){/*doesnotexist!
*/
FILE*fp_dns;
/*writeto"/etc/resolv.conf"first*/
if((fp_dns=fopen("/etc/resolv.conf","w"))==NULL){printf("failtoopen/etc/resolv\n");
return-1;
}
fputs("search\n",fp_dns);
fputs("nameserver",fp_dns);
fputs(dns,fp_dns);
fputs("\n",fp_dns);
fclose(fp_dns);
/*thenwritetoIP_FILE*/
if(ip_write_to_file