知识卡片
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的通信。