使用 Vista 的 Windows 筛选平台 API 的防火墙






3.32/5 (19投票s)
关于使用 Vista 的 Windows 筛选平台编写简单防火墙的文章
引言
Windows Vista 包含一个全新且改进的包过滤引擎,称为 Windows 过滤平台 (WFP)。 至今,Windows 2000/XP/2003 为我们提供了用于实现简单防火墙或包过滤应用程序的包过滤 API。 然而,这些包过滤 API 在 Vista 中已被弃用,转而采用 WFP。 因此,本文档将展示如何使用 WFP API 来编写防火墙!
Windows 过滤平台 API
以下是我们将在编写防火墙时使用的一些 WFP API
FwpmEngineOpen0
- 此 API 用于与 Windows 包过滤引擎建立会话。FwpmSubLayerAdd0
- 此 API 向包过滤引擎添加一个新的子层。FwpmFilterAdd0
- 此 API 向子层添加过滤器(规则)。 这类似于PfAddFiltersToInterface
API。FwpmFilterDeleteById0
- 此 API 从子层删除现有的过滤器。FwpmSubLayerDeleteByKey0
- 此 API 删除由FwpmSubLayerAdd0
添加的子层。FwpmEngineClose0
- 此 API 关闭由FwpmEngineOpen0
打开的会话。
以下是使用上述 API 编写防火墙的步骤
- 使用
FwpmEngineOpen0
创建会话。 - 使用
FwpmSubLayerAdd0
添加一个子层。 - 现在,使用
FwpmFilterAdd0
添加过滤器。 如果您有“n
”个过滤器,则需要调用此 API “n
”次。
完成了! 现在,检查您是否可以通过 Web 浏览器访问被阻止的 IP 地址。
Using the Code
本文档包含一个示例类 (PacketFilter
类),它封装了 WFP API。 类的声明如下所示
class PacketFilter
{
private:
// Firewall engine handle.
HANDLE m_hEngineHandle;
// Firewall sublayer GUID.
GUID m_subLayerGUID;
// List of filters.
IPFILTERINFOLIST m_lstFilters;
// Method to get byte array format and hex format IP address from string format.
bool ParseIPAddrString( char* szIpAddr, UINT nStrLen,
BYTE* pbHostOrdr, UINT nByteLen, ULONG& uHexAddr );
// Method to create/delete packet filter interface.
DWORD CreateDeleteInterface( bool bCreate );
// Method to bind/unbind to/from packet filter interface.
DWORD BindUnbindInterface( bool bBind );
// Method to add/remove filter.
DWORD AddRemoveFilter( bool bAdd );
public:
// Constructor.
PacketFilter();
// Destructor.
~PacketFilter();
// Method to add IP addresses to m_lstFilters list.
void AddToBlockList( char* szIpAddrToBlock );
// Method to start packet filter.
BOOL StartFirewall();
// Method to stop packet filter.
BOOL StopFirewall();
};
按照以下步骤在您的应用程序中使用 PacketFilter
类
- 实例化
PacketFilter
类的一个对象。 - 使用
public
方法PacketFilter::AddToBlockList
添加要阻止的 IP 地址。 - 使用
PacketFilter::StartFirewall public
方法启动防火墙。 - 最后,通过调用
PacketFilter::Stopfirewall public
方法终止防火墙。
注意事项
您需要 Windows SDK 2008(可在 此处 下载)才能开发使用 Windows 过滤平台的应用程序。
Visual C++ 6.0 与 Windows SDK 2008 不兼容。
历史
- 2008 年 8 月 31 日:初始发布