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

利用 Windows Filtering Platform API 開發簡易防火牆範例

     編輯:關於C++

前言:核心層封包過濾實作

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 與結構說明

API / 結構用途
PfCreateInterface建立封包過濾介面,設定預設允許/丟棄行為
PfBindInterfaceToIPAddress將介面綁定至特定 IPv4 位址
PF_FILTER_DESCRIPTOR定義單一過濾規則(來源/目的 IP、Port、協定、旗標)
PfAddFiltersToInterface將規則陣列套用至介面
PfRemoveFilterHandles / PfUnBindInterface / PfDeleteInterface依序移除規則、解除 IP 綁定、刪除介面,避免資源洩漏

注意事項與現代替代方案

  • 權限需求:需系統管理員權限執行。
  • 舊版 API:Pf* 系列屬舊版「封包篩選」架構,Windows Vista/Server 2008 後建議改用 WFP (Windows Filtering Platform),提供更豐富的呼叫點、動作與使用者模式/核心模式開發模型。
  • 驅動程式簽章:現代防火牆產品通常採用 WFP 核心模式 Callout Driver,需經過 WHQL 簽章。
  • 測試建議:在虛擬機或測試環境執行,避免鎖死主機網路。

結語

此範例展示核心層封包過濾的基本骨架。實務開發中需考慮規則優先序、狀態檢測、日誌記錄、效能影響及相容性測試。建議深入研讀 WFP 文件以開發生產級防火牆元件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved