萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux 防火牆核心架構深度解析:Netfilter 框架、五大鉤子與 iptables 三表五鏈

Netfilter:核心級封包處理框架

Netfilter 不是防火牆本身,而是 Linux 核心內建的封包處理框架。它在網路協議棧的關鍵路徑上預留了 5 個鉤子函數,允許核心模組註冊回調函數攔截、檢查、修改、丟棄或重新導向封包。iptables、nftables、ebtables 等用戶空間工具皆通過此框架實現規則下發。

IPv4 五大標準鉤子點

封包流經協議棧時,依序觸發 (對應 include/uapi/linux/netfilter_ipv4.h):

  1. NF_INET_PRE_ROUTING (0):封包剛進入網路層,經過基本校驗 (版本、校驗和、長度) 後。
    ➤ DNAT (目的地址轉換)、透明代理、策略路由標記在此階段處理。
  2. NF_INET_LOCAL_IN (1):經路由判定目標為本機的封包。
    ➤ INPUT 鏈 (防火牆過濾)、本機服務處理。
  3. NF_INET_FORWARD (2):需轉發給其他主機的封包 (路由器/網關模式)。
    ➤ FORWARD 鏈 (防火牆過濾)。
  4. NF_INET_LOCAL_OUT (3):本機進程發出的封包。
    ➤ OUTPUT 鏈 (防火牆過濾)、SNAT/DNAT (本機發起連接的地址轉換)。
  5. NF_INET_POST_ROUTING (4):封包即將離開網卡介面前的最後一站。
    ➤ SNAT (源地址轉換/Masquerade)、POSTROUTING 鏈 (封包修改/標記)。

鉤子回調函數返回值 (判決)

返回值含義後續動作
NF_ACCEPT接受繼續正常傳遞至下一鉤子或協議棧
NF_DROP丟棄封包消失,不再傳遞,不發送錯誤回應
NF_STOLEN模組接管模組自行處理 (如發送 ICMP 回應、重新注入),核心不再處理
NF_QUEUE排隊至用戶空間交給用戶態程式 (如 nfqueue、Suricata IPS) 處理,再決定放行/丟棄
NF_REPEAT重新調用再次調用同一鉤子 (慎用,易死循環)

iptables:基於 Netfilter 的規則引擎 (傳統經典)

iptables 將規則組織為 4 張表 (Table),每表包含多條 鏈,鏈對應鉤子點。封包按優先級遍歷表與鏈。

四表優先級順序 (由高到低)

  1. raw:最高優先級。NOTRACK 關閉連接追蹤,TRACE 除錯。鏈:PREROUTING, OUTPUT。
  2. mangle:封包修改/標記 (TOS, TTL, MARK, DSCP)。鏈:全部 5 鉤子 (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING)。
  3. nat:地址轉換 (SNAT/DNAT/MASQUERADE/REDIRECT)。僅首封包遍歷,後續封包依連接追蹤自動處理。鏈:PREROUTING (DNAT), INPUT (本機 DNAT), OUTPUT (本機 SNAT/DNAT), POSTROUTING (SNAT)。
  4. filter:預設表,封包過濾 (ACCEPT/DROP/REJECT/LOG)。鏈:INPUT, FORWARD, OUTPUT。

五鏈對應鉤子點

PREROUTING  --> NF_INET_PRE_ROUTING    (DNAT, mangle, raw)
INPUT       --> NF_INET_LOCAL_IN       (filter, mangle)
FORWARD     --> NF_INET_FORWARD        (filter, mangle)
OUTPUT      --> NF_INET_LOCAL_OUT      (filter, nat, mangle, raw)
POSTROUTING --> NF_INET_POST_ROUTING   (SNAT, mangle)

現代繼任者:nftables

Linux 3.13+ 引入 nftables,統一替代 iptables/ip6tables/arptables/ebtables:

  • 單一工具 nft 管理 IPv4/IPv6/ARP/Ethernet 規則。
  • 原生支援集合、字典、映射、動態規則更新 (無需刷新整張表)。
  • 核心內部使用虛擬機執行規則 (NFT VM),效能優於 iptables 線性遍歷。
  • 語法更簡潔強大:nft add rule ip filter input tcp dport 22 accept。

CentOS 8+/RHEL 8+/Debian 10+/Ubuntu 20.04+ 已預設切換 nftables (iptables 為兼容層 iptables-nft)。

開發者介入:編寫核心模組掛鉤

使用 nf_register_net_hook() (現代 API,支援網路命名空間) 註冊 struct nf_hook_ops:

static unsigned int my_hook(void *priv, struct sk_buff *skb, const struct nf_hook_state *state) {
    // 檢查/修改 skb
    return NF_ACCEPT; // 或 NF_DROP 等
}

static struct nf_hook_ops nfho = {
    .hook     = my_hook,
    .pf       = NFPROTO_IPV4,
    .hooknum  = NF_INET_PRE_ROUTING,
    .priority = NF_IP_PRI_FIRST, // 優先級
};

int init_module() { return nf_register_net_hook(&init_net, &nfho); }
void cleanup_module() { nf_unregister_net_hook(&init_net, &nfho); }

總結

理解 Netfilter 五大鉤子點與 iptables 四表五鏈的對應關係,是掌握 Linux 網路封包處理、編寫高效防火牆規則、開發核心網路模組、排查疑難網路問題的理論基石。現代運維應向 nftables 遷移,但底層 Netfilter 架構不變。

copyright © 萬盛學電腦網 all rights reserved