温馨提示×

CentOS防火墙怎样优化性能

小樊
41
2025-11-29 17:43:01
栏目: 智能运维

CentOS 防火墙性能优化实战

一 规则与策略优化

  • 使用 firewalld区域服务模型,按接口/来源划分策略,减少重复规则;将默认区域设为更严格的 drop/work,仅对必要来源与端口放行。示例:sudo firewall-cmd --set-default-zone=drop
  • 采用“先放行已建立连接、再处理新连接”的顺序,大幅减少匹配次数:对 iptables 优先添加 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT;对 firewalld 启用 conntrack 并使用富规则优先放行已建立连接。
  • 合并细碎规则为更宽泛的匹配(同协议/同端口合并),同类规则中“匹配范围小的在前、特殊例外在后”,避免逐条遍历。
  • 使用 ipset 管理大量 IP/网段/端口 集合,替代海量单条规则,显著降低规则匹配开销。
  • 仅开放必要端口与服务,定期清理陈旧/冗余规则,保持规则集精简。
  • 启用拒绝日志用于审计:sudo firewall-cmd --set-log-denied=all(或按需要设为 unicast/broadcast/multicast/xml)。

二 连接跟踪与内核参数优化

  • 若启用 NAT/端口转发/状态匹配,需关注 nf_conntrack 表:适度提高 net.netfilter.nf_conntrack_max,并缩短已建立连接与 TIME_WAIT 等超时,避免在高并发下出现丢包或性能劣化。示例(需结合业务压测微调):
    • net.netfilter.nf_conntrack_max = 25000000
    • net.netfilter.nf_conntrack_tcp_timeout_established = 180
    • net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
      注意:不同内核版本参数名可能不同(如早期为 ip_conntrack_*),修改前请确认模块与当前内核支持。
  • 提升 TCP 栈网络栈处理能力,缓解半连接队列溢出与连接建立延迟:
    • net.core.somaxconn = 16384net.core.netdev_max_backlog = 16384
    • net.ipv4.tcp_max_syn_backlog = 16384
    • net.ipv4.tcp_fin_timeout = 2net.ipv4.tcp_keepalive_time = 600
    • net.ipv4.ip_local_port_range = 40000 65000
      提示:如未使用 NAT/状态防火墙,可跳过或弱化 conntrack 调优,避免无谓资源占用。

三 日志与监控

  • 合理配置日志级别与对象:firewalld 可全局记录被拒绝流量(--set-log-denied=all/xml),或在关键链路上做定向日志,避免日志风暴。
  • 使用 journalctlsyslog 实时查看:journalctl -u firewalld -ftail -f /var/log/messages | grep firewalld
  • 对 iptables 可用 watch 'iptables -L -n -v' 观察命中计数与规则效率,定位性能瓶颈。
  • 配置 logrotate 做日志轮转,防止磁盘被日志占满。

四 高并发与资源限制优化

  • 提升进程可打开的文件描述符上限,避免高并发下“Too many open files”:在 /etc/security/limits.conf 增加如 * - nofile 65536,并验证 ulimit -n
  • 保持 firewalld/iptables 服务常驻并开机启用,减少规则重建带来的抖动:sudo systemctl enable --now firewalld
  • 避免在生产环境同时运行 firewalld 与 iptables;二者择一,统一维护与调优。

五 快速检查清单与示例

  • 规则顺序与默认策略
    • 先放行已建立连接(conntrack/ESTABLISHED,RELATED)
    • 再按“范围小在前、例外在后”添加业务放行规则
    • 默认策略尽量为 DROP,显式放行必要来源/端口/服务
  • 示例(firewalld,按需精简)
    • 设置默认区域:sudo firewall-cmd --set-default-zone=drop
    • 放行已建立连接:sudo firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    • 放行必要服务:sudo firewall-cmd --permanent --add-service=ssh --permanentsudo firewall-cmd --permanent --add-service=http --permanentsudo firewall-cmd --permanent --add-service=https --permanent
    • 记录被拒绝流量:sudo firewall-cmd --set-log-denied=all
    • 重载:sudo firewall-cmd --reload
  • 示例(ipset + 批量放行)
    • 创建集合:sudo ipset create whitelist hash:net
    • 批量添加:sudo ipset add whitelist 203.0.113.0/24
    • 规则引用:sudo iptables -I INPUT -m set --match-set whitelist src -j ACCEPT
  • 验证与观测
    • 查看状态:firewall-cmd --statefirewall-cmd --list-all
    • 实时观察:watch 'iptables -L -n -v'journalctl -u firewalld -f
    • 连接跟踪压力:conntrack -L | headcat /proc/sys/net/netfilter/nf_conntrack_count
    • 文件描述符:ulimit -n
  • 风险提示
    • 修改默认策略或连接跟踪参数可能导致现有连接中断新连接被拒;务必在维护窗口操作,先在测试环境验证,并准备回滚方案(如保存当前规则:iptables-save > /root/iptables-$(date +%F).bak)。

0