当前位置: 代码网 > 服务器>服务器>Linux > Linux之iptables命令的使用方式

Linux之iptables命令的使用方式

2025年07月07日 Linux 我要评论
iptables命令:作用与常用参数1. iptables 的作用iptables 是 linux 系统上最常用的 防火墙工具,用于配置内核的 netfilter 包过滤框架,主要功能包括:包过滤(p

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、端口转发、流量统计。

关键表与链filternatmangleraw + input/output/forward/prerouting/postrouting

高频参数

  • -a(追加规则)、-i(插入规则)、-d(删除规则)。
  • -p(协议)、--dport(端口)、-s/-d(ip)。
  • -j accept/drop/reject/dnat/snat

进阶建议

  • 学习 nftablesiptables 的下一代替代品)。
  • 使用 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 时间。

原子计数器读取

  • iptablespkts/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 管理节点隔离,避免资源竞争。

监控与告警

  • 使用 htopdstat 观察 cpu 和锁竞争情况:
dstat -tc --top-cpu  # 查看 cpu 占用最高的进程

心得:

问题影响解决方案
cpu 占用高dns 查询延迟增加,可能超时降低查询频率,改用 nftables
内核锁竞争dns 线程阻塞,响应变慢或丢包减少规则规模,分离 dns 与防火墙节点
i/o 压力日志写入冲突,可能耗尽磁盘限制日志大小,使用 logrotate

最终建议

  • 偶尔查询 iptables -t nat -nvl 无影响,但避免高频执行
  • 长期优化:迁移到 nftables,提升查询效率并减少锁竞争。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com