首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

利用 Windows 封包過濾 API 撰寫簡易防火牆

     編輯:VC 教學

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依控制碼移除規則。

進階擴充方向

  • 動態規則管理:建立 GUI 讓使用者新增/刪除/啟用/停用規則,儲存至登錄檔/資料庫。
  • 日誌記錄:搭配 PF_LOG 旗標或獨立記錄驅動,記錄被封鎖封包資訊。
  • 應用層識別:結合 WFP (Windows Filtering Platform, Vista+) 依進程 ID/路徑過濾,比傳統封包過濾 API 更強大、支援 Callout 驅動。
  • 狀態檢測:維護連線狀態表,實現有狀態防火牆(SYN/ACK/FIN 追蹤)。

注意事項

  • 傳統封包過濾 API 於 Windows XP/Server 2003 後逐漸棄用,現代開發請改用 WFP (Windows Filtering Platform),提供使用者模式/核心模式 Callout、分層架構、效能更佳。
  • 核心模式代碼錯誤會導致系統藍畫面 (BSOD),測試務必在虛擬機/測試機進行。
  • 需管理員權限執行,且可能受驅動程式簽名強制策略限制(測試模式或簽名驅動)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved