开发者

Linux之iptables命令的使用方式

目录
  • iptables命令:作用与常用参数
    • 1. iptables 的作用
    • 2. iptables 的 5 个关键链(Chains)
    • 3. iptables 的 4 个核心表(Tables)
    • 4. iptables 常用参数
      • (1)通用参数
      • (2)规则匹配参数
      • (3)动作(Target)参数
    • 5. 常用示例
      • (1)查看规则
      • (2)允许/拒绝流量
      • (3)NAT 与端口转发
      • (4)保存与恢复规则
  • iptables 频繁查询对系统性能的影响及优化建议
    • 1. iptables -t nat -nvL 的 CPU 开销
      • 1.1 命令执行过程
      • 1.2 CPU 资源占用分析
      • 1.3 对 DNS 服务器的影响
    • 2. iptables 的内核锁竞争问题
      • 2.1 xtables 锁机制
      • 2.2 锁竞争对 DNS 的影响
    • 3. 优化建议
      • 3.1 降低查询频率
      • 3.2 使用更高效的工具
      • 3.3 优化系统环境
      • 最终建议
  • 总结

    iptables命令:作用与常用参数

    1. iptables 的作用

    iptables 是 linux 系统上最常用的 防火墙工具,用于配置内核的 netfilter 包过滤框架,主要功能包括:

    • 包过滤(Packet Filtering):允许/拒绝网络数据包(如防火墙规则)。
    • 网络地址转换(NAT):实现 SNAT(源地址转换)、DNAT(目标地址转换)。
    • 端口php转发(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 表规则(默认)
    iandroidptables -t nat -L -n -v   # 查看 nat 表规则
    iptables -L INPUT -n -v    # 查看 INPUT 链规则
    

    (2)允许/javascript拒绝流量

    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 + IN编程客栈PUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING

    高频参数

    • -A(追加规则)、-I(插入规则)、-D(删除规则)。
    • -p(协议)、--dport(端口)、-s/-d(IP)。
    • -j ACCEPT/DROP/REJECT/DNAT/SNAT

    进阶建议

    • 学习 nftablesiptdNpOZjiXWtables 的下一代替代品)。
    • 使用 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,提升查询效率并减少锁竞争。

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新运维

    运维排行榜