是否考虑过直接使用 nftables 管理网络规则,它提供了更底层的控制?
如何通过 firewalld 在 Rocky Linux 9 中创建并应用自定义规则?
在Rocky Linux 9中通过firewalld创建自定义规则,可使用firewall-cmd
命令。例如允许特定IP访问SSH端口:
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept'
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条记录。
更多回答
作为IT架构师,建议通过以下步骤在Rocky Linux 9中通过firewalld创建并应用自定义规则:
-
理解zone与规则逻辑:
- 根据业务需求选择默认zone(如public/trusted)或新建独立zone,实现规则隔离。
- 使用
firewall-cmd --get-default-zone
验证当前生效区域。
-
创建自定义zone(可选):
sudo firewall-cmd --permanent --new-zone=custom_app sudo firewall-cmd --reload
-
添加定制规则:
- 开放端口:
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'
- 开放端口:
-
应用与绑定接口:
sudo firewall-cmd --zone=custom_app --change-interface=eth0 --permanent sudo firewall-cmd --reload
-
验证与调试:
- 使用
firewall-cmd --zone=custom_app --list-all
检查规则加载 - 通过
journalctl -u firewalld -f
监控实时日志 - 测试连通性时建议结合
tcpdump
进行包捕获分析
- 使用
架构建议:
- 生产环境推荐将基础规则写入
/etc/firewalld
目录的XML配置文件实现版本化管理 - 复杂规则建议通过Ansible等自动化工具部署,确保环境一致性
- 对于容器化应用,优先考虑与podman/docker网络集成,避免多层NAT干扰
在Rocky Linux 9中,使用firewall-cmd
命令创建自定义规则(如添加端口或服务),通过--reload
应用更改,并使用--permanent
参数保存持久化配置。
-
确认firewalld运行状态:
sudo systemctl status firewalld # 检查是否运行 sudo systemctl enable --now firewalld # 启用并启动服务(若未运行)
-
创建自定义Zone(可选):
sudo firewall-cmd --permanent --new-zone=custom-zone # 创建永久zone sudo firewall-cmd --reload # 重载生效 sudo firewall-cmd --set-default-zone=custom-zone # 设为默认zone
-
添加服务/端口规则:
sudo firewall-cmd --zone=custom-zone --add-port=8080/tcp --permanent # 开放TCP 8080 sudo firewall-cmd --zone=custom-zone --add-service=http --permanent # 允许HTTP服务
-
配置富规则(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
-
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
-
应用并验证配置:
sudo firewall-cmd --reload # 强制重载规则 sudo firewall-cmd --zone=custom-zone --list-all # 查看完整配置
注意:
- 生产环境建议先通过
--timeout=300
参数测试临时规则 - 复杂规则建议使用
--permanent
配合firewall-cmd --runtime-to-permanent
固化 - 若遇SELinux拦截,需配合
semanage
调整策略
在Rocky Linux 9中通过firewalld创建自定义规则,建议遵循以下流程:
- 定义需求:明确需开放的端口(如--add-port=8080/tcp)、协议或IP白名单(使用rich rules)。
- 创建专属区域:
firewall-cmd --new-zone=custom_zone --permanent
,避免修改默认zone。 - 添加规则:用
--add-rich-rule
处理复杂逻辑(例:限制源IP),或--add-forward-port
处理端口转发。 - 验证并生效:先
--reload
加载配置,再firewall-cmd --list-all-zones
检查规则是否冲突。
经验提示:
- 生产环境务必通过
--permanent
持久化规则,避免重启丢失 - 复杂规则建议分阶段测试,用
--timeout=300
临时生效观察 - 维护文档记录规则变更逻辑,推荐使用ansible固化配置流程
在Rocky Linux 9中通过firewalld创建自定义规则的核心流程可分为规则定义、区域管理、规则持久化三阶段。以下是实践方法论及经验总结:
-
直接规则注入 使用
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
实现精准协议控制。曾遇到多网卡环境下规则未绑定特定zone导致流量逃逸,需通过--zone=dmz
明确作用域。 -
富规则分层架构
firewall-cmd --add-rich-rule='rule family=ipv4 source address=203.0.113.5/32 port port=3306 protocol=tcp reject'
可构建复杂访问矩阵。生产环境中发现富规则优先级高于基础规则,需通过--priority=32765
参数调整执行顺序。 -
服务对象化封装 创建/etc/firewalld/services/mycustom.xml定义复合端口协议,配合
--add-service=mycustom
实现规则复用。在Kubernetes节点部署时遭遇服务定义冲突,需检查/usr/lib/firewalld/services目录的默认模板。 -
运行时调试技巧 通过
nft list ruleset
验证底层nftables实现,曾发现firewalld规则转换错误导致TCP MSS值异常,需使用--direct --passthrough
注入原生nft命令。 -
持久化陷阱 非
--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
实现物理隔离。