iptables / Netfilter

Netfilter 是 Linux 内核中的数据包过滤框架(内核态),iptables 是它的用户态配置工具。两者合称 iptables/Netfilter,是 Linux 防火墙和网络地址转换(NAT)的核心基础设施。LVS 的 ipvs 模块也构建在 Netfilter 框架之上。

五链四表

五条钩子链(Chain)

数据包经过内核时会依次触发五个挂载点:

PREROUTING → [路由决策] → INPUT(本机)
                         → FORWARD(转发)
        ← [路由决策] ← OUTPUT
        → POSTROUTING
触发时机方向
PREROUTING包刚进入内核,路由决策前入站
INPUT路由决策后,发往本机的包入站
FORWARD路由决策后,需要转发的包转发
OUTPUT本机发出的包出站
POSTROUTING包即将离开内核出站

四张规则表(Table)

功能挂载链常用模块
filter包过滤(放行/拒绝)INPUT, FORWARD, OUTPUT-
nat地址转换PREROUTING, POSTROUTING, OUTPUTSNAT, DNAT
mangle修改包头部所有链TOS, TTL
raw跳过连接跟踪PREROUTING, OUTPUTNOTRACK

数据包流向完整路径

① PREROUTING (raw/mangle/nat)
  ↓
② 路由决策(判断目标是否本机)
  ├→ ❌ 非本机 → FORWARD (mangle/filter) → POSTROUTING (mangle/nat) → 出站
  └→ ✅ 本机 → INPUT (mangle/filter) → [本机进程]
                                         ↓
                                  OUTPUT (raw/mangle/nat/filter) → POSTROUTING (mangle/nat) → 出站

核心实践

规则管理

iptables -A INPUT -p tcp --dport 22 -j ACCEPT   # 放行 SSH
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT  # 放行已建立连接
iptables -P INPUT DROP                           # 默认拒绝(先放行 SSH!)
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 公网IP  # SNAT 上网共享
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 内网IP:8080  # DNAT 端口映射

连接跟踪(Conntrack)

  • ESTABLISHED/RELATED 规则使返回流量自动放行,命中率 >90%
  • 是防火墙性能优化的关键
  • 查看:cat /proc/net/nf_conntrack

NAT

类型方向典型场景
SNAT源地址转换(出站)内网上网共享(MASQUERADE)
DNAT目标地址转换(入站)端口映射、公网→内网

与 LVS 的关系

LVS 的 ipvs 模块工作在 Netfilter 框架之上(INPUT 链前置),在 PREROUTING 链之后、INPUT/FORWARD 之前拦截并转发数据包。这也是 LVS 如此高效的原因之一——它在内核层直接操作,不经过完整的协议栈。

相关页面