Windows 提供了 Windows Filtering Platform (WFP) 及舊版 PfCreateInterface 等 API,允許開發者在核心層攔截、檢查、封鎖網路封包。本文整理一個基於 C++ Builder 5 編譯通過的精簡範例,示範如何建立過濾介面、綁定 IP、新增規則封鎖 HTTP (Port 80) 流量,並包含完整資源釋放流程。
/*
利用作業系統提供的 API 編寫防火牆.
相關 API 說明請參考 Microsoft MSDN Library
編譯環境:C++ Builder 5
需連結 "iphlpapi.lib"
*/
#pragma hdrstop
#include <windows.h>
#include <Fltdefs.h>
#pragma argsused
int main(int argc, char* argv[])
{
// 1. 建立網路封包過濾介面
INTERFACE_HANDLE hInterface;
PfCreateInterface(
0,
PF_ACTION_DROP, // 預設動作:丟棄 (輸入)
PF_ACTION_DROP, // 預設動作:丟棄 (輸出)
FALSE,
TRUE,
&hInterface
);
// 2. 綁定需過濾的本機 IP 位址
BYTE localIp[] = {192, 168, 0, 2};
PfBindInterfaceToIPAddress(hInterface, PF_IPV4, localIp);
// 3. 定義過濾規則:封鎖 TCP Port 80 (HTTP)
FILTER_HANDLE fHandle;
PF_FILTER_DESCRIPTOR inFilter = {0};
inFilter.dwFilterFlags = FD_FLAGS_NOSYN;
inFilter.dwRule = 0;
inFilter.pfatType = PF_IPV4;
inFilter.SrcAddr = *(DWORD*)localIp; // 來源 IP (本機)
inFilter.SrcMask = 0xFFFFFFFF; // 來源子網遮罩
inFilter.wSrcPort = FILTER_TCPUDP_PORT_ANY;
inFilter.wSrcPortHighRange = FILTER_TCPUDP_PORT_ANY;
inFilter.DstAddr = 0; // 任意目的 IP
inFilter.DstMask = 0;
inFilter.wDstPort = 80; // 目的 Port 80
inFilter.wDstPortHighRange = 80;
inFilter.dwProtocol = FILTER_PROTO_TCP; // TCP 協定
// 4. 將規則加入介面
PfAddFiltersToInterface(hInterface, 1, &inFilter, 0, NULL, &fHandle);
// 此處可設中斷點,測試 IE 是否無法瀏覽網頁
// 5. 清理資源:移除規則、解除綁定、刪除介面
PfRemoveFilterHandles(hInterface, 1, &fHandle);
PfUnBindInterface(hInterface);
PfDeleteInterface(hInterface);
return 0;
}
| API / 結構 | 用途 |
|---|---|
PfCreateInterface | 建立封包過濾介面,設定預設允許/丟棄行為 |
PfBindInterfaceToIPAddress | 將介面綁定至特定 IPv4 位址 |
PF_FILTER_DESCRIPTOR | 定義單一過濾規則(來源/目的 IP、Port、協定、旗標) |
PfAddFiltersToInterface | 將規則陣列套用至介面 |
PfRemoveFilterHandles / PfUnBindInterface / PfDeleteInterface | 依序移除規則、解除 IP 綁定、刪除介面,避免資源洩漏 |
Pf* 系列屬舊版「封包篩選」架構,Windows Vista/Server 2008 後建議改用 WFP (Windows Filtering Platform),提供更豐富的呼叫點、動作與使用者模式/核心模式開發模型。此範例展示核心層封包過濾的基本骨架。實務開發中需考慮規則優先序、狀態檢測、日誌記錄、效能影響及相容性測試。建議深入研讀 WFP 文件以開發生產級防火牆元件。