为何WFP配置多个FWP_MATCH_NOT_EQUAL远程IP条件仍触发标注?
WFP多IP排除失效问题排查与解决
问题描述
使用Windows Filtering Platform(WFP)基于远程IP地址过滤流量,配置FWPM_CONDITION_IP_REMOTE_ADDRESS条件并采用FWP_MATCH_NOT_EQUAL规则排除特定IP:
filter->filterCondition[0].conditionValue.uint32 = 0x614DE692; // 对应97.77.230.146 filter->filterCondition[1].conditionValue.uint32 = 0x614DE695; // 对应97.77.230.149
添加两个条件后,来自这两个IP的流量仍会触发标注,预期应因匹配FWP_MATCH_NOT_EQUAL被排除。
失效核心原因
WFP的多过滤条件默认采用**逻辑与(AND)**逻辑,当前配置的实际含义是:
远程IP不等于97.77.230.146 并且 远程IP不等于97.77.230.149
由于一个IP不可能同时等于两个不同值,所有流量(包括这两个目标IP)都会满足该条件,因此触发标注。
正确排除多个IP的实现方案
方案1:创建独立过滤规则(适合少量IP)
为每个需排除的IP单独创建过滤规则,使用FWP_MATCH_EQUAL匹配目标IP,并设置规则动作为允许/跳过标注,同时确保这些规则的优先级高于你的标注规则。
示例代码片段:
// 排除97.77.230.146的规则 FWPM_FILTER filter1 = {0}; filter1.filterCondition[0].fieldKey = FWPM_CONDITION_IP_REMOTE_ADDRESS; filter1.filterCondition[0].matchType = FWP_MATCH_EQUAL; filter1.filterCondition[0].conditionValue.type = FWP_UINT32; filter1.filterCondition[0].conditionValue.uint32 = 0x614DE692; filter1.action.type = FWP_ACTION_PERMIT; // 根据需求设置为跳过标注的动作 filter1.weight = FWP_UINT64_MAX; // 设置更高优先级,确保优先匹配 // 排除97.77.230.149的规则 FWPM_FILTER filter2 = {0}; filter2.filterCondition[0].fieldKey = FWPM_CONDITION_IP_REMOTE_ADDRESS; filter2.filterCondition[0].matchType = FWP_MATCH_EQUAL; filter2.filterCondition[0].conditionValue.type = FWP_UINT32; filter2.filterCondition[0].conditionValue.uint32 = 0x614DE695; filter2.action.type = FWP_ACTION_PERMIT; filter2.weight = FWP_UINT64_MAX;
方案2:使用IP集合(适合大量IP)
通过WFP的IP集合对象批量管理需排除的IP,搭配FWP_MATCH_NOT_IN_SET条件实现批量排除:
- 创建包含所有目标IP的IP集合
- 配置过滤条件为
FWPM_CONDITION_IP_REMOTE_ADDRESS+FWP_MATCH_NOT_IN_SET - 将集合关联到过滤条件中
示例代码片段:
// 创建IPv4集合,包含需排除的IP FWPM_IP_SET ipSet = {0}; ipSet.type = FWP_IP_V4; ipSet.ipv4Count = 2; ipSet.ipv4 = (FWP_UINT32*)malloc(2 * sizeof(FWP_UINT32)); ipSet.ipv4[0] = 0x614DE692; ipSet.ipv4[1] = 0x614DE695; // 创建过滤规则:仅非集合内的IP触发标注 FWPM_FILTER filter = {0}; filter.filterCondition[0].fieldKey = FWPM_CONDITION_IP_REMOTE_ADDRESS; filter.filterCondition[0].matchType = FWP_MATCH_NOT_IN_SET; filter.filterCondition[0].conditionValue.type = FWP_IP_SET; filter.filterCondition[0].conditionValue.ipSet = &ipSet; filter.action.type = FWP_ACTION_BLOCK; // 替换为你的标注动作
内容的提问来源于stack exchange,提问作者TienThanh
相关产品推荐
相关产品推荐

