个人防火墙
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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)