Linux之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 个链:
| 链名 | 作用 |
|---|---|
| INPUT | 处理 进入本机 的数据包(如 SSH、HTTP 请求)。 |
| OUTPUT | 处理 从本机发出 的数据包(如 ping、curl 请求)。 |
| FORWARD | 处理 经过本机路由 的数据包(如网关服务器)。 |
| PREROUTING | 在路由决策前修改数据包(DNAT、端口转发)。 |
| POSTROUTING | 在数据包离开前修改源地址(SNAT、MASQUERADE)。 |
3. iptables 的 4 个核心表(Tables)
| 表名 | 作用 |
|---|---|
| filter | 默认表,用于包过滤(允许/拒绝流量)。 |
| nat | 用于网络地址转换(NAT)。 |
| mangle | 修改数据包内容(如 TTL、TOS)。 |
| raw | 绕过连接跟踪(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 | 禁用 DNS 反向解析,加快输出速度。 |
(2)规则匹配参数
| 参数 | 作用 |
|---|---|
| -p <协议> | 匹配协议(如 -p tcp、-p udp、-p icmp)。 |
| --dport <端口> | 匹配目标端口(需配合 -p tcp/udp,如 --dport 80)。 |
| --sport <端口> | 匹配源端口(如 --sport 22)。 |
| -s <IP> | 匹配源 IP(如 -s 192.168.1.100)。 |
| -d <IP> | 匹配目标 IP(如 -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 | 动态 SNAT(适用于拨号或 DHCP 获取 IP)。 |
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 # 允许 SSH iptables -A INPUT -p tcp --dport 80 -j DROP # 拒绝 HTTP iptables -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 # 恢复规则
心得:
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 查询超时。
如何检测锁竞争?
# 使用 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管理节点隔离,避免资源竞争。
监控与告警:
- 使用
htop、dstat观察 CPU 和锁竞争情况:
dstat -tc --top-cpu # 查看 CPU 占用最高的进程
心得:
| 问题 | 影响 | 解决方案 |
|---|---|---|
| CPU 占用高 | DNS 查询延迟增加,可能超时 | 降低查询频率,改用 nftables |
| 内核锁竞争 | DNS 线程阻塞,响应变慢或丢包 | 减少规则规模,分离 DNS 与防火墙节点 |
| I/O 压力 | 日志写入冲突,可能耗尽磁盘 | 限制日志大小,使用 logrotate |
最终建议
- 偶尔查询
iptables -t nat -nvL无影响,但避免高频执行。 - 长期优化:迁移到
nftables,提升查询效率并减少锁竞争。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
environments was not found on the java.library.path 问题的解决方法
The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path 问题的解决方法,需要的朋友可以参考下2016-08-08
Windows Apache2.4 VC9(ApacheHaus)详细安装配置教程
这篇文章主要介绍了Windows Apache2.4 VC9(ApacheHaus)详细安装配置教程,需要的朋友可以参考下2017-09-09
linux 下jenkins项目搭建过程(centos7为例 )
本文以centos7为例给大家介绍linux 下jenkins项目搭建过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧2020-10-10
Linux+php+apache+oracle环境搭建之CentOS下安装Oracle数据库
研究了两天Linux下安装Oracle,重装了两次虚拟机,终于安装成功。很有收获的。记录下安装过程。大神们如有更好的方式,请联系我!2014-08-08
解决-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 权限不够问题
这篇文章主要介绍了解决-BASH: /HOME/JAVA/JDK1.8.0_221/BIN/JAVA: 权限不够的问题,需要的朋友可以参考下2019-09-09


最新评论