包过滤防火墙程序设计

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

关键问题-接收IP数据包
• 要从套接口上接收数据,就要使用recv()函 刚才创建的Socket的名称 刚才创建的 的名称 数。 int recv( 用于接收数据的缓冲区 SOCKET s, char FAR * buf, int len, 缓冲区的长度 int flags 接收方式,0表示正常接收 接收方式, 表示正常接收 );
主机的ip地址( 主机的 地址(用网络字节序 地址 表示) 表示)的生成过程如下:
if(bind(sock,(PSOCKADDR)&host_addr,sizeof(host_addr) )==SOCKET_ERROR) • ………….
关键问题-设置网卡混杂模式
• 通常,网卡不能接收mac地址不是自己的IP数据包, 要想能捕获所有IP数据包,应该先将网卡的工作模 式设置为“混杂” • 代码: • DWORD dwBufferLen[10]; • DWORD dwBufferInLen=1; • DWORD dwBytesReturned=0; • WSAIoctl(sock,IO_RCVALL,&dwBufferInLen,sizeof( dwBufferInLen),&dwBufferLen,sizeof(dwBufferLen),&d wBytesReturned,NULL,NULL • …… • ……
命令行参 数正确否? 数正确否?
流程图
输出错误信息
是否捕获 IP包? 包
Winsock启动 启动 创建socket 创建 绑定socket 绑定 网卡设为混杂模式 设置包过滤规则
分析IP包首部 分析 包首部
是否符合包 过滤规则
应用规则并显示包相关信息
关闭socket 关闭 关闭Winsock 关闭
关键问题-初始化socket(创建)
• 使用socket()函数来给应用程序创建一个套 接字 Socket使用的协议族 使用的协议族 TCP/IP为AF_INET SOCKET socket( int af, Socket类型,有三种, 类型, 类型 有三种, int type, 本程序采用raw 本程序采用 int protocol );
关键问题-包过滤规则表的定义
• 成功接收每个IP包后,要运用包过滤规则来 分析IP包头部 • 首先,定义包过滤规则的结构,采用结构 体 • 然后,填充包过滤的内容 • 最后,根据填充的规则,应用到每个数据 包上
关键问题-包过滤规则表的定义
• //定义包过滤表结构
• typedef struct • { • char SourceAddr[16]; • char DestinAddr[16]; • unsigned short SourcePort; • unsigned short DestinPort; • unsigned char Protocol; • bool Operation; • }filter_table;
关键问题-定义IP数据包数据结构
• union • { • unsigned short Flags; • unsigned short FragOffset; • }; • unsigned char TimeToLive; • unsigned char Protocol; • unsigned short HeadChecksum; • unsigned int SourceAddr; • unsigned int DestinAddr; • unsigned char Options; • }ip_head;
AF_INET sin_port
sin_addr
•返回
sin_zero
关键问题-初始化sockewenku.baidu.com(创建/绑定)
• • • • • • • • • • •
char hostName[128]; 1.用gethostname得到主 用 得到主 gethostname(hostName,100); 机名 …… 2.用Gethostbyname得到 用 得到 hostent *pHostIP; 主机的IP地址 地址, 主机的 地址,保存在 pHostIP中 中 gethostbyname(hostName); …… 3.将pHostIP转化为网络 将 转化为网络 字节序表示的地址: 字节序表示的地址: sockaddr_in host_addr; *(in_addr *) host_addr.sin_family=AF_INET; pHostIP->h_addr_list[0] host_addr.sin_port=htons(6000); host_addr.sin_addr=*(in_addr *)pHostIP->h_addr_list[0];
源代码
作业
1、设计相对复杂的包过滤规则,并加以实现 2、要求撰写说明文档,包括开发思路,工作 流程,关键问题和进一步改进等 3、参考资料:计算机网络软件编程指导书
清华大学出版社 吴英 编著 书号:ISBN 978-7-302-16161-5
• 发现活动主机(ping) • 发现服务器开启的tcp端口
关键问题-初始化socket(绑定)
• socket()创建了一个套接口后,需要将该套 接口与该主机上提供服务的某端口联系在 刚才创建的Socket的名称 刚才创建的 的名称 一起,bind()函数用于完成这样的绑定 int bind( sockaddr_in结构的 socket地址(点这里) SOCKET s, const struct sockaddr FAR * name, int namelen );
关键问题-填写包过滤规则
• • • • //规则1 filter_table filter[2]; memset(filter[0].SourceAddr,0,16); memcpy(filter[0].SourceAddr,"218.194.97.161 ",strlen("218.194.97.161"));//源IP • filter[0].Protocol = TCP_PRO;//协议类型 • filter[0].Operation = REJECT_OPT; //操作
关键问题-填写包过滤规则
• //规则2 • memset(filter[1].DestinAddr,0,16); • memcpy(filter[1].DestinAddr,"218.194.96.8",st rlen("218.194.96.8"));//目IP • filter[1].Protocol = TCP_PRO;//协议类型 • filter[1].Operation = PERMIT_OPT; //操作
– Connect()
Socket使用的协议,本 使用的协议, 使用的协议 程序为IPPROTO_IP 程序为
关键问题-初始化socket(创建)
• 为了通过网卡截获并分析IP数据包,采用raw原 始套接字 • 具体代码
– SOCKET sock=socket(AF_INET,SOCK_RAW,IPPROTO_IP); – if(sock==INVALID_SOCKET) – { – ………. – }
地址参数(name)的长度
•Sockaddr_in结构: struct sockaddr_in { short int sin_family; /* 通信类型 */ unsigned short int sin_port; /* 端口, 2 bytes*/ struct in_addr sin_addr; /* IP, 4 bytes */ unsigned char sin_zero[8]; /* 填充空白信息*/ }; •in_addr •in_addr结构定义如下: : struct in_addr { unsigned long s_addr ; •}
关键问题-应用包过滤规则
• //应用包过滤规则1 • if(strcmp(source_ip,filter[0].SourceAddr) == 0) • { • if(ip.Protocol == filter[0].Protocol) • { • ……
关键问题-应用包过滤规则
• //应用包过滤规则2 • if(strcmp(destin_ip,filter[1].DestinAddr) == 0) • { • if(ip.Protocol == filter[1].Protocol) • { • ……
• 运行结果演示如下页
关键问题-启动winsock
• 使用函数WSAStartup()完成winsock的启动 • int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData ); • 具体代码: 本程序请求使用的
Socket版本 版本 – WSADATA WSAData; – if(WSAStartup(MAKEWORD(2,2), &WSAData)!=0) 返回请求的Socket版本 返回请求的 版本 的信息 –{ …… }
– 生成可执行文件PackFilter.exe – 运行该文件的命令行格式为:
• PackFilter pack_sum (pack_sum是符合包过滤规则的数 量)
– 要将符合规则的包的部分字段显示在控制台上, 格式:
• • • • • • -------------- 源IP地址:xx 目的IP地址:xx 协议类型:xx 操作:拒绝/允许 --------------
包过滤防火墙程序设计
设计要求
• 编写包过滤程序,捕获并分析IP数据包,并 将符合过滤条件的IP包信息显示出来 • 本例中,我们设置两条简单的包过滤规则:
ID 源地址 目的地址 协议类型 操作
1 2
218.194.97.161 *
* 218.194.96.8
TCP TCP
Reject Permit
• 具体要求如下:
关键问题-接收IP数据包
• 代码: • char buffer[65535]; • while(捕获数据包没有结束) • { • recv(sock,buffer,65535,0); • {
关键问题-定义IP数据包数据结构
• 为了能对IP头部字段进行解析,先要构造一个 IP头部的数据结构,这个结构和IP包头的结构 要一一对应 • typedef struct • { • union • { unsigned char Version; • unsigned char HeadLen; • }; • unsigned char ServiceType; • unsigned short TotalLen; • unsigned short Identifier;
相关文档
最新文档