Windows 提供封包過濾 API(pfapi.h/Fltdefs.h),可在核心層攔截/過濾網路封包。本文示範建立過濾介面、綁定 IP、新增 HTTP (TCP 80) 封鎖規則的完整流程。
#include
#include
// 需連結 iphlpapi.lib
int main() {
INTERFACE_HANDLE hInterface;
// 1. 建立過濾介面:預設動作皆為 DROP
PfCreateInterface(0,
PF_ACTION_DROP, // 轉發動作
PF_ACTION_DROP, // 回傳動作
FALSE, // 不啟用片段快取
TRUE, // 啟用介面
&hInterface);
// 2. 綁定本機 IP (範例 192.168.0.2)
BYTE localIp[] = {192, 168, 0, 2};
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
// 3. 定義過濾規則:封鎖 TCP 80 (HTTP)
FILTER_HANDLE fHandle;
PF_FILTER_DESCRIPTOR inFilter = {0};
inFilter.dwFilterFlags = FD_FLAGS_NOSYN;
inFilter.dwRule = 0;
inFilter.pfatType = PF_IPV4;
inFilter.SrcAddr = localIp;
inFilter.SrcMask = "\xff\xff\xff\xff";
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY;
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
inFilter.DstAddr = 0; // 任意目標 IP
inFilter.DstMask = 0;
inFilter.wDstPort = 80; // 目標埠 80
inFilter.wDstPortHighRange = 80;
inFilter.dwProtocol = FILTER_PROTO_TCP;
// 4. 將規則加入介面
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
// 測試點:此處 IE 應無法瀏覽網頁
// DebugBreak();
// 5. 清理:移除規則、解綁、刪除介面
PfRemoveFilterHandles(hInterface, 1, &fHandle);
PfUnBindInterface(hInterface);
PfDeleteInterface(hInterface);
return 0;
}
| 結構/函式 | 用途 |
|---|---|
PfCreateInterface | 建立封包過濾介面,指定預設轉發/丟棄動作。 |
PfBindInterfaceToIPAddress | 將介面綁定特定 IP 位址(可多 IP 多介面)。 |
PF_FILTER_DESCRIPTOR | 定義單條過濾規則:來源/目標 IP、埠、協定、旗標。 |
PfAddFiltersToInterface | 批次新增規則至介面,回傳規則控制碼陣列。 |
PfRemoveFilterHandles | 依控制碼移除規則。 |
PF_LOG 旗標或獨立記錄驅動,記錄被封鎖封包資訊。