Skip to content

iptables 从入门到精通

目标读者:Linux 运维、Kubernetes 运维、网络工程师、DevOps
前置知识:Linux 基础、TCP/IP 协议基础
教材版本:v1.0


目录

  1. iptables 是什么
  2. Netfilter 框架:iptables 的底层支撑
  3. 四表五链:iptables 的核心结构
  4. iptables 基本命令
  5. filter 表:防火墙过滤
  6. nat 表:网络地址转换
  7. mangle 表:报文修改
  8. raw 表:连接跟踪豁免
  9. iptables 匹配条件详解
  10. iptables 目标动作详解
  11. NAT 实战:SNAT 与 DNAT
  12. iptables 状态机制 conntrack
  13. iptables 在 Kubernetes 中的应用 13A. iptables + Docker 网络 13B. iptables + Calico
  14. 性能优化与注意事项
  15. 故障排查实战
  16. nftables 与 iptables 的未来
  17. 附录:速查表

第1章 iptables 是什么

1.1 一句话定义

iptables 是 Linux 内核 Netfilter 框架的用户态配置工具,用于定义数据包过滤、网络地址转换(NAT)、报文修改等规则。

1.2 iptables 能做什么

功能说明
防火墙允许/拒绝特定 IP、端口、协议的流量
NATSNAT(源地址转换)、DNAT(目的地址转换)、MASQUERADE
端口转发将某个端口的流量转发到另一个地址/端口
流量整形修改报文 TTL、TOS、MARK 等
连接跟踪基于连接状态做放行/拦截
Kubernetes 网络kube-proxy 通过 iptables 实现 Service 负载均衡

1.3 iptables 不能做什么

  • 不能单独做七层代理(需要配合 nginx/haproxy)
  • 不能替代专业防火墙的全部功能(如入侵检测)
  • 不适合超大流量场景(对比 DPDK、XDP)

第2章 Netfilter 框架:iptables 的底层支撑

2.1 Netfilter 是什么

Netfilter 是 Linux 内核中的网络包处理框架,工作在内核态。iptables 只是 Netfilter 的用户态接口之一。

2.2 数据包在内核中的流转路径

                    ┌─────────────┐
                    │   进入接口    │
                    └──────┬──────┘


                    ┌─────────────┐
                    │  PREROUTING │  (路由前)
                    └──────┬──────┘

              ┌────────────┼────────────┐
              │            │            │
              ▼            ▼            ▼
        ┌─────────┐   ┌─────────┐   ┌─────────┐
        │ 本机进程 │   │ 转发    │   │ 本机发出 │
        │ INPUT   │   │ FORWARD │   │ OUTPUT  │
        └────┬────┘   └────┬────┘   └────┬────┘
             │             │             │
             │             ▼             │
             │      ┌─────────────┐      │
             │      │ POSTROUTING │      │
             │      │  (路由后)  │      │
             │      └──────┬──────┘      │
             │             │             │
             ▼             ▼             ▼
        ┌─────────┐   ┌─────────┐   ┌─────────┐
        │ 本机处理 │   │ 发出接口  │   │ 发出接口  │
        └─────────┘   └─────────┘   └─────────┘

2.3 五个钩子点(Hook Points)

钩子点触发时机
PREROUTING数据包进入网卡后,路由决策前
INPUT路由到本机进程
FORWARD路由到另一个接口转发
OUTPUT本机进程发出的包,路由决策后
POSTROUTING数据包离开网卡前

第3章 四表五链:iptables 的核心结构

3.1 四表

表名作用常用链
filter过滤数据包INPUT、FORWARD、OUTPUT
nat网络地址转换PREROUTING、POSTROUTING、OUTPUT
mangle修改报文头部五链均可
raw豁免连接跟踪PREROUTING、OUTPUT

还有一个 security 表用于 SELinux,实际很少直接使用。

3.2 五链

链名默认所在的表处理对象
PREROUTINGraw、mangle、nat所有进入本机的包
INPUTmangle、filter路由到本机的包
FORWARDmangle、filter需要本机转发的包
OUTPUTraw、mangle、nat、filter本机进程发出的包
POSTROUTINGmangle、nat所有离开本机的包

3.3 表与链的关系

                    ┌─────────────┐
                    │ PREROUTING  │  ← raw, mangle, nat
                    └──────┬──────┘

              ┌────────────┼────────────┐
              │            │            │
              ▼            ▼            ▼
        ┌─────────┐   ┌─────────┐   ┌─────────┐
        │  INPUT  │   │ FORWARD │   │ OUTPUT  │
        │ mangle  │   │ mangle  │   │ raw     │
        │ filter  │   │ filter  │   │ mangle  │
        │         │   │         │   │ nat     │
        │         │   │         │   │ filter  │
        └────┬────┘   └────┬────┘   └────┬────┘
             │             │             │
             │             ▼             │
             │      ┌─────────────┐      │
             │      │ POSTROUTING │      │
             │      │ mangle, nat │      │
             │      └──────┬──────┘      │
             │             │             │
             ▼             ▼             ▼

3.4 规则匹配顺序

  1. 数据包进入某条链
  2. 按表的优先级依次处理:raw → mangle → nat → filter
  3. 同一表内按规则从上到下匹配
  4. 匹配到规则后执行目标动作(ACCEPT、DROP、DNAT 等)
  5. 如果没有匹配,执行链的默认策略(policy)

第4章 iptables 基本命令

4.1 命令格式

bash
iptables [-t 表名] 命令 [链名] [匹配条件] [目标动作]

4.2 常用命令

命令说明
-A追加规则(Append)
-I插入规则(Insert)
-D删除规则(Delete)
-R替换规则(Replace)
-L列出规则(List)
-F清空链(Flush)
-X删除自定义链
-N新建自定义链
-P设置默认策略(Policy)
-S以命令格式显示规则
-Z清空计数器

4.3 查看规则

bash
# 查看 filter 表所有规则
iptables -L -n -v

# 查看指定表
iptables -t nat -L -n -v

# 查看指定链
iptables -t nat -L PREROUTING -n -v

# 显示规则编号
iptables -L INPUT --line-numbers

# 以命令格式显示(便于导出脚本)
iptables -S

4.4 添加与删除规则

bash
# 追加规则到 INPUT 链末尾
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 插入规则到 INPUT 链第一条
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

# 删除指定规则
iptables -D INPUT -p tcp --dport 80 -j ACCEPT

# 按编号删除
iptables -D INPUT 2

# 清空某条链
iptables -F INPUT

# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

4.5 保存与恢复

bash
# CentOS/RHEL
iptables-save > /etc/sysconfig/iptables
iptables-restore < /etc/sysconfig/iptables

# Debian/Ubuntu
iptables-save > /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4

# 安装持久化工具
apt-get install iptables-persistent

第5章 filter 表:防火墙过滤

5.1 filter 表的作用

filter 表是最常用的表,用于决定数据包是否放行、丢弃或拒绝。

5.2 三种默认目标动作

动作说明
ACCEPT允许数据包通过
DROP静默丢弃数据包,不返回任何信息
REJECT拒绝数据包,并返回 ICMP 错误

5.3 简单防火墙示例

bash
# 清空现有规则
iptables -F
iptables -X

# 默认策略:拒绝输入和转发,允许输出
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许已建立连接和相关连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT

# 允许 SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 允许 HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 允许 ICMP(ping)
iptables -A INPUT -p icmp -j ACCEPT

5.4 自定义链

bash
# 创建自定义链
iptables -N WEB_TRAFFIC

# 在自定义链中添加规则
iptables -A WEB_TRAFFIC -p tcp --dport 80 -j ACCEPT
iptables -A WEB_TRAFFIC -p tcp --dport 443 -j ACCEPT

# 跳转到自定义链
iptables -A INPUT -j WEB_TRAFFIC

# 删除自定义链前需要先清空并解引用
iptables -F WEB_TRAFFIC
iptables -X WEB_TRAFFIC

第6章 nat 表:网络地址转换

6.1 NAT 的作用

NAT(Network Address Translation)用于修改数据包的源 IP 或目的 IP。

6.2 NAT 三种类型

类型修改位置典型应用
SNAT源 IP内网共享上网
DNAT目的 IP端口映射、负载均衡
MASQUERADE动态源 IPPPPoE、动态公网 IP

6.3 SNAT 示例

bash
# 将内网 192.168.1.0/24 访问外网的源 IP 改为公网 IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 1.2.3.4

6.4 MASQUERADE 示例

bash
# 动态公网 IP 场景(如拨号上网)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

6.5 DNAT 示例

bash
# 将访问公网 1.2.3.4:8080 的流量转发到内网 192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 --dport 8080 -j DNAT --to-destination 192.168.1.100:80

6.6 端口转发示例

bash
# 将访问本机 8080 端口的流量转发到 192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80

# 同时需要 SNAT 确保返回包正确(如果目标机器网关不是本机)
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.100 --dport 80 -j SNAT --to-source <本机内网IP>

第7章 mangle 表:报文修改

7.1 mangle 表的作用

用于修改 IP 报文头部,如 TTL、TOS、MARK 等,但不修改源/目的地址。

7.2 常见应用

应用命令
修改 TTLiptables -t mangle -A PREROUTING -j TTL --ttl-set 64
修改 TOSiptables -t mangle -A PREROUTING -j TOS --set-tos 0x10
打 MARKiptables -t mangle -A PREROUTING -j MARK --set-mark 1

7.3 MARK 与 CONNMARK

bash
# 给特定流量打标记
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 100

# 连接级标记(CONNMARK)
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark
iptables -t mangle -A POSTROUTING -j CONNMARK --save-mark

第8章 raw 表:连接跟踪豁免

8.1 raw 表的作用

跳过连接跟踪(conntrack),减少性能开销。某些高并发场景(如 LVS 负载均衡器)会用到。

bash
# 不对 80 端口的流量做连接跟踪
iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK

使用 NOTRACK 后,该流量无法使用 conntrack 状态匹配。


第9章 iptables 匹配条件详解

9.1 协议匹配

bash
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p icmp -j ACCEPT

9.2 IP/网段匹配

bash
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT ! -s 192.168.1.0/24 -p tcp --dport 22 -j DROP

9.3 接口匹配

bash
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

9.4 端口匹配

bash
# 单个端口
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 端口范围
iptables -A INPUT -p tcp --dport 1000:2000 -j ACCEPT

# 多端口
iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT

9.5 连接状态匹配

bash
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
iptables -A INPUT -m conntrack --ctstate NEW -p tcp --dport 80 -j ACCEPT
状态说明
NEW新连接的第一个包
ESTABLISHED已建立连接的后续包
RELATED与已有连接相关的包(如 FTP 数据连接)
INVALID无法识别的包
UNTRACKED被 raw 表标记为 NOTRACK 的包

9.6 limit 限速匹配

bash
# 限制 ICMP ping 每秒 10 个
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 10/second -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

9.7 string 字符串匹配

bash
# 拦截包含特定字符串的 HTTP 请求
iptables -A INPUT -p tcp --dport 80 -m string --string "badword" --algo bm -j DROP

第10章 iptables 目标动作详解

10.1 基础动作

动作说明
ACCEPT接受数据包
DROP静默丢弃
REJECT拒绝并返回错误
LOG记录日志,继续匹配下一条
RETURN从自定义链返回

10.2 NAT 动作

动作说明
SNAT源地址转换
DNAT目的地址转换
MASQUERADE动态 SNAT
REDIRECT端口重定向到本机

10.3 其他动作

动作说明
MARK给数据包打标记
CONNMARK给连接打标记
TTL修改 TTL
TOS修改 TOS
REDIRECT重定向到本机端口(常用于透明代理)

第11章 NAT 实战:SNAT 与 DNAT

11.1 场景:企业内网共享上网

┌─────────────┐      ┌─────────────┐      ┌─────────────┐
│  内网用户    │ ──>  │  Linux 网关  │ ──>  │   互联网     │
│ 192.168.1.x │      │  eth0:公网   │      │             │
└─────────────┘      │  eth1:内网   │      └─────────────┘
                     └─────────────┘
bash
# 开启 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# SNAT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

# 或者固定公网 IP
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 1.2.3.4

11.2 场景:内网服务器端口映射

bash
# 将公网 1.2.3.4:8080 映射到内网 192.168.1.100:80
iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 --dport 8080 -j DNAT --to-destination 192.168.1.100:80

# 如果内网服务器网关不是 Linux 网关,还需要做 SNAT
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.100 --dport 80 -j SNAT --to-source 192.168.1.1

11.3 场景:透明代理

bash
# 将 80 端口流量重定向到本机 3128(Squid 代理)
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128

第12章 iptables 状态机制 conntrack

12.1 conntrack 是什么

conntrack(connection tracking)是 Netfilter 的连接跟踪机制,用于记录每个连接的状态。

bash
# 查看连接跟踪表
conntrack -L

# 统计连接数
conntrack -C

# 查看最大值
cat /proc/sys/net/netfilter/nf_conntrack_max

12.2 conntrack 表溢出

当连接数超过 nf_conntrack_max 时,新连接会被丢弃,表现为网络不通。

bash
# 临时增大
echo 1048576 > /proc/sys/net/netfilter/nf_conntrack_max

# 永久生效
echo "net.netfilter.nf_conntrack_max = 1048576" >> /etc/sysctl.conf
sysctl -p

12.3 减少 conntrack 压力

bash
# 对高并发端口禁用连接跟踪
iptables -t raw -A PREROUTING -p tcp --dport 80 -j NOTRACK

第13章 iptables 在 Kubernetes 中的应用

13.1 kube-proxy 与 iptables

kube-proxy 通过 iptables 实现 Kubernetes Service 的负载均衡。

Client Pod


Service ClusterIP:port


kube-proxy iptables 规则


Backend Pod:targetPort

13.2 kube-proxy 创建的核心链

KUBE-SERVICES
  ├── KUBE-SVC-XXX   # 某个 Service 的链
  │     ├── KUBE-SEP-XXX  # 后端 Pod 1
  │     └── KUBE-SEP-YYY  # 后端 Pod 2
  └── KUBE-NODEPORTS  # NodePort 规则

13.3 查看 Kubernetes Service 规则

bash
# 查看所有 Service 相关链
iptables -t nat -L KUBE-SERVICES -n -v

# 查看 NodePort 链
iptables -t nat -L KUBE-NODEPORTS -n -v

# 查看具体 Service 的链
iptables -t nat -L KUBE-SVC-XXXXXXXXXXXXXXXX -n -v

# 查看后端 Pod 链
iptables -t nat -L KUBE-SEP-XXXXXXXXXXXXXXXX -n -v

13.4 iptables 模式下的负载均衡

iptables 模式使用 statistic mode random probability 实现随机负载均衡:

Chain KUBE-SVC-ABC123
 target     prot opt source    destination
KUBE-SEP-POD111  all  --  0.0.0.0/0  0.0.0.0/0    statistic mode random probability 0.5000000000
KUBE-SEP-POD222  all  --  0.0.0.0/0  0.0.0.0/0

13.5 externalTrafficPolicy 在 iptables 中的体现

  • Cluster:所有节点的 NodePort 都有全部后端 Pod
  • Local:每个节点的 NodePort 只包含本节点上的后端 Pod

13.6 Kubernetes 中 iptables 排障

bash
# 1. 确认 Service 和 Endpoints
kubectl get svc <svc-name> -o wide
kubectl get endpoints <svc-name>

# 2. 查看对应 iptables 链
iptables -t nat -L KUBE-SERVICES -n -v | grep <svc-name>

# 3. 查看 NodePort 规则
iptables -t nat -L KUBE-NODEPORTS -n -v

# 4. 查看 conntrack
conntrack -L | grep <cluster-ip>

# 5. 节点抓包
tcpdump -i any -nn host <cluster-ip> or port <node-port>

第13A章 iptables + Docker 网络

13A.1 Docker 默认网络模式

模式说明
bridge默认模式,容器通过 docker0 网桥通信
host容器共享宿主机网络命名空间
none容器无网络
container共享另一个容器的网络
overlaySwarm 跨主机网络

13A.2 Docker 如何操作 iptables

Docker 启动时会自动创建以下 iptables 规则:

bash
# 查看 Docker 创建的自定义链
iptables -t nat -L -n -v | grep DOCKER
iptables -t filter -L -n -v | grep DOCKER

Docker 使用两条自定义链:

  • DOCKER:filter 表中处理容器间流量
  • DOCKER:nat 表中处理端口映射

13A.3 容器访问外部网络

容器 (172.17.0.2)


docker0 (172.17.0.1)


eth0 (宿主机)


外部网络

Docker 自动添加 MASQUERADE:

bash
iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE

这表示:源地址为 172.17.0.0/16 的流量,如果不是发往 docker0,就做 SNAT。

13A.4 外部访问容器:端口映射

bash
docker run -d -p 8080:80 nginx

Docker 自动添加 DNAT:

bash
iptables -t nat -A DOCKER ! -i docker0 -p tcp --dport 8080 -j DNAT --to-destination 172.17.0.2:80
iptables -t filter -A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp --dport 80 -j ACCEPT

13A.5 容器间通信

同一 bridge 网络内的容器通过 docker0 直接二层通信,不经过 SNAT:

bash
iptables -t filter -A FORWARD -i docker0 -o docker0 -j ACCEPT

13A.6 Docker 与 iptables 冲突处理

常见问题:手动配置了 -P FORWARD DROP,导致容器无法访问外部网络。

bash
# 查看 FORWARD 默认策略
iptables -L FORWARD

# 正确做法:允许 docker0 相关转发
iptables -A FORWARD -i docker0 -j ACCEPT
iptables -A FORWARD -o docker0 -j ACCEPT

禁止 Docker 管理 iptables(不推荐生产环境):

json
{
  "iptables": false
}

关闭后需要手动维护所有 Docker 网络规则。

13A.7 自定义 bridge 网络

bash
# 创建自定义网络
docker network create mynet --subnet 172.18.0.0/16

# 查看自动创建的桥接和 iptables 规则
brctl show
iptables -t nat -L -n -v | grep 172.18
iptables -t filter -L -n -v | grep 172.18

每个自定义网络都有独立的 bridge 和 iptables 规则集。

13A.8 Docker 网络排障命令

bash
# 查看 Docker 网络
docker network ls
docker network inspect bridge

# 查看容器 IP
docker inspect <container> -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}'

# 查看容器内路由
docker exec <container> ip route

# 查看 iptables 中 Docker 相关规则
iptables -t nat -L DOCKER -n -v
iptables -t filter -L DOCKER -n -v

# 抓包
tcpdump -i docker0 -nn
tcpdump -i eth0 -nn port 8080

第13B章 iptables + Calico

13B.1 Calico 架构概述

Calico 是一个纯三层的 Kubernetes CNI 插件,核心组件:

组件作用
Felix每个节点上的 agent,负责配置路由和 iptables 规则
BIRDBGP 客户端,用于路由宣告
Typha聚合 Felix 与 etcd/API Server 的连接(可选)
etcd / KDD存储 Calico 配置

13B.2 Calico 网络模式

模式说明
BGP纯三层,Pod IP 通过 BGP 宣告
IPIPPod 跨节点通信使用 IPIP 隧道
VXLANPod 跨节点通信使用 VXLAN 封装
CrossSubnet同子网 BGP,跨子网 IPIP/VXLAN

13B.3 Calico 创建的 iptables 链

Calico 会在 filter、nat、mangle 表中创建大量自定义链:

bash
iptables -L -n -v | grep -i cali
iptables -t nat -L -n -v | grep -i cali
iptables -t mangle -L -n -v | grep -i cali

主要链:

  • cali-INPUTcali-OUTPUTcali-FORWARD
  • cali-from-host-endpointcali-to-host-endpoint
  • cali-from-wl-dispatchcali-to-wl-dispatch
  • cali-pi-<policy-name>:NetworkPolicy 规则

13B.4 NetworkPolicy 在 iptables 中的实现

Calico 将 Kubernetes NetworkPolicy 翻译成 iptables 规则:

Pod 出站流量


cali-OUTPUT


cali-to-wl-dispatch


cali-tw-<endpoint>  (to workload)


cali-pi-<policy>    (policy ingress/egress rules)


ACCEPT / DROP

13B.5 查看 Calico 端点规则

bash
# 查看 workload endpoint 规则
iptables -L cali-tw-<endpoint-id> -n -v
iptables -L cali-fw-<endpoint-id> -n -v

# 查看 policy 规则
iptables -L -n -v | grep cali-pi

# 查看 Calico 接口
calicoctl get workloadEndpoint

13B.6 Calico + iptables 常见排障

bash
# 1. 查看 Calico 节点状态
kubectl get pods -n kube-system -l k8s-app=calico-node

# 2. 查看 Felix 日志
kubectl logs -n kube-system -l k8s-app=calico-node -c calico-node

# 3. 查看 Calico 接口信息
ip link show | grep cali

# 4. 查看路由
calicoctl node status
ip route show

# 5. 查看 iptables 中是否拦截了 Pod 流量
iptables -L FORWARD -n -v | grep cali
iptables -L cali-FORWARD -n -v

# 6. 查看具体 Pod 的 policy 规则
iptables -L | grep <pod-ip>

# 7. 抓包
tcpdump -i cali+ -nn host <pod-ip>
tcpdump -i tunl0 -nn

13B.7 NetworkPolicy 导致 Pod 不通排查

当 Pod 突然无法通信时:

  1. 检查 NetworkPolicy 是否允许该方向流量
  2. 在节点上查看对应的 cali-pi-*
  3. 使用 calicoctl get networkPolicy 查看策略
  4. 临时移除策略验证
bash
# 查看所有 NetworkPolicy
kubectl get networkpolicy --all-namespaces

# 查看 Calico policy
kubectl get networkpolicies.crd.projectcalico.org

# 查看 endpoint 应用的策略
iptables -L cali-tw-<endpoint> -n -v

13B.8 Calico 与 kube-proxy 的协作

外部流量


LoadBalancer / NodePort


kube-proxy iptables 规则 (KUBE-SERVICES)


Calico iptables 规则 (cali-*)


Pod veth 接口 (cali*)


容器

两个组件都会在节点上创建 iptables 规则,通常是共存关系:

  • kube-proxy 负责 Service 负载均衡
  • Calico 负责 Pod 网络连通性和网络策略

13B.9 性能优化建议

建议说明
减少 NetworkPolicy 数量每条策略都会生成 iptables 规则
使用 GlobalNetworkPolicy减少重复策略
开启 eBPF 数据平面Calico eBPF 模式可替代 iptables,性能更好
调整 conntrack 上限Calico 依赖 conntrack
避免过细粒度的 policy合并规则,减少 iptables 链跳转

第14章 性能优化与注意事项

14.1 iptables 性能瓶颈

  • 规则数量过多时,匹配线性增长
  • 大量后端 Pod 导致规则链膨胀
  • conntrack 表溢出

14.2 优化建议

建议说明
减少规则数量合并相同目的的规则
使用 ipvs大规模集群推荐 kube-proxy ipvs 模式
增加 conntrack 上限调整 nf_conntrack_max
禁用不必要的连接跟踪对高并发端口使用 NOTRACK
定期清理无用规则避免规则累积

14.3 安全注意事项

  1. 修改 iptables 前备份现有规则
  2. 远程服务器配置防火墙时,先设置定时任务恢复规则,防止把自己锁在外面
  3. 默认策略为 DROP 时,务必允许 SSH 和 ESTABLISHED 连接
  4. 生产环境规则变更应通过脚本或配置管理工具(Ansible/SaltStack)执行

第15章 故障排查实战

15.1 排查清单

bash
# 1. 确认 iptables 服务/模块正常
lsmod | grep ip_tables

# 2. 查看当前规则
iptables -L -n -v
iptables -t nat -L -n -v

# 3. 查看默认策略
iptables -L | grep Policy

# 4. 查看规则命中次数
iptables -L -n -v

# 5. 查看连接跟踪
conntrack -L | head

# 6. 查看内核日志
dmesg | grep -i iptables
dmesg | grep -i conntrack

# 7. 抓包验证
tcpdump -i any -nn port 80

15.2 常见故障

故障原因解决
规则不生效规则顺序错误使用 -I 插入到正确位置
把自己锁在服务器外默认 DROP 且未放行 SSH通过控制台/VNC 登录恢复
NAT 后返回包不正常缺少 SNAT 或路由不对称检查 POSTROUTING 和路由
高并发下丢包conntrack 表满增大 nf_conntrack_max 或禁用跟踪
Kubernetes Service 不通kube-proxy 规则错误重启 kube-proxy 或切换 ipvs

15.3 救援脚本示例

bash
#!/bin/bash
# iptables-rescue.sh
# 当误操作导致无法连接时,通过计划任务执行恢复

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -t raw -F
iptables -t raw -X

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT

第16章 nftables 与 iptables 的未来

16.1 nftables 是什么

nftables 是 iptables 的下一代替代框架,由 Netfilter 团队开发:

  • 更统一的语法
  • 更好的性能
  • 原生支持 IPv4/IPv6
  • 更灵活的集合和映射

16.2 iptables vs nftables

特性iptablesnftables
语法各表独立统一
IPv4/IPv6分开管理统一
性能中等更好
学习曲线陡峭但资料多较平缓
生态成熟广泛逐渐普及

16.3 迁移建议

  • 新系统可优先考虑 nftables
  • 现有大量 iptables 脚本的系统可逐步迁移
  • RHEL 8+/Debian 10+ 默认使用 nftables 作为 iptables 后端

第17章 附录速查表

17.1 常用命令速查

bash
# 查看规则
iptables -L -n -v
iptables -t nat -L -n -v
iptables -S

# 添加规则
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT

# 删除规则
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
iptables -D INPUT 1

# 清空规则
iptables -F
iptables -X
iptables -Z

# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 保存/恢复
iptables-save > /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4

17.2 匹配条件速查

bash
-p tcp/udp/icmp
-s 192.168.1.0/24
-d 10.0.0.1
-i eth0
-o eth1
--dport 80
--sport 1024:65535
-m conntrack --ctstate ESTABLISHED,RELATED
-m multiport --dports 22,80,443
-m limit --limit 10/second

17.3 目标动作速查

bash
-j ACCEPT
-j DROP
-j REJECT --reject-with icmp-port-unreachable
-j LOG --log-prefix "IPTABLES: "
-j SNAT --to-source 1.2.3.4
-j DNAT --to-destination 192.168.1.100:80
-j MASQUERADE
-j REDIRECT --to-port 3128

17.4 推荐学习路径

  1. 理解 Netfilter 五链
  2. 掌握 filter 表基本防火墙
  3. 学习 nat 表的 SNAT/DNAT
  4. 理解 conntrack 状态机制
  5. 结合 Kubernetes kube-proxy 深入实践
  6. 了解 nftables 作为未来方向

结语

iptables 是 Linux 网络管理的基石工具之一,掌握它不仅对服务器安全至关重要,也是理解 Kubernetes 网络(尤其是 kube-proxy 实现)的关键。希望本教材能帮助你从入门到精通,并在实际工作中游刃有余。


教材生成时间:2026-07-18