【Linux】iptables 命令详解_iptables命令详解
iptables 命令详解:作用与常用参数
1. iptables 的作用
iptables
是 Linux 系统上最常用的 防火墙工具,用于配置内核的 netfilter 包过滤框架,主要功能包括:
- 包过滤(Packet Filtering):允许/拒绝网络数据包(如防火墙规则)。
- 网络地址转换(NAT):实现 SNAT(源地址转换)、DNAT(目标地址转换)。
- 端口转发(Port Forwarding):将外部请求转发到内部服务器。
- 流量统计(Traffic Accounting):记录数据包和字节计数。
- 流量整形(Traffic Shaping):结合
tc
实现 QoS。
2. iptables 的 5 个关键链(Chains)
iptables
规则基于 表(Tables) 和 链(Chains) 组织,默认有 5 个链:
3. iptables 的 4 个核心表(Tables)
conntrack
),用于高性能场景。4. iptables 常用参数
(1)通用参数
-t
-t nat
、-t filter
,默认 filter
)。-A
-A INPUT
)。-I [规则号]
-I INPUT 2
)。-D
-D INPUT 3
)。-L
-L INPUT
查看特定链)。-F
-F INPUT
清空 INPUT 链)。-P
-P INPUT DROP
)。-v
pkts
和字节 bytes
)。-n
(2)规则匹配参数
-p
-p tcp
、-p udp
、-p icmp
)。--dport
-p tcp/udp
,如 --dport 80
)。--sport
--sport 22
)。-s
-s 192.168.1.100
)。-d
-d 10.0.0.1
)。-i
-i eth0
)。-o
-o wlan0
)。-m
-m state --state ESTABLISHED
)。(3)动作(Target)参数
-j ACCEPT
-j DROP
-j REJECT
ICMP
拒绝消息)。-j LOG
/var/log/messages
)。-j DNAT
-j DNAT --to-destination 192.168.1.2:80
)。-j SNAT
-j SNAT --to-source 1.2.3.4
)。-j MASQUERADE
5. 常用示例
(1)查看规则
iptables -L -n -v # 查看 filter 表规则(默认)iptables -t nat -L -n -v # 查看 nat 表规则iptables -L INPUT -n -v # 查看 INPUT 链规则
(2)允许/拒绝流量
iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 允许 SSHiptables -A INPUT -p tcp --dport 80 -j DROP # 拒绝 HTTPiptables -A INPUT -s 192.168.1.0/24 -j ACCEPT # 允许局域网访问
(3)NAT 与端口转发
# SNAT(内网机器通过网关访问外网)iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE# DNAT(将外网 80 端口转发到内网 192.168.1.2)iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.1.2:80
(4)保存与恢复规则
iptables-save > /etc/iptables.rules # 保存规则iptables-restore < /etc/iptables.rules # 恢复规则
6. 总结
- iptables 核心功能:包过滤、NAT、端口转发、流量统计。
- 关键表与链:
filter
、nat
、mangle
、raw
+INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING
。 - 高频参数:
-A
(追加规则)、-I
(插入规则)、-D
(删除规则)。-p
(协议)、--dport
(端口)、-s/-d
(IP)。-j ACCEPT/DROP/REJECT/DNAT/SNAT
。
进阶建议:
- 学习
nftables
(iptables
的下一代替代品)。 - 使用
fail2ban
动态封禁恶意 IP。 - 结合
conntrack
监控连接状态。
–
iptables 频繁查询对系统性能的影响及优化建议
引言
频繁执行该命令可能会对系统性能(尤其是 DNS 服务器)造成负面影响
1. iptables -t nat -nvL 的 CPU 开销
1.1 命令执行过程
iptables -t nat -nvL
是一个只读查询命令,主要功能是:
- 遍历
nat
表的所有规则(DNAT/SNAT 等)。 - 计算并显示每个规则的 数据包计数(pkts) 和 字节计数(bytes)。
1.2 CPU 资源占用分析
- 规则遍历开销:
如果nat
表规则较多(如数千条),每次执行iptables -nvL
都需要遍历整个规则链,消耗 CPU 时间。 - 原子计数器读取:
iptables
的pkts/bytes
计数器是原子变量(atomic),内核需要安全读取这些值,可能触发 CPU 缓存同步(尤其在多核系统上)。
1.3 对 DNS 服务器的影响
DNS 服务器(如 BIND、CoreDNS)通常是 CPU 密集型 服务,依赖快速处理 UDP 查询。如果 iptables -nvL
高频执行(如每秒多次),可能导致:
- CPU 时间片争抢:DNS 工作线程的 CPU 时间被
iptables
占用。 - 查询延迟增加:DNS 响应时间从毫秒级上升,甚至触发客户端超时重试,进一步加剧负载。
示例量化分析:
- 假设
nat
表有 1000 条规则,单次iptables -nvL
耗时 5ms。 - 每秒执行 10 次 → 占用 50ms CPU 时间/秒(约 5% 单核 CPU)。
- 在 高负载 DNS 服务器 上,额外 5% CPU 占用可能导致 尾延迟(P99)显著上升。
2. iptables 的内核锁竞争问题
2.1 xtables 锁机制
iptables
通过内核的 xt_table
锁(互斥锁) 保护规则表的读写一致性:
- 读操作(如
iptables -L
)和 写操作(如iptables -A
)会竞争同一把锁。 - 旧版内核(< 5.3)使用全局锁,所有
iptables
操作串行化,即使只是查询也会阻塞规则更新。
2.2 锁竞争对 DNS 的影响
如果 DNS 服务器与 iptables
规则管理运行在同一台机器上,可能出现:
- DNS 线程阻塞:
- 当
iptables -nvL
执行时,若后台有脚本修改规则(如iptables -A
),查询线程会被阻塞,直到锁释放。 - 表现:DNS 查询延迟波动(如 P99 从 10ms 升至 100ms)。
- 当
- 极端情况:丢包或超时:
- 若规则更新极频繁(如 Kubernetes
kube-proxy
动态调整规则),iptables -L
可能长时间阻塞,甚至导致 DNS 查询超时。
- 若规则更新极频繁(如 Kubernetes
如何检测锁竞争?
# 使用 perf 监控 xtables 锁等待(需内核支持)perf probe -a \'xt_table_lock\'perf stat -e \'probe:xt_table_lock\' -a sleep 10
3. 优化建议
3.1 降低查询频率
- 避免每秒多次查询,改为 每分钟 1 次 或 仅在需要时执行:
# 示例:Crontab 每分钟记录一次* * * * * /sbin/iptables -t nat -nvL >> /var/log/iptables-nat.log
3.2 使用更高效的工具
- 改用
nftables
(现代 Linux 默认防火墙,锁机制更高效):nft list table ip nat # 替代 iptables -t nat -nvL
- 使用
conntrack
监控连接状态(避免遍历规则):conntrack -L -j # 以 JSON 格式显示 NAT 会话
3.3 优化系统环境
- 减少
iptables
规则规模:- 合并冗余规则,使用
ipset
优化大型规则集。
- 合并冗余规则,使用
- 分离关键服务:
- 将 DNS 服务器与
iptables
管理节点隔离,避免资源竞争。
- 将 DNS 服务器与
- 监控与告警:
- 使用
htop
、dstat
观察 CPU 和锁竞争情况:dstat -tc --top-cpu # 查看 CPU 占用最高的进程
- 使用
4. 总结
nftables
logrotate
最终建议
- 偶尔查询
iptables -t nat -nvL
无影响,但避免高频执行。 - 长期优化:迁移到
nftables
,提升查询效率并减少锁竞争。
相关阅读:
- nftables vs. iptables: Performance Benchmark
- Linux 内核锁机制详解