个人防火墙

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

基本API函数:

//创建一个接口

DWORD PfCreateInterface (

DWORD dwName,//指定接口名称。零表示一个新的接口,其他

值指向一个潜在的共享接口。

PFFORWARD_ACTION inAction,//为进入主机的数据包指定一个默认的动作,

可以是转发(PF_ACTION_FORWARD)或者丢

弃(PF_ACTION_DROP)。

PFFORWARD_ACTION outAction,//为主机发出的数据包指定一个默认的动作。

BOOL bUseLog, //是否为接口绑定一个记录。

BOOL bMustBeUnique,//指定接口是否可共享,TRUE表示不能共享。

INTERFACE_HANDLE* ppInterface//指向接口的句柄,供以后调用。

);

//将IP地址和接口绑定

DWORD PfBindInterfaceToIPAddress (

INTERFACE_HANDLE pInterface,//为接口和IP协议栈的关联指定一个在句柄。

PFADDRESSTYPE pfatType,//接口使用的协议类型,参数类型

//为PFADDRESSTYPE。

/* typedef enum _PfAddresType

{

PF_IPV4,

PF_IPV6

}PFADDRESSTYPE, *PPFADDRESSTYPE;*/ PBYTE IPAddress//用bytes数组保存的IP地址的指针。

);

在这个函数中,最后一个参数指的是本机的IP,即过滤规则需要应用到的IP地址。

//向接口中添加一个过滤规则,需要先填充结构体

DWORD PfAddFiltersToInterface (

INTERFACE_HANDLE ih,//为接口指定一个句柄。

DWORD cInFilters,//输入过滤器,值为0表示下个参数无效。

PPF_FILTER_DESCRIPTOR pfiltIn,//指向一个过滤器,作为“发出过滤器”。

DWORD cOutFilters, //输出过滤器,值为0表示下个参数无效。

PPF_FILTER_DESCRIPTOR pfiltOut,//指向一个过滤器,作为“接受过滤器”。

PFILTER_HANDLE pfHandle//指向一个接收“过滤器句柄数组”的

buffer,若不需要置NULL。

);

介绍了上面的函数,我们就很明确的知道:在调用PfAddFiltersToInterface ( )函数之前,需要填充下面的结构体。

Typedef struct _PF_FILTER_DESCRIPTOR {

DWORD dwFilterFlags;//FD_FLAGS_NOSYN,只有这一个值。

DWORD dwRule;//为过滤器指定一个规则。通常是0。

PFADDRESSTYPE pfatType;//地址类型Ipv4 Ipv6。

PBYTE SrcAddr; //源地址

PBYTE SrcMask; //源子网掩码

PBYTE DstAddr; //目的地址

PBYTE DstMask;//目的子网掩码

DWORD dwProtocol; //协议类型

DWORD fLateBound; //通常是0或不填

WORD wSrcPort;//源端口号

WORD wDstPort; //目的端口号

WORD wSrcPortHighRange;//源端口号范围

WORD wDstPortHighRange;//目的端口号范围

} PF_FILTER_DESCRIPTOR, *PPF_FILTER_DESCRIPTOR;

//从接口中移除过滤器

DWORD PfRemoveFiltersFromInterface (

INTERFACE_HANDLE ih, //接口句柄

DWORD cInFilters, //由参数pfilIn指定的输入过滤器的描述

PPF_FILTER_DESCRIPTOR pfiltIn,//输入过滤器

DWORD cOutFilters, //由参数pfilOut指定的输出过滤器的描述PPF_FILTER_DESCRIPTOR pfiltOut//输出过滤器

);

//删除由PfCreateInterface 函数创建的接口

DWORD PfDeleteInterface (

INTERFACE_HANDLE pInterface//接口句柄

);

讲完了核心的函数,下面来看一下调用过程。

首先我们需要用PfCreateInterface ( )创建一个过滤接口;然后来就需要使用PfBindInterfaceToIPAddress ( )函数将需要执行过滤动作的IP地址和该接口绑定,这就使得一面的操作直接面向一个过滤接口而不是某一个特定的IP 地址;接着要填充过滤器结构体struct _PF_FILTER_DESCRIPTOR,这一步和下一步是核心中的核心;下一步是向已经创建好的接口中添加过滤器,要用到的函数是PfAddFiltersToInterface ( )。至此,我们已经对某一个IP地址设置了过滤规则。

在过滤结束或者程序结束的时候,我们需要移除这些过滤器,并删除接口,这就要用到PfRemoveFiltersFromInterface ( )和PfDeleteInterface ( )两个函数。

了解了这些函数,就可以写一个简单控制台程序来对某一个IP地址进行过滤。但是这并不能称之为防火墙,所以接下来我就对这些函数进行了封装和整合,并维护了一张“IP——接口”的对应表,这就使防火墙能够对一组过滤规则进行过滤。

1.1.1CpacketFilterInterface类和CpacketFilter类

这两个类的作用是对以上介绍的API函数进行封装和整合,使之能够完成我们的防火墙需要的功能(为了阅读代码更清晰,以下代码部分字体和颜色均做了特殊处理)。

CpacketFilterInterface类:

class CPacketFilterInterface

{

public:

CpacketFilterInterface ();

virtual ~CpacketFilterInterface ();

public:

int Create (unsigned long ip, PFFORWARD_ACTION DefaultAction);//创建接口

INTERFACE_HANDLE hInterface; //接口句柄

};

int CPacketFilterInterface::Create(unsigned long ip, PFFORWARD_ACTION defaultAction)

{

// 创建接口,设置默认动作。

DWORD errorCode=PfCreateInterface (0,

defaultAction,

defaultAction,

FALSE,

TRUE,

&hInterface);

if (errorCode!=NO_ERROR)

相关文档
最新文档