如何通过 firewalld 在 Rocky Linux 9 中创建并应用自定义规则?

问题浏览数Icon
21
问题创建时间Icon
2025-06-02 13:29:00
作者头像
ptmojo88

在Rocky Linux 9中通过firewalld创建自定义规则的核心流程可分为规则定义、区域管理、规则持久化三阶段。以下是实践方法论及经验总结:

  1. 直接规则注入 使用firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT实现精准协议控制。曾遇到多网卡环境下规则未绑定特定zone导致流量逃逸,需通过--zone=dmz明确作用域。

  2. 富规则分层架构 firewall-cmd --add-rich-rule='rule family=ipv4 source address=203.0.113.5/32 port port=3306 protocol=tcp reject'可构建复杂访问矩阵。生产环境中发现富规则优先级高于基础规则,需通过--priority=32765参数调整执行顺序。

  3. 服务对象化封装 创建/etc/firewalld/services/mycustom.xml定义复合端口协议,配合--add-service=mycustom实现规则复用。在Kubernetes节点部署时遭遇服务定义冲突,需检查/usr/lib/firewalld/services目录的默认模板。

  4. 运行时调试技巧 通过nft list ruleset验证底层nftables实现,曾发现firewalld规则转换错误导致TCP MSS值异常,需使用--direct --passthrough注入原生nft命令。

  5. 持久化陷阱--permanent模式规则在reload时丢失,开发环境中建议采用firewall-cmd --runtime-to-permanent自动同步。但需注意该命令会覆盖手动修改的永久配置。

典型故障案例:在双栈环境中添加IPv6规则时,未显式指定family=ipv6导致规则仅作用于IPv4。通过journalctl -u firewalld -f观察到规则解析错误日志后修正。

最终规则部署应遵循:测试环境验证→分阶段rollout→nftables规则审计三层保障机制。建议将复杂规则拆分为独立zone,通过firewall-cmd --zone=trusted --change-interface=eth1实现物理隔离。

更多回答

作者头像
fengqing99

在Rocky Linux 9中通过firewalld创建自定义规则,可使用firewall-cmd命令。例如允许特定IP访问SSH端口:

  1. sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept'
  2. sudo firewall-cmd --reload

延伸知识点:富规则(Rich Rules)详解 富规则是firewalld中灵活定义复杂规则的语法结构,包含以下核心元素:

  • action:accept/reject/drop(如accept
  • family:ipv4/ipv6网络协议族
  • source/destination:地址范围(如source address="192.168.1.0/24"
  • service:预定义服务名称(如service name="http"
  • port/protocol:自定义端口和协议(如port="8080" protocol="tcp") 完整示例:rule family="ipv4" source address="10.0.0.0/8" service name="https" log prefix="https_log" level="info" limit value="2/m" accept 表示允许来自10.x.x.x的HTTPS请求,记录日志并限制每分钟2条记录。
作者头像
rainwolf33

是否考虑过直接使用 nftables 管理网络规则,它提供了更底层的控制?

作者头像
starpath88

作为IT架构师,建议通过以下步骤在Rocky Linux 9中通过firewalld创建并应用自定义规则:

  1. 理解zone与规则逻辑

    • 根据业务需求选择默认zone(如public/trusted)或新建独立zone,实现规则隔离。
    • 使用firewall-cmd --get-default-zone验证当前生效区域。
  2. 创建自定义zone(可选)

    sudo firewall-cmd --permanent --new-zone=custom_app
    sudo firewall-cmd --reload
  3. 添加定制规则

    • 开放端口
      sudo firewall-cmd --permanent --zone=custom_app --add-port=8080/tcp
    • 富规则(Rich Rules)
      sudo firewall-cmd --permanent --zone=custom_app --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="http" accept'
    • 拒绝特定IP
      sudo firewall-cmd --permanent --zone=custom_app --add-rich-rule='rule family="ipv4" source address="10.0.0.5" reject'
  4. 应用与绑定接口

    sudo firewall-cmd --zone=custom_app --change-interface=eth0 --permanent
    sudo firewall-cmd --reload
  5. 验证与调试

    • 使用firewall-cmd --zone=custom_app --list-all检查规则加载
    • 通过journalctl -u firewalld -f监控实时日志
    • 测试连通性时建议结合tcpdump进行包捕获分析

架构建议

  • 生产环境推荐将基础规则写入/etc/firewalld目录的XML配置文件实现版本化管理
  • 复杂规则建议通过Ansible等自动化工具部署,确保环境一致性
  • 对于容器化应用,优先考虑与podman/docker网络集成,避免多层NAT干扰
作者头像
sunnybird09

在Rocky Linux 9中,使用firewall-cmd命令创建自定义规则(如添加端口或服务),通过--reload应用更改,并使用--permanent参数保存持久化配置。

作者头像
firestone77
  1. 确认firewalld运行状态

    sudo systemctl status firewalld  # 检查是否运行
    sudo systemctl enable --now firewalld  # 启用并启动服务(若未运行)
  2. 创建自定义Zone(可选)

    sudo firewall-cmd --permanent --new-zone=custom-zone  # 创建永久zone
    sudo firewall-cmd --reload  # 重载生效
    sudo firewall-cmd --set-default-zone=custom-zone  # 设为默认zone
  3. 添加服务/端口规则

    sudo firewall-cmd --zone=custom-zone --add-port=8080/tcp --permanent  # 开放TCP 8080
    sudo firewall-cmd --zone=custom-zone --add-service=http --permanent  # 允许HTTP服务
  4. 配置富规则(Rich Rules)

    sudo firewall-cmd --zone=custom-zone --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="ssh" accept' --permanent  # 允许特定IP段访问SSH
  5. IP伪装与端口转发

    sudo firewall-cmd --zone=custom-zone --add-masquerade --permanent  # 开启IP伪装
    sudo firewall-cmd --zone=custom-zone --add-forward-port=port=80:proto=tcp:toport=8080 --permanent  # 80转8080
  6. 应用并验证配置

    sudo firewall-cmd --reload  # 强制重载规则
    sudo firewall-cmd --zone=custom-zone --list-all  # 查看完整配置

注意

  • 生产环境建议先通过--timeout=300参数测试临时规则
  • 复杂规则建议使用--permanent配合firewall-cmd --runtime-to-permanent固化
  • 若遇SELinux拦截,需配合semanage调整策略