所谓防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的界面上构造的保护屏障.是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使Internet与Intranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用户的侵入,防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成,防火墙就是一个位于计算机和它所连接的网络之间的软件或硬件。该计算机流入流出的所有网络通信和数据包均要经过此防火墙。
  在网络中,所谓“防火墙”,是指一种将内部网和公众访问网(如Internet)分开的方法,它实际上是一种隔离技术。防火墙是在两个网络通讯时执行的一种访问控制尺度,它能允许你“同意”的人和数据进入你的网络,同时将你“不同意”的人和数据拒之门外,最大限度地阻止网络中的黑客来访问你的网络。换句话说,如果不通过防火墙,公司内部的人就无法访问Internet,Internet上的人也无法和公司内部的人进行通信。
 网络层防火墙
  网络层防火墙可视为一种 IP 封包过滤器,运作在底层的 TCP/IP 协议堆栈上。我们可以以枚举的方式,只允许符合特定规则的封包通过,其余的一概禁止穿越防火墙(病毒除外,防火墙不能防止病毒侵入)。这些规则通常可以经由管理员定义或修改,不过某些防火墙设备可能只能套用内置的规则。
  我们也能以另一种较宽松的角度来制定防火墙规则,只要封包不符合任何一项“否定规则”就予以放行。现在的操作系统及网络设备大多已内置防火墙功能。
  较新的防火墙能利用封包的多样属性来进行过滤,例如:来源 IP 地址、来源端口号、目的 IP 地址或端口号、服务类型(如 WWW 或是 FTP)。也能经由通信协议、TTL 值、来源的网域名称或网段...等属性来进行过滤。
  应用层防火墙
  应用层防火墙是在 TCP/IP 堆栈的“应用层”上运作,您使用浏览器时所产生的数据流或是使用 FTP 时的数据流都是属于这一层。应用层防火墙可以拦截进出某应用程序的所有封包,并且封锁其他的封包(通常是直接将封包丢弃)。理论上,这一类的防火墙可以完全阻绝外部的数据流进到受保护的机器里。
  防火墙借由监测所有的封包并找出不符规则的内容,可以防范电脑蠕虫或是木马程序的快速蔓延。不过就实现而言,这个方法既烦且杂(软件有千千百百种啊),所以大部分的防火墙都不会考虑以这种方法设计。
  XML 防火墙是一种新型态的应用层防火墙。
  根据侧重不同,可分为:包过滤型防火墙、应用层网关型防火墙、服务器型防火墙。
我们来简单实现一个数据包防火墙,请见代码!

#include "pcap.h"
/*
-----------------------------------------------------------------------------------------------------------------------
下面是以太网协议格式
-----------------------------------------------------------------------------------------------------------------------  */
struct ether_header
{   u_int8_t ether_dhost[6];   /* 目的以太网地址 */   u_int8_t ether_shost[6];   /* 源以太网地址 */   u_int16_t ether_type;   /* 以太网类型 */
};
/* 下面是IP地址格式 */
typedef u_int32_t in_addr_t;
struct in_addr
{   in_addr_t s_addr; /* 存放IP地址 */
};
/*
-----------------------------------------------------------------------------------------------------------------------
下面是ARP协议格式
-----------------------------------------------------------------------------------------------------------------------  */
struct arp_header
{   u_int16_t arp_hardware_type;   /* 硬件地址类型 */   u_int16_t arp_protocol_type;   /* 协议地址类型 */   u_int8_t arp_hardware_length;   /* 硬件地址长度 */   u_int8_t arp_protocol_length;   /* 协议地址长度 */   u_int16_t arp_operation_code;   /* 操作类型 */   u_int8_t arp_source_ethernet_address[6];   /* 源以太网地址 */   u_int8_t arp_source_ip_address[4];   /* 源IP地址 */   u_int8_t arp_destination_ethernet_address[6];   /* 目的以太网地址 */   u_int8_t arp_destination_ip_address[4];   /* 目的IP地址 */
};
/*
=======================================================================================================================
下面是实现ARP协议分析的函数定义
=======================================================================================================================  */
void arp_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content)
{   struct arp_header *arp_protocol;   /* ARP协议变量 */   u_short protocol_type;   /* 协议类型 */   u_short hardware_type;   /* 硬件类型 */   u_short operation_code;   /* 操作类型 */   u_char *mac_string;   /* 以太网地址 */   struct in_addr source_ip_address;   /* 源IP地址 */   struct in_addr destination_ip_address;   /* 目的IP地址 */   u_char hardware_length;   /* 硬件地址长度 */   u_char protocol_length;   /* 协议地址长度 */   printf("--------   ARP Protocol (Network Layer)    --------\n");   arp_protocol = (struct arp_header*)(packet_content + 14);   /*  * 获得ARP协议数据。注意在这里要跳过以太网数据部分,它的长度刚好是14,所以在这里加上14,是指针跳过14个字节  */   hardware_type = ntohs(arp_protocol->arp_hardware_type);   /* 获得硬件类型 */   protocol_type = ntohs(arp_protocol->arp_protocol_type);   /* 获得协议类型 */   operation_code = ntohs(arp_protocol->arp_operation_code);   /* 获得操作码 */   hardware_length = arp_protocol->arp_hardware_length;   /* 获得硬件地址长度 */   protocol_length = arp_protocol->arp_protocol_length;   /* 获得协议地址长度 */   printf("ARP Hardware Type:%d\n", hardware_type);   printf("ARP Protocol Type:%d\n", protocol_type);   printf("ARP Hardware Length:%d\n", hardware_length);   printf("ARP Protocol Length:%d\n", protocol_length);   printf("ARP Operation:%d\n", operation_code);   switch (operation_code) /* 根据操作码进行判断是ARP什么类型协议 */   {   case 1:   printf("ARP Request Protocol\n");   break;   /* 是ARP查询协议 */   case 2:   printf("ARP Reply Protocol\n");   break;   /* 是ARP应答协议 */   case 3:   printf("RARP Request Protocol\n");   break;   /* 是RARP查询协议 */   case 4:   printf("RARP Reply Protocol\n");   break;   /* 是RARP应答协议 */   default:   break;   }   printf("Ethernet Source Address is : \n");   mac_string = arp_protocol->arp_source_ethernet_address;   printf("%02x:%02x:%02x:%02x:%02x:%02x\n", *mac_string, *(mac_string + 1), *(mac_string + 2), *(mac_string + 3), *(mac_string + 4), *(mac_string + 5));   /* 获得源以太网地址 */   memcpy((void*) &source_ip_address, (void*) &arp_protocol->arp_source_ip_address, sizeof(struct in_addr));   printf("Source IP Address:%s\n", inet_ntoa(source_ip_address));   /* 获得源IP地址 */   printf("Ethernet Destination Address is : \n");   mac_string = arp_protocol->arp_destination_ethernet_address;   printf("%02x:%02x:%02x:%02x:%02x:%02x\n", *mac_string, *(mac_string + 1), *(mac_string + 2), *(mac_string + 3), *(mac_string + 4), *(mac_string + 5));   /* 获得目的以太网地址 */   memcpy((void*) &destination_ip_address, (void*) &arp_protocol->arp_destination_ip_address, sizeof(struct in_addr));   printf("Destination IP Address:%s\n", inet_ntoa(destination_ip_address));   /* 获得目的IP地址 */
}
/*
=======================================================================================================================
下面是回调函数,实现以太网协议分析
=======================================================================================================================  */
void ethernet_protocol_packet_callback(u_char *argument, const struct pcap_pkthdr *packet_header, const u_char *packet_content)
{   u_short ethernet_type;   /* 以太网类型 */   struct ether_header *ethernet_protocol;   /* 以太网协议变量 */   u_char *mac_string;   /* 以太网地址 */   static int packet_number = 1;   printf("**************************************************\n");   printf("The %d  ARP  packet is captured.\n", packet_number);   printf("--------   Ehternet Protocol (Link Layer)    --------\n");   ethernet_protocol = (struct ether_header*)packet_content;   /* 获得以太网协议数据 */   printf("Ethernet type is :\n");   ethernet_type = ntohs(ethernet_protocol->ether_type);   /* 获得以太网类型 */   printf("%04x\n", ethernet_type);   switch (ethernet_type) /* 根据以太网类型判断上层协议类型 */   {   case 0x0800:   printf("The network layer is IP protocol\n");   break;   case 0x0806:   printf("The network layer is ARP protocol\n");   break;   case 0x8035:   printf("The network layer is RARP protocol\n");   break;   default:   break;   }   printf("Mac Source Address is : \n");   mac_string = ethernet_protocol->ether_shost;   printf("%02x:%02x:%02x:%02x:%02x:%02x\n", *mac_string, *(mac_string + 1), *(mac_string + 2), *(mac_string + 3), *(mac_string + 4), *(mac_string + 5));   /* 获得源以太网地址 */   printf("Mac Destination Address is : \n");   mac_string = ethernet_protocol->ether_dhost;   printf("%02x:%02x:%02x:%02x:%02x:%02x\n", *mac_string, *(mac_string + 1), *(mac_string + 2), *(mac_string + 3), *(mac_string + 4), *(mac_string + 5));   /* 获得目的以太网地址 */   switch (ethernet_type)   {   case 0x0806:   arp_protocol_packet_callback(argument, packet_header, packet_content);   break;   /*  * 如果以太网类型是0x0806,表示上层协议是ARP协议,应该调用分析ARP协议的函数。注意此时的参数传递,全部是回调函数的参数,它代表的是同一个网络数据包,所以在这里,既分析此数据包的以太网协议部分,又分析来了此数据包的ARP协议部分。  */   default:   break;   }   printf("**************************************************\n");   packet_number++;
}
void main()
{   pcap_t *pcap_handle;   /* Libpcap句柄 */   char error_content[PCAP_ERRBUF_SIZE];   /* 错误信息 */   char *net_interface;   /* 网路接口 */   struct bpf_program bpf_filter;   /* bpf过滤规则 */   char bpf_filter_string[] = "arp";   /* 过滤规则字符串,这里表示本程序只是捕获所有ARP协议的网络数据包 */   bpf_u_int32 net_mask;   /* 网络掩码 */   bpf_u_int32 net_ip;   /* 网络地址 */   net_interface = pcap_lookupdev(error_content);   /* 获得网络接口 */   pcap_lookupnet(net_interface, &net_ip, &net_mask, error_content);   /* 获得网络地址和网络掩码 */   pcap_handle = pcap_open_live(net_interface, BUFSIZ, 1, 0, error_content);   /* 打开网路接口 */   pcap_compile(pcap_handle, &bpf_filter, bpf_filter_string, 0, net_ip);   /* 编译过滤规则 */   pcap_setfilter(pcap_handle, &bpf_filter);   /* 设置过滤规则 */   if (pcap_datalink(pcap_handle) != DLT_EN10MB)   return ;   pcap_loop(pcap_handle,  - 1, ethernet_protocol_packet_callback, NULL);   /* 注册回到函数,循环捕获数据包 */   pcap_close(pcap_handle);   /* 关闭Libpcap操作 */
}   

转载于:https://www.cnblogs.com/niulanshan/archive/2012/11/07/6175470.html

VC++实现防火墙过滤相关推荐

  1. iptables防火墙过滤规则

    iptables  包过滤 防火墙 firewall  防火墙工作在网络边缘(主机边缘)对于进出的网络数据包进行规则排查,并在匹配某规则时由规则定义的处理进行处理的功能组件 防火墙类型 根据工作区域不 ...

  2. linux防火墙过滤规则

    一.linux防火墙基础 防火墙分为硬件防火墙和软件防火墙. 1.概述 linux 防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙. 包过滤机制:netfil ...

  3. linux 防火墙过滤mac地址,OpenWrt设置mac地址过滤和使用Iptables防火墙禁止mac地址上网...

    本文介绍使用OpenWrt限制特定mac地址的方法,一种是使用无线网络的mac地址过滤,一种是使用Iptables防火墙阻止策略. 一.使用mac-filter功能限制mac地址上网 方法1.web界 ...

  4. (FortiGate)飞塔防火墙过滤指定会话并清理

    FG600D3918701304 # diagnose sys  session filter(设置过滤条件) vd                Index of virtual domain. - ...

  5. 基于VC++的包过滤防火墙系统设计与实现

    目录 摘要 I Abstract II 目录 III 1 绪论 1 1.1 研究背景 1 1.2 研究意义 2 1.3 课题内容 3 2 包过滤防火墙技术 4 2.1 包过滤防火墙技术简介 4 2.2 ...

  6. 使用 AIX TCP/IP 过滤功能设置防火墙

    简介 一个 POWER 服务器具有承载上百个 LPAR 或分区(一个分区就是操作系统安装的一个独立实例)的处理能力,这意味着,虚拟化功能让您能在一个物理机器中拥有上百个服务器.如果这上百个服务器在处理 ...

  7. 配置防火墙,过滤开放指定端口

    查看所有开放端口信息: [root@localhost datas]# netstat -anp Active Internet connections (servers and establishe ...

  8. ​防火墙(一)主机型防火墙

    防火墙(一)主机型防火墙 防火墙(二)SNAT和DNAT  防火墙(一)主机型防火墙 默认防火墙规则 拒绝与禁止一个数据包 IP防火墙的数据包传输 在IP防火墙中,有三个内建的过滤规则链被使用.所有到 ...

  9. 又一个防火墙的问题——content filtering

    最近有用户反映,不能使用WEB方式打开sina邮箱,登录SINA邮箱后,只是左上角出现四个链接,点任何东西都没反应,进不去邮箱. 以前也出现过这样的问题,当时是防火墙没有打开443端口服务,这次检查防 ...

最新文章

  1. RxJava 基础的使用
  2. 第三代测序之Pacific Biosciences
  3. html中双重id标签怎么写,PHP读取HTML并处理双重ID外观
  4. python 错误处理 assert
  5. 基于ZooKeeper的Dubbo简单抽样登记中心
  6. 回文字符串—回文子串—中心扩散法
  7. Linux idle基础
  8. 基于Flash的ECC纠错算法基本原理及软件C语言算法和硬件Verilog实现(PPT在主页可下载)
  9. skala view android,Skala Preview for mac
  10. 运行MYSQL数据库命令时connetion Timeout expired异常问题
  11. java 用ajax更新表单,ajax刷新表格,该如何处理
  12. python读写不同编码txt文件
  13. MOSEK优化包的安装、使用及注册:以Matlab中的二次规划为例
  14. 响应式Web设计帮助移动终端访问网站
  15. 小米深圳通服务器维护中,小米已开通深圳通功能 换手机还能退钱移卡
  16. shader篇-纹理-凹凸映射
  17. Unity 机器学习(ML-Agents) 基础
  18. 查找大于某个数的最小数
  19. (称重问题)假设你有8个球,其中一个略微重一些,但是找出这个球的惟一方法是将两个球放在天平上对比
  20. 不能用float、double 存储金额——BigDecimal详解

热门文章

  1. 1052. Linked List Sorting
  2. [转载]超酷代码-使用 ASP.NET AJAX 进行拖放
  3. 安装 Apache 2.4
  4. (1)PCIE接口应用领域(学无止境)
  5. (49)System Verilog 类中数组长度约束
  6. 在大公司天天调参数,感觉快废了
  7. 【C语言】Find The Single Dog(标志变量的使用)
  8. Linux内核网络协议栈3-创建socket(1)
  9. linux内核PID管理
  10. (4)散列函数设计:除留余数法