温馨提示×

Linux防火墙如何定制个性化策略

小樊
36
2025-12-24 07:51:00
栏目: 智能运维

Linux防火墙个性化策略定制指南

一、方案选型与总体思路

  • 面向生产环境,优先使用动态管理工具 firewalld(基于 Netfilter,支持运行时调整、区域隔离与富规则),或直接使用 iptables/nftables 获得更底层的控制力。
  • 关键概念:
    • 区域 Zone:按信任级别划分(如 public、trusted、work、dmz),每个网卡仅能绑定一个区域,一个区域可绑定多个网卡;可按源地址将流量划入不同区域实现精细化策略。
    • 表与链:iptables 的 filter/nat/mangle 表与 INPUT/OUTPUT/FORWARD 链;规则按顺序匹配,命中即停止,默认策略与规则顺序至关重要。
    • 富规则 Rich Rule:在 firewalld 中表达复杂匹配(源/目的、端口、协议、日志、限速、动作等)的推荐方式。

二、firewalld快速定制范式

  • 基础结构与区域绑定
    • 查看与设置默认区域、绑定网卡/源地址到区域,按“最小权限”只开放必要服务:
      firewall-cmd --get-default-zone
      firewall-cmd --set-default-zone=public --permanent
      firewall-cmd --zone=external --change-interface=eth1 --permanent
      firewall-cmd --permanent --add-source=203.0.113.10/32 --zone=trusted
      firewall-cmd --reload
      
  • 服务与端口
    • 放行常用服务与端口,区分临时与永久生效:
      firewall-cmd --add-service=ssh
      firewall-cmd --add-port=8080/tcp --permanent
      firewall-cmd --reload
      
  • 富规则常见用法
    • 仅允许指定网段访问 MySQL,并对 SSH 做频率限制:
      firewall-cmd --permanent \
        --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="3306" protocol="tcp" accept'
      firewall-cmd --permanent \
        --add-rich-rule='rule family="ipv4" port port="22" protocol="tcp" limit value="5/m" accept'
      firewall-cmd --reload
      
  • NAT 与端口转发
    • 出口 SNAT(IP 伪装)与入站端口转发:
      firewall-cmd --permanent --add-masquerade
      firewall-cmd --permanent \
        --add-rich-rule='rule family=ipv4 destination port port=80 protocol=tcp redirect port=8080'
      firewall-cmd --reload
      
  • 日志与排错
    • 启用拒绝日志、查看拒绝记录与实时日志:
      firewall-cmd --set-log-denied=all
      journalctl -u firewalld -f
      firewall-cmd --list-all --zone=public
      
  • 性能与后端
    • /etc/firewalld/firewalld.conf 中启用 firewall_backend=nftables,并使用批量操作提升性能(individual_calls=no)。

三、iptables与nftables底层定制范式

  • 规则顺序与默认策略
    • 先放行回环、已建立连接,再按需开放端口,最后设置默认丢弃;避免误锁:
      iptables -F
      iptables -P INPUT DROP
      iptables -P FORWARD DROP
      iptables -P OUTPUT ACCEPT
      
      iptables -A INPUT -i lo -j ACCEPT
      iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
      iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
      iptables -A INPUT -p tcp --dport 80 -j ACCEPT
      iptables -A INPUT -p tcp --dport 443 -j ACCEPT
      
  • 仅放行特定来源访问某端口
    • “先封后放”更易维护:
      iptables -I INPUT -p tcp --dport 9889 -j DROP
      iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 9889 -j ACCEPT
      iptables -I INPUT -s 203.0.113.10/32 -p tcp --dport 9889 -j ACCEPT
      
  • 自定义链提升可维护性
    • 将同类规则归集到自定义链,便于集中调整:
      iptables -N SSH_FILTER
      iptables -A SSH_FILTER -s 192.168.1.100 -j ACCEPT
      iptables -A SSH_FILTER -j DROP
      iptables -A INPUT -p tcp --dport 22 -j SSH_FILTER
      
  • 持久化与回滚
    • 保存与恢复(不同发行版路径不同):
      # Debian/Ubuntu
      sudo apt install iptables-persistent
      sudo netfilter-persistent save
      
      # CentOS/RHEL
      service iptables save
      # 或
      iptables-save > /etc/sysconfig/iptables
      
  • nftables 方向
    • 思路与 iptables 一致,语法不同;适合新项目或需要更强表达力/性能的场景。

四、常见场景模板与命令清单

场景 firewalld 命令 iptables 命令
仅公司网段访问 22/TCP(其余来源拒绝) 将默认区域设为 public 且不放开 ssh;把公司网段加入 trusted;或移除 ssh 服务并用富规则仅放行公司网段 先 DROP 22,再对 22 插入公司网段 ACCEPT 规则
端口转发:80→8080 开启 masquerade;用富规则 redirect 80→8080 nat/PREROUTING 做 DNAT,配合 filter/FORWARD 放行
限制 SSH 暴力连接 富规则:limit value="5/m" accept 使用 recent 模块或基于日志/外部工具联动限速
记录被拒绝流量 --set-log-denied=all 并查看 journalctl -u firewalld 在 INPUT 链对 DROP/REJECT 前插入 LOG 目标
  • 参考命令示例(firewalld 公司网段放行 SSH):
    firewall-cmd --permanent --remove-service=ssh
    firewall-cmd --permanent \
      --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port port="22" protocol="tcp" accept'
    firewall-cmd --reload
    
  • 参考命令示例(iptables 仅放行特定来源访问某端口):
    iptables -I INPUT -p tcp --dport 9889 -j DROP
    iptables -I INPUT -s 192.168.1.0/24 -p tcp --dport 9889 -j ACCEPT
    iptables -I INPUT -s 203.0.113.10/32 -p tcp --dport 9889 -j ACCEPT
    
  • 参考命令示例(端口转发 80→8080):
    firewall-cmd --permanent --add-masquerade
    firewall-cmd --permanent \
      --add-rich-rule='rule family=ipv4 destination port port=80 protocol=tcp redirect port=8080'
    firewall-cmd --reload
    

五、安全与运维最佳实践

  • 始终遵循最小权限原则:默认拒绝入站,按需开放;按业务划分 Zone,按源地址精细化授权。
  • 变更采用“试运行 + 持久化 + 回滚预案”:firewalld 区分运行时与永久规则,变更后用 --reload 生效;iptables 变更前先备份并准备回滚脚本。
  • 保持连接不断:优先使用 firewall-cmd --reload 而非完全重载;必要时才用 --complete-reload(会断开现有连接)。
  • 开启拒绝日志并集中审计:--set-log-denied=all,配合 journalctl -u firewalld 与集中日志系统。
  • 性能与可维护性:在 firewalld.conf 启用 nftables 后端与批量操作;iptables 使用自定义链分类管理,减少重复与漏配。

0