使用WFP阻止特定端口时出现0x80320002错误求助
解决WFP阻止特定端口时出现0x80320002错误的问题
错误0x80320002对应FWP_E_FILTER_CONDITION_NOT_FOUND,原因是你在ALE_AUTH_CONNECT层使用了不属于该层的条件常量:FWPM_CONDITION_IP_DESTINATION_PORT是传输层(如FWPM_LAYER_OUTBOUND_TRANSPORT_V4)的条件,并不适用于ALE(应用层强制)层。ALE层有专属的端口条件常量。
修正步骤
1. 使用ALE层的远程端口条件
将条件字段替换为FWPM_CONDITION_ALE_REMOTE_PORT,这才是ALE层匹配目标端口的正确常量。
2. (推荐)添加传输协议条件
端口依赖传输层协议(TCP/UDP),添加协议条件可以精确控制要阻止的协议类型(比如只阻止TCP 443,而非所有协议的443端口)。
修正后的完整代码示例
#include <Windows.h> #include <fwpmu.h> #include <stdio.h> #pragma comment(lib, "Fwpuclnt") int main() { HANDLE hEngine = NULL; DWORD status = FwpmEngineOpen(nullptr, RPC_C_AUTHN_DEFAULT, nullptr, nullptr, &hEngine); if (status != ERROR_SUCCESS) { printf("FwpmEngineOpen failed: 0x%X\n", status); return 1; } FWPM_FILTER filter = {0}; WCHAR filterName[] = L"Block outbound TCP 443 port"; filter.displayData.name = filterName; filter.action.type = FWP_ACTION_BLOCK; filter.weight.type = FWP_UINT8; filter.weight.uint8 = 0x80; // 设置权重,确保优先级合理 // 配置筛选器条件:远程端口443 + TCP协议 FWPM_FILTER_CONDITION conditions[2] = {0}; // 条件1:远程端口等于443 conditions[0].fieldKey = FWPM_CONDITION_ALE_REMOTE_PORT; conditions[0].matchType = FWP_MATCH_EQUAL; conditions[0].conditionValue.type = FWP_UINT16; conditions[0].conditionValue.uint16 = 443; // 条件2:协议为TCP(6),如果要阻止UDP则改为17 conditions[1].fieldKey = FWPM_CONDITION_ALE_IP_PROTOCOL; conditions[1].matchType = FWP_MATCH_EQUAL; conditions[1].conditionValue.type = FWP_UINT8; conditions[1].conditionValue.uint8 = 6; filter.filterCondition = conditions; filter.numFilterConditions = 2; // 添加IPv4筛选器 filter.layerKey = FWPM_LAYER_ALE_AUTH_CONNECT_V4; status = FwpmFilterAdd(hEngine, &filter, nullptr, nullptr); if (status != ERROR_SUCCESS) { printf("FwpmFilterAdd (IPv4) failed: 0x%X\n", status); } // 添加IPv6筛选器 filter.layerKey = FWPM_LAYER_ALE_AUTH_CONNECT_V6; status = FwpmFilterAdd(hEngine, &filter, nullptr, nullptr); if (status != ERROR_SUCCESS) { printf("FwpmFilterAdd (IPv6) failed: 0x%X\n", status); } FwpmEngineClose(hEngine); return 0; }
额外注意事项
- 运行程序需要管理员权限,WFP操作属于系统级配置,普通权限无法完成。
- 记得添加错误检查,方便排查后续问题(原代码未处理API返回值,调试时很重要)。
- 如果需要阻止所有协议的443端口,可以移除协议条件,但这种场景很少见,通常建议明确指定协议。
内容的提问来源于stack exchange,提问作者Jaymba
相关产品推荐
相关产品推荐

