知识卡片

Netfilter五个钩子与iptables如何把底层回调抽象成高层规则

结构图卡

内容

[[Linux网络栈几乎全在内核空间的安全权衡]]描述的网络栈处理流程原本是 封闭固定的,Netfilter框架(Linux Kernel 2.4起)在网络层(IP协议)周围 埋下五个钩子,数据包流经时自动触发内核模块注册的回调函数,让程序代码 第一次有了介入协议栈处理的空间:PREROUTING(数据包进入协议栈后、路由 判断前触发,无论是否发往本机都会触发,常用于DNAT);INPUT(路由后确定 发往本机才触发,加工发往本地进程的数据);FORWARD(路由后确定不发往 本机才触发,处理转发数据);OUTPUT(本机程序发出的数据在路由前触发, 加工本地输出数据);POSTROUTING(从本机网卡发出前触发,无论是本机产生 还是转发的,常用于SNAT)。Netfilter本身只是回调机制,直接编码使用它 对系统管理员不友好,iptables的价值在于做了一层抽象:把常见管理意图 (DROP丢弃、REJECT拒绝、ACCEPT放行、MASQUERADE地址伪装、LOG记录等) 预先总结好,再按目的把这些行为归到五张有优先级的规则表里(raw→mangle→ nat→filter→security),每张表能用到的链与Netfilter钩子一一对应——这样 管理员只需按”目的”配置规则(比如”在POSTROUTING做SNAT”),而不必自己写 回调函数代码。iptables至今仍是容器通信的重要基础设施,如Kubernetes的 kube-proxy就依赖iptables完成ClusterIP到Pod的NAT转发。

结构图

flowchart LR
    A[数据包进入] --> B[PREROUTING: DNAT常用]
    B --> C{路由判断: 发往本机?}
    C -->|是| D[INPUT: 加工本地进程数据]
    C -->|否| E[FORWARD: 处理转发数据]
    F[本机程序发出] --> G[OUTPUT: 加工本地输出]
    D --> H[POSTROUTING: SNAT常用]
    E --> H
    G --> H
    H --> I[数据包发出]

参考来源

- 位置:《凤凰架构:构建可靠的大型分布式系统》第12章"容器间网络"12.1.2节 "干预网络通信"(源文件:_epub-src对应OEBPS/Text/chapter146.xhtml) - 结论依据:原文定义PREROUTING/INPUT/FORWARD/OUTPUT/POSTROUTING五个 Netfilter钩子的触发条件和典型用途,说明iptables把底层回调抽象为预置 行为和五张有优先级的规则表,并指出kube-proxy依赖iptables完成NAT, 直接支撑本卡片的结构梳理。 - 原始内容:这套名为Netfilter的框架……围绕网络层(IP协议)的周围, 埋下了五个钩子……iptables先把用户常用的管理意图总结成具体的行为预先 准备好,然后在满足条件时自动激活行为……kube-proxy,就依赖iptables 来完成ClusterIP到Pod的通信。