防火墙与入侵检测课程设计报告Word文档格式.docx
《防火墙与入侵检测课程设计报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《防火墙与入侵检测课程设计报告Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
![防火墙与入侵检测课程设计报告Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/29/f6d543df-a152-4ba8-b547-4dfc0cef2a30/f6d543df-a152-4ba8-b547-4dfc0cef2a301.gif)
而且它还能禁止特定端口的流出通信,封锁特洛伊木马。
最后,它可以禁止来自特殊站点的访问,从而防止来自不明入侵者的所有通信。
三、关键技术及解决方案
概要设计:
(1)网络包的分析
各种类型报文对象的构造:
由于pcap每次抓到一个数据包,会提交其信息,方式为以unsignedchar*指向的一段缓冲区,现将缓冲区前14个字节读入,按以太帧格式构造以太帧头部的对象。
然后根据以太帧头部中的Type字段,决定接下来应该构造IP还是ARP还是RARP。
假设是IP,那么把缓冲区中第15个字节开始直到这块缓冲区最后的所以字节读入,按IP报文格式构造IP的对象,根据IP的Protocol字段,决定接下来构造TCP,UDP还是ICMP。
假设是TCP,则将IP的数据内容读入,按TCP格式构造TCP的对象。
注:
1)对于不满一个字节的字段,如一些标志位DF,URG等等需要用位运算将其取出
如:
if(*pos&
0x04)
DF=true;
else
DF=false;
其中pos为unsignedchar*,指向当前字节,而DF为该字节中右起第3位。
2)对于大于一个字节的字段,需要进行大数端到小数端的转换。
因为网络中传输是按大数段(高位在低地址处),而本地机器中则相反,按小数端(地位在低地址处)。
totallen=(*pos)*256+(*(pos+1));
total为双字节,pos指针开始时指向低地址,乘256是完成大数端到小数端的转换。
过滤方法:
(2)网络包的拦截
1.捕获网络的数据包后,先查看是来自哪个程序的。
在数据库中查找有没有相应的规则:
如果规则数据库中没有相应的规则,就弹出对话框让用户配置规则,然后添加到数据库中,然后按相应的规则,访问网络。
如果规则数据库中有相应的配置,就需要读取配置,对照访问规则权限来确定是阻止还是放行。
2.将进出的报文记录在数据日志中待以后查询。
3.将进出的报文情况添加到封包监视器中,待管理员查询。
四、测试
1、在程序调试阶段遇到的问题:
(1)如何编译动态链接库的问题
(2)如何分析通过winpcap捕获的数据包
以上问题最终通过查看相应的资料解决。
2、问题及难点所在:
防火墙的难点与重点就在如何获取网络中的发送或接受的报文,并分析报文。
找出潜在的安全问题,防患于未然。
通过对winpcap程序开发包的学习,掌握了如何通过winpcap提过的动态链接库中的基础函数来捕捉进出网络的数据包,并参阅资料,了解了各种网络数据包数据的格式与其的特点,通过字节的对比,解析数据包,提取出各个字段的内容,并判断如何网络的情况。
提醒用户设置网络访问的规则,来阻止或允许或条件允许。
3、运行结果与分析(测试)
启动程序:
访问网络:
配置规则:
访问结果:
放行时候:
拒绝时:
网络包监测窗口:
日志查询:
分析网络数据包的源代码如下:
TCP报文的数据结构与解析方法:
classTCPGram
{
public:
TCPGram();
TCPGram(constunsignedchar*buf,intbuflen);
virtual~TCPGram();
intsrcport;
//源端口
intdestport;
//目的端口
unsignedintseqnum;
//顺序号
unsignedintacknum;
//确认号
intheadlen;
//头部长
boolURG;
//为1表示使用紧急指针
boolACK;
//为1表示确认号合法
boolPSH;
//表示带有PUSH标志的数据
boolRST;
//用于主机崩溃或其他原因后的复位
boolSYN;
//用于建立连接
boolFIN;
//用于释放连接
intwindowsize;
//窗口大小
intchecksum;
//校验和
inturgpos;
//紧急指针,从当前顺序号到紧急数据位置偏移量
intoptlen;
//选项长度
unsignedchar*options;
//选项字段
intdatalen;
//数据段的长度
unsignedchar*data;
//数据指针
};
TCPGram:
:
TCPGram(constunsignedchar*buf,intbuflen)
//unsignedchar*buf;
unsignedchar*pos;
//intbuflen;
//buflen=bufferlen;
//buf=newunsignedchar[buflen];
//memcpy(buf,buffer,buflen);
pos=(unsignedchar*)buf;
srcport=(*pos)*0x100+(*(pos+1));
pos+=2;
destport=(*pos)*0x100+(*(pos+1));
seqnum=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));
pos+=4;
acknum=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));
headlen=(*pos)/16;
pos++;
if(*pos&
0x20)
URG=true;
else
URG=false;
0x10)
ACK=true;
else
ACK=false;
0x08)
PSH=true;
PSH=false;
RST=true;
RST=false;
0x02)
SYN=true;
SYN=false;
0x01)
FIN=true;
FIN=false;
windowsize=(*pos)*0x100+(*(pos+1));
checksum=(*pos)*0x100+(*(pos+1));
urgpos=(*pos)*0x100+(*(pos+1));
if(headlen>
5){
pos+=2;
optlen=headlen*4-20;
options=newunsignedchar[optlen];
memcpy(options,buf+20,optlen);
}
else{
optlen=0;
options=NULL;
pos=(unsignedchar*)(buf+headlen*4);
datalen=buflen-headlen*4;
if(datalen>
0){
data=newunsignedchar[datalen];
memcpy(data,buf+headlen*4,datalen);
data=NULL;
data=0;
}
UDP的数据结构与解析方法:
classUDPGram
UDPGram();
UDPGram(constunsignedchar*buf,constintbuflen);
virtual~UDPGram();
unsignedintsrcport;
unsignedintdestport;
inttotallen;
//总长
unsignedintdatalen;
//数据段段的长度
char*data;
UDPGram:
UDPGram(constunsignedchar*buf,constintbuflen)
totallen=(*pos)*0x100+(*(pos+1));
datalen=buflen-8;
data=newchar[datalen];
memcpy(data,buf+8,datalen);
IP的数据结构与解析方法:
classIPGram
intversion;
//版本
intIHL;
//头部长度
intservicetype;
//服务类型typeofservice
intprecedence;
//优先级
booldelay;
//延迟
boolthroughtput;
//吞吐量
boolreliability;
//可靠性
unsignedinttotallen;
//总长totallength
intidentification;
//标识
boolDF;
//不要分段
boolMF;
//还有进一步的分段
intfragoffset;
//分段偏移fragmentoffset
intTTL;
//生命期timetolive
intprotocol;
//协议,如TCP,UDP
unsignedintchecksum;
//头部校验和
longsrcaddr;
//源IP地址
longdestaddr;
//目的IP地址
//选项长度
//选项内容
//数据长度
//数据内容
IPGram();
IPGram(constunsignedchar*buf,intbuflen);
virtual~IPGram();
CStringGetService();
voidGetDestAddr(char*str);
CStringGetDestAddr();
voidGetSrcAddr(char*str);
CStringGetSrcAddr();
CStringGetID();
IPGram:
IPGram(constunsignedchar*buf,intbuflen)
//buf=newunsignedchar[buffer_len];
//buflen=buffer_len;
version=*pos/16;
IHL=*pos%16;
servicetype=*pos;
precedence=(*pos&
16)*4+(*pos&
8)*2+(*pos&
4);
16)
delay=true;
delay=false;
8)
throughtput=true;
throughtput=false;
4)
reliability=true;
reliability=false;
totallen=(*pos)*256+(*(pos+1));
identification=(*pos)*256+(*(pos+1));
64)
DF=true;
DF=false;
32)
MF=true;
MF=false;
fragoffset=(*pos%32)*256+(*(pos+1));
TTL=*pos;
protocol=*pos;
checksum=(*pos)*256+(*(pos+1));
srcaddr=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));
destaddr=(*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));
if(IHL>
pos+=4;
optlen=(IHL-5)*4;
pos=(unsignedchar*)(buf+IHL*4);
datalen=totallen-IHL*4;
memcpy(data,buf+IHL*4,datalen);
(注意:
其他更多数据包见源程序)
五、总结(收获与体会)
通过本次课程设计,我学习到了更多的编程方法,对《操作系统安全原理与技术》这门课程有了一个比较完整的认识和理解,知道了如何将防火墙与入侵检测的知识应用到实际编程中。
并且对使用visualc++6.0开发windows程序有了更深的认识。
通过这次设计,增加了我的检索自己所需知识的能力和调试C++程序的能力,也让我体会了编程知识的渊博,我们永远都不可能把知识学完,只要努力,总能做的比以前更好。