智能包过滤防火墙文档.docx
《智能包过滤防火墙文档.docx》由会员分享,可在线阅读,更多相关《智能包过滤防火墙文档.docx(69页珍藏版)》请在冰点文库上搜索。
智能包过滤防火墙文档
防火墙课程教学用智能包过滤防火墙说明
第一版
作者:
王涛&宋君易&宋健豪
指导教师:
康海燕
1.智能包过滤防火墙概述
1.1什么是智能包过滤防火墙
包过滤型防火墙的实现依据是利用网络数据传输中的分包技术。
网络上的数据都是采用“包”的形式进行传输的,数据被划分成为一定大小的数据包,每一个数据包里具有包的特定信息,如数据的源IP地址、目的IP地址、TCP用DP源端口号和目标端口号等。
防火墙对所有进出用户PC的数据包进行检查,通过读取数据包中的地址信息来判断这些“包”是否符合安全策略,一旦发现来自危险站点或者伪造的数据包,防火墙便会将这些数据丢弃处理。
用户也可以根据实际情况制订灵活的过滤规则。
包过滤技术的优点是简单方便,实现成本较低,配置对用户透明,运行效率也很高,在使用环境比较简单的情况下,可以较大程度上保证系统的安全。
但是包过滤技术也有很明显的缺陷,首先包过滤技术是基于网络层来发挥作用,所以只能依据数据包的来源、目标和端口等包信息进行处理,而且无法识别建立在应用层的恶意侵入,如恶意的脚本程序或者病毒。
动态包过滤防火墙采用动态设置包过滤规则的方法,解决静态包过滤的技术问题。
这种技术就是包状态监测(statefulInspection)。
状态检测技术的防火墙对通过其建立的每一个连接都进行跟踪,并且根据需要可动态地在过滤规则中增加或删除规则。
动态包过滤原理图如下1-1所示:
图1-1动态包过滤原理图
1.2智能包过滤防火墙的结构
所有基于Windows操作系统的个人防火墙核心技术在于Windows操作系统下数据包拦截技术。
包过滤系统工作在OSI模型中的网络层,可以根据数据包报头等信息来制定规则。
包过滤系统的结构图如图所示:
图1-2包过滤系统结构图
根据相应流程,进行代码实现及界面的设计。
在本程序中,完成了根据规则监控网络程序、添加规则程序、删除规则程序、安装、卸载规则等模块,并集成在一个友好的界面中,使得程序更易于使用,方便演示。
图1-3到图1-5显示的是程序的功能选择界面。
图1-3智能防火墙主界面
图1-4智能防火墙文件菜单
图1-5智能防火墙规则菜单
2.智能包过滤防火墙开发和运行环境
2.1开发语言
MicrosoftvisualC++
2.2开发环境
软件:
MicrosoftVisualC++6.0
硬件:
表2.1所示的是代码编写与测试部分:
电脑型号
惠普4311s(VX603PA)
屏幕尺寸
13.3英寸1366x768
CPU型号
Intel酷睿2双核P8700
CPU主频
2.53GHz
内存容量
2GBDDRIII1333
硬盘容量
320GB7200转,SATA
显卡芯片
ATIMobilityRadeonHD4330
操作系统
Windows7Ultimate
表2.1电脑配置(代码编写与测试)
表2.2所示的界面编辑部分:
电脑型号
联想Y450A-TSI(LE)NBA球队版
屏幕尺寸
14英寸1366x768
CPU型号
Intel酷睿2双核T6600
CPU主频
2.2GHz
内存容量
2GBDDR31066
硬盘容量
320GB7200转,SATA
显卡芯片
NVIDIAGeForceGT240MLE
操作系统
WindowsXPSP2
表2.2电脑配置(界面编辑)
2.3运行环境
软件:
Microsoft.NETFramework2.0,WindowsXP系统或以上,Wpdpack3.0
硬件:
内存:
256M或以上
CPU:
奔腾4或以上
硬盘:
空间大于20G
3.各部分设计及实现
3.1包过滤防火墙部分
3.1.1简要介绍
在防火墙程序中,通过用户设置控制规则,对于网络数据包收发进行管理,最终达到监管网络传输内容的目的。
根据用户设定规则,调用数据包截获接口,选择相应的数据包进行监控,控制传递数据的内容。
人性化的界面设置提供外部导入规则设定,方便将习惯的规则移植到其他电脑使用。
如图3-1所示,选择规则导入文件的选择框。
图3-1规则导入
3.1.2设计方案
智能防火墙主要任务:
创建规则,防止恶意数据包的流入。
智能防火墙其他任务:
设置流量阈值,根据流量状况,智能选择策略进行流量监管。
如图3-2包过滤防火墙系统流程描述图。
图3-2包过滤防火墙流程图
3.1.3实现及使用说明
(1)主界面
如图3-3所示,主界面菜单栏分为文件、规则、帮助三项。
任务栏图标从左至右依次是开启防火墙、停止防火墙、添加规则、删除规则的快捷图标。
中部提供流量阈值输入框,应用流量阈值,实现智能流量控制。
下部列表输出数据包流量信息包括源IP、目的IP、源端口、源掩码、协议及动作情况。
图3-3包过滤防火墙
(2)文件菜单
如图3-4所示,文件菜单下显示开始过滤、停止过滤、读取规则、存储规则
及退出功能。
开始过滤开启防火墙,根据配置规则进行数据包过滤。
停止过滤停止防火墙,开放规则限制,数据包收发自由。
读取规则进行规则文件的载入,方便用户更换电脑时的可移植性。
存储规则进行相关配置规则信息,以便规则读取。
退出防火墙功能,关闭防火墙的的网络监管并关闭界面。
图3-4智能防火墙文件菜单
(3)规则菜单
如图3-6所示,规则菜单下显示增加规则、删除规则、安装规则、卸载规则功能。
增加规则用于创建新的规则,根据用户的设定编写一条新的网络流量规则。
如图3-5所示,增加规则对话框内提供原目的IP、端口设置,以及协议设定,动作设定等设置,来编写规则。
图3-5智能防火墙增加规则对话框
删除规则用于删除已存在规则,根据用户需要删除不用的规则。
安装规则用于规则的安装配置,为不想手动规则配置的用户进行规则的配置安装,直接可应用。
卸载规则用于针对已安装的规则进行移除。
图3-6智能防火墙规则菜单
(4)帮助菜单
如图3-7所示,帮助菜单下显示关于软件帮助功能。
图3-7智能防火墙帮助菜单
3.2智能分析部分
如图3-8所示,界面中部有流量阈值输入框,根据端口流量情况可以规定不同的流量阈值,当端口流量高于流量阈值时,采取限制策略,除设定白名单规则外全部不允许访问;当端口流量低于流量阈值时,采取宽松策略,除设定黑名单外规则全部允许访问。
图3-8智能防火墙主界面
防火墙会根据流经防火墙的流量与预先设定的阈值自动提示管理员切换或者由防火墙自行切换防洪墙策略,如图3-9所示。
图3-9智能防火墙访问控制列表
4.创新点
本防火墙采用智能包过滤方案,不仅可以针对于用户设定的防火墙流量阈值进行检测,而且可以根据预设的规则由防火墙智能限制流经防火情的流量,并依据当前网络状况提出适合的流量限制策略。
当流经防火墙的流量大于设定阈值时,防火墙会提示管理员采用限制策略,控制端口流量,除白名单外所有流量均禁止,防止恶意数据包的流入;当端口流量小于用户设定流量阈值的时候,提示采用宽松策略,开放端口流量,除黑名单外所有数据流量均放行,有效依据预设阈值动态调整网络流量,从而避免防火墙所带来的网络延迟,影响用户的正常使用。
防火墙采用了驱动级流量过滤技术,通过钩子技术替换网卡驱动的动态链接库,在数据链路层与网络层之间过滤流量,有效地控制流量并且对计算机资源占用很小。
防火墙界面简约友好化,降低用户使用的困难性。
同时添加规则导入导出功能,极大地降低了防火墙的配置难度,同时方便用户在不同机器与网络环境中重复使用规则,减少配置时间,增强可移植性。
5.总结与展望
经过防火墙使用测试,本防火墙可以实现包过滤功能,很好的拦截规则外数据包的传入。
同时流量数据的监测情况一切正常,很好的记录下网络数据报的传输情况。
从客户的角度出发,不仅方便用户的操作,同时也为用户制造了美观的界面。
在未来的防火墙设计之中,将加强智能处理的方面,更加人性化的控制数据流量,让防火墙的设计变得简约而不简单。
参考文献
[1]防火墙百科:
[2]智能包过滤防火墙的设计与实现:
附各部分源代码
(1)主界面
//主界面程序代码
//FirewallAppView.cpp:
implementationoftheCFirewallAppViewclass
#include"stdafx.h"
#include"FirewallApp.h"
#include"mytext.h"
#include"FirewallAppDoc.h"
#include"FirewallAppView.h"
#include"SockUtil.h"
#include
usingnamespacestd;
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CFirewallAppView
IMPLEMENT_DYNCREATE(CFirewallAppView,CFormView)
BEGIN_MESSAGE_MAP(CFirewallAppView,CFormView)
//{{AFX_MSG_MAP(CFirewallAppView)
ON_WM_CLOSE()
ON_WM_CANCELMODE()
ON_BN_CLICKED(IDC_BUTTON1,OnButton1)
//}}AFX_MSG_MAP
//Standardprintingcommands
ON_COMMAND(ID_FILE_PRINT,CFormView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT,CFormView:
:
OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW,CFormView:
:
OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
//CFirewallAppViewconstruction/destruction
CFirewallAppView:
:
CFirewallAppView()
:
CFormView(CFirewallAppView:
:
IDD)
{
//{{AFX_DATA_INIT(CFirewallAppView)
//NOTE:
theClassWizardwilladdmemberinitializationhere
//}}AFX_DATA_INIT
//TODO:
addconstructioncodehere
}
CFirewallAppView:
:
~CFirewallAppView()
{
}
voidCFirewallAppView:
:
DoDataExchange(CDataExchange*pDX)
{
CFormView:
:
DoDataExchange(pDX);
//{{AFX_DATA_MAP(CFirewallAppView)
DDX_Control(pDX,IDC_LIST1,m_rules);
//}}AFX_DATA_MAP
}
BOOLCFirewallAppView:
:
PreCreateWindow(CREATESTRUCT&cs)
{
//TODO:
ModifytheWindowclassorstylesherebymodifying
//theCREATESTRUCTcs
returnCFormView:
:
PreCreateWindow(cs);
}
voidCFirewallAppView:
:
OnInitialUpdate()
{
CFormView:
:
OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
RECTrc;
m_rules.GetClientRect(&rc);
intwidth=rc.right-rc.left-110;
m_rules.InsertColumn(0,"源IP",LVCFMT_LEFT,width/6,0);
m_rules.InsertColumn(1,"源掩码",LVCFMT_LEFT,width/6,1);
m_rules.InsertColumn(2,"源端口",LVCFMT_LEFT,width/6,2);
m_rules.InsertColumn(3,"目的IP",LVCFMT_LEFT,width/6,3);
m_rules.InsertColumn(4,"目的掩码",LVCFMT_LEFT,width/6,4);
m_rules.InsertColumn(5,"目的端口",LVCFMT_LEFT,width/6,5);
m_rules.InsertColumn(6,"协议",LVCFMT_LEFT,60,6);
m_rules.InsertColumn(7,"动作",LVCFMT_LEFT,50,7);
m_rules.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
}
/////////////////////////////////////////////////////////////////////////////
//CFirewallAppViewprinting
BOOLCFirewallAppView:
:
OnPreparePrinting(CPrintInfo*pInfo)
{
//defaultpreparation
returnDoPreparePrinting(pInfo);
}
voidCFirewallAppView:
:
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addextrainitializationbeforeprinting
}
voidCFirewallAppView:
:
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
{
//TODO:
addcleanupafterprinting
}
voidCFirewallAppView:
:
OnPrint(CDC*pDC,CPrintInfo*/*pInfo*/)
{
//TODO:
addcustomizedprintingcodehere
}
/////////////////////////////////////////////////////////////////////////////
//CFirewallAppViewdiagnostics
#ifdef_DEBUG
voidCFirewallAppView:
:
AssertValid()const
{
CFormView:
:
AssertValid();
}
voidCFirewallAppView:
:
Dump(CDumpContext&dc)const
{
CFormView:
:
Dump(dc);
}
CFirewallAppDoc*CFirewallAppView:
:
GetDocument()//non-debugversionisinline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CFirewallAppDoc)));
return(CFirewallAppDoc*)m_pDocument;
}
#endif//_DEBUG
/////////////////////////////////////////////////////////////////////////////
//CFirewallAppViewmessagehandlers
voidCFirewallAppView:
:
UpdateList()
{
CFirewallAppDoc*doc=GetDocument();
//Actualizolatabladereglas
m_rules.DeleteAllItems();
unsignedinti;
for(i=0;inRules;i++)
{
AddRuleToList(doc->rules[i].sourceIp,
doc->rules[i].sourceMask,
doc->rules[i].sourcePort,
doc->rules[i].destinationIp,
doc->rules[i].destinationMask,
doc->rules[i].destinationPort,
doc->rules[i].protocol,
doc->rules[i].action);
}
}
voidCFirewallAppView:
:
AddRuleToList(unsignedlongsrcIp,
unsignedlongsrcMask,
unsignedshortsrcPort,
unsignedlongdstIp,
unsignedlongdstMask,
unsignedshortdstPort,
unsignedintprotocol,
intaction)
{
charip[16];
charport[6];
LVITEMit;
intpos;
it.mask=LVIF_TEXT;
it.iItem=m_rules.GetItemCount();
it.iSubItem=0;
it.pszText=(srcIp==0)?
"All":
IpToString(ip,srcIp);
pos=m_rules.InsertItem(&it);
cout<<"";
it.iItem=pos;
it.iSubItem=1;
it.pszText=IpToString(ip,srcMask);
m_rules.SetItem(&it);
it.iItem=pos;
it.iSubItem=2;
it.pszText=(srcPort==0)?
"All":
itoa(srcPort,port,10);
m_rules.SetItem(&it);
it.iItem=pos;
it.iSubItem=3;
it.pszText=(dstIp==0)?
"All":
IpToString(ip,dstIp);
m_rules.SetItem(&it);
it.iItem=pos;
it.iSubItem=4;
it.pszText=IpToString(ip,dstMask);
m_rules.SetItem(&it);
it.iItem=pos;
it.iSubItem=5;
it.pszText=(dstPort==0)?
"All":
itoa(dstPort,port,10);
m_rules.SetItem(&it);
it.iItem=pos;
it.iSubItem=6;
if(protocol==1)
it.pszText="ICMP";
elseif(protocol==6)
it.pszText="TCP";
elseif(protocol==17)
it.pszText="UDP";
else
it.pszText="All";
m_rules.SetItem(&it);
it.iItem=pos;
it.iSubItem=7;
it.pszText=action?
"Drop":
"Forward";
m_rules.SetItem(&it);
}
voidCFirewallAppView:
:
OnClose()
{
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
CFormView:
:
OnClose();
}
voidCFirewallAppView:
:
OnCancelMode()
{
CFormView:
:
OnCancelMode();
//TODO:
Addyourmessagehandlercodehere
}
voidCFirewallAppView:
:
OnButton1()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
//jgtime=m_text1;
}
(2)规则界面
//RuleDlg.cpp:
implementationfile
#include"stdafx.h"
#include"FirewallApp.h"
#include"RuleDlg.h"
#include"sockUtil.h"
#ifdef_DEBUG
#definenewDEBUG_NEW
#undefTHIS_FILE
staticcharTHIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CRuleDlgdialog
CRuleDlg:
:
CRuleDlg(CWnd*pParen