主题
iptables 从入门到精通
目标读者:Linux 运维、Kubernetes 运维、网络工程师、DevOps
前置知识:Linux 基础、TCP/IP 协议基础
教材版本:v1.0
目录
- iptables 是什么
- Netfilter 框架:iptables 的底层支撑
- 四表五链:iptables 的核心结构
- iptables 基本命令
- filter 表:防火墙过滤
- nat 表:网络地址转换
- mangle 表:报文修改
- raw 表:连接跟踪豁免
- iptables 匹配条件详解
- iptables 目标动作详解
- NAT 实战:SNAT 与 DNAT
- iptables 状态机制 conntrack
- iptables 在 Kubernetes 中的应用 13A. iptables + Docker 网络 13B. iptables + Calico
- 性能优化与注意事项
- 故障排查实战
- nftables 与 iptables 的未来
- 附录:速查表
第1章 iptables 是什么
1.1 一句话定义
iptables 是 Linux 内核 Netfilter 框架的用户态配置工具,用于定义数据包过滤、网络地址转换(NAT)、报文修改等规则。
1.2 iptables 能做什么
| 功能 | 说明 |
|---|---|
| 防火墙 | 允许/拒绝特定 IP、端口、协议的流量 |
| NAT | SNAT(源地址转换)、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 五链
| 链名 | 默认所在的表 | 处理对象 |
|---|---|---|
PREROUTING | raw、mangle、nat | 所有进入本机的包 |
INPUT | mangle、filter | 路由到本机的包 |
FORWARD | mangle、filter | 需要本机转发的包 |
OUTPUT | raw、mangle、nat、filter | 本机进程发出的包 |
POSTROUTING | mangle、nat | 所有离开本机的包 |
3.3 表与链的关系
┌─────────────┐
│ PREROUTING │ ← raw, mangle, nat
└──────┬──────┘
│
┌────────────┼────────────┐
│ │ │
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│ INPUT │ │ FORWARD │ │ OUTPUT │
│ mangle │ │ mangle │ │ raw │
│ filter │ │ filter │ │ mangle │
│ │ │ │ │ nat │
│ │ │ │ │ filter │
└────┬────┘ └────┬────┘ └────┬────┘
│ │ │
│ ▼ │
│ ┌─────────────┐ │
│ │ POSTROUTING │ │
│ │ mangle, nat │ │
│ └──────┬──────┘ │
│ │ │
▼ ▼ ▼3.4 规则匹配顺序
- 数据包进入某条链
- 按表的优先级依次处理:raw → mangle → nat → filter
- 同一表内按规则从上到下匹配
- 匹配到规则后执行目标动作(ACCEPT、DROP、DNAT 等)
- 如果没有匹配,执行链的默认策略(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 -S4.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 ACCEPT4.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 ACCEPT5.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 | 动态源 IP | PPPoE、动态公网 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.46.4 MASQUERADE 示例
bash
# 动态公网 IP 场景(如拨号上网)
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE6.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:806.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 常见应用
| 应用 | 命令 |
|---|---|
| 修改 TTL | iptables -t mangle -A PREROUTING -j TTL --ttl-set 64 |
| 修改 TOS | iptables -t mangle -A PREROUTING -j TOS --set-tos 0x10 |
| 打 MARK | iptables -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 ACCEPT9.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 DROP9.3 接口匹配
bash
iptables -A INPUT -i eth0 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT9.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 ACCEPT9.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 DROP9.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.411.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.111.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_max12.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 -p12.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:targetPort13.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 -v13.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/013.5 externalTrafficPolicy 在 iptables 中的体现
Cluster:所有节点的 NodePort 都有全部后端 PodLocal:每个节点的 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 | 共享另一个容器的网络 |
overlay | Swarm 跨主机网络 |
13A.2 Docker 如何操作 iptables
Docker 启动时会自动创建以下 iptables 规则:
bash
# 查看 Docker 创建的自定义链
iptables -t nat -L -n -v | grep DOCKER
iptables -t filter -L -n -v | grep DOCKERDocker 使用两条自定义链:
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 nginxDocker 自动添加 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 ACCEPT13A.5 容器间通信
同一 bridge 网络内的容器通过 docker0 直接二层通信,不经过 SNAT:
bash
iptables -t filter -A FORWARD -i docker0 -o docker0 -j ACCEPT13A.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 规则 |
BIRD | BGP 客户端,用于路由宣告 |
Typha | 聚合 Felix 与 etcd/API Server 的连接(可选) |
etcd / KDD | 存储 Calico 配置 |
13B.2 Calico 网络模式
| 模式 | 说明 |
|---|---|
BGP | 纯三层,Pod IP 通过 BGP 宣告 |
IPIP | Pod 跨节点通信使用 IPIP 隧道 |
VXLAN | Pod 跨节点通信使用 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-INPUT、cali-OUTPUT、cali-FORWARDcali-from-host-endpoint、cali-to-host-endpointcali-from-wl-dispatch、cali-to-wl-dispatchcali-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 / DROP13B.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 workloadEndpoint13B.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 -nn13B.7 NetworkPolicy 导致 Pod 不通排查
当 Pod 突然无法通信时:
- 检查 NetworkPolicy 是否允许该方向流量
- 在节点上查看对应的
cali-pi-*链 - 使用
calicoctl get networkPolicy查看策略 - 临时移除策略验证
bash
# 查看所有 NetworkPolicy
kubectl get networkpolicy --all-namespaces
# 查看 Calico policy
kubectl get networkpolicies.crd.projectcalico.org
# 查看 endpoint 应用的策略
iptables -L cali-tw-<endpoint> -n -v13B.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 安全注意事项
- 修改 iptables 前备份现有规则
- 远程服务器配置防火墙时,先设置定时任务恢复规则,防止把自己锁在外面
- 默认策略为 DROP 时,务必允许 SSH 和 ESTABLISHED 连接
- 生产环境规则变更应通过脚本或配置管理工具(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 8015.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
| 特性 | iptables | nftables |
|---|---|---|
| 语法 | 各表独立 | 统一 |
| 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.v417.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/second17.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 312817.4 推荐学习路径
- 理解 Netfilter 五链
- 掌握 filter 表基本防火墙
- 学习 nat 表的 SNAT/DNAT
- 理解 conntrack 状态机制
- 结合 Kubernetes kube-proxy 深入实践
- 了解 nftables 作为未来方向
结语
iptables 是 Linux 网络管理的基石工具之一,掌握它不仅对服务器安全至关重要,也是理解 Kubernetes 网络(尤其是 kube-proxy 实现)的关键。希望本教材能帮助你从入门到精通,并在实际工作中游刃有余。
教材生成时间:2026-07-18