firewalld 命令行工具 firewall-cmd 详解与实战
firewall-cmd 是 firewalld 服务的命令行管理界面,用于配置 Linux 系统的动态防火墙规则。自 CentOS 7 起,firewalld 取代了传统的 iptables,成为系统默认的防火墙管理方案。该工具将运行时配置与持久化配置分离,支持在不中断现有连接的情况下动态调整规则。
基础状态管理
查看防火墙守护进程是否运行:
firewall-cmd --state
重新加载规则配置(保留当前连接状态):
firewall-cmd --reload
将当前运行时配置写入磁盘,使其成为永久配置:
firewall-cmd --runtime-to-permanent
完全重置防火墙(会中断所有活动连接,仅在严重故障时使用):
firewall-cmd --complete-reload
区域(Zone)配置
firewalld 使用区域来定义不同网络环境的安全策略。查看系统预定义的区域列表:
firewall-cmd --get-zones
查看当前默认区域:
firewall-cmd --get-default-zone
切换默认区域为 internal:
firewall-cmd --set-default-zone=internal
查看网卡 eth0 所属区域:
firewall-cmd --get-zone-of-interface=eth0
将网卡绑定到指定区域:
firewall-cmd --zone=dmz --change-interface=eth0
服务管理
列出系统预定义的所有服务:
firewall-cmd --get-services
查看当前区域已启用的服务:
firewall-cmd --list-services
查看特定区域的服务配置:
firewall-cmd --zone=work --list-services
临时允许 http 服务(仅运行时生效):
firewall-cmd --add-service=http
永久允许 https 服务(需配合 --permanent):
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
验证服务是否已启用:
firewall-cmd --query-service=mysql
移除指定服务:
firewall-cmd --permanent --remove-service=ftp
firewall-cmd --reload
端口管理
查看当前区域开放的端口:
firewall-cmd --list-ports
临时开放单个 TCP 端口:
firewall-cmd --add-port=3306/tcp
永久开放端口范围(5000-5010):
firewall-cmd --permanent --add-port=5000-5010/tcp
firewall-cmd --reload
支持多种协议类型:
firewall-cmd --permanent --add-port=5060/udp
firewall-cmd --permanent --add-port=8080/sctp
移除端口规则:
firewall-cmd --permanent --remove-port=8080/tcp
firewall-cmd --reload
查询端口状态:
firewall-cmd --query-port=22/tcp
富规则(Rich Rules)配置
富规则提供了更灵活的流量控制机制,支持基于源地址、目的地址、端口、协议等条件的复杂匹配。
查看当前区域的富规则:
firewall-cmd --list-rich-rules
拒绝特定 IPv4 地址的所有访问:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.50" reject'
firewall-cmd --reload
限制特定网段仅能访问 22 端口:
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" port protocol="tcp" port="22" accept'
删除指定的富规则(建议复制粘贴避免语法错误):
firewall-cmd --permanent --remove-rich-rule='rule family="ipv4" source address="10.0.0.50" reject'
firewall-cmd --reload
添加带超时时间的临时规则(300 秒后自动失效):
firewall-cmd --add-rich-rule='rule family="ipv4" source address="172.16.0.5" accept' --timeout=300s
端口转发与地址伪装
启用 IPv4 地址伪装(NAT):
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
配置端口转发(将本机 8080 端口转发到内网 192.168.1.10 的 80 端口):
firewall-cmd --permanent --add-forward-port=port=8080:proto=tcp:toport=80:toaddr=192.168.1.10
firewall-cmd --reload
查看转发规则:
firewall-cmd --list-forward-ports
IP 集合(IPset)管理
创建 IP 地址集合用于批量管理:
firewall-cmd --permanent --new-ipset=blacklist --type=hash:ip
firewall-cmd --reload
向集合添加单个 IP:
firewall-cmd --permanent --ipset=blacklist --add-entry=192.168.1.100
从文件批量导入 IP 地址:
firewall-cmd --permanent --ipset=blacklist --add-entries-from-file=/tmp/badips.txt
查看集合内容:
firewall-cmd --ipset=blacklist --get-entries
应急模式与锁定机制
启用应急模式(丢弃所有数据包,类似断网):
firewall-cmd --panic-on
关闭应急模式:
firewall-cmd --panic-off
查询应急状态:
firewall-cmd --query-panic
启用配置锁定(防止未授权修改):
firewall-cmd --lockdown-on
添加命令到锁定白名单:
firewall-cmd --permanent --add-lockdown-whitelist-command="/usr/bin/systemctl restart firewalld"
常用配置示例
配置 Web 服务器常用规则:
# 允许 HTTP 和 HTTPS 服务
firewall-cmd --permanent --add-service=http
firewall-cmd --permanent --add-service=https
# 开放自定义管理端口 10000/tcp
firewall-cmd --permanent --add-port=10000/tcp
# 限制 SSH 仅允许管理网段访问
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.10.0/24" service name="ssh" accept'
# 应用配置
firewall-cmd --reload
配置数据库服务器安全策略:
# 创建 IP 白名单集合
firewall-cmd --permanent --new-ipset=db_clients --type=hash:ip
firewall-cmd --permanent --ipset=db_clients --add-entry=10.0.20.5
firewall-cmd --permanent --ipset=db_clients --add-entry=10.0.20.6
# 仅允许白名单 IP 访问 3306 端口
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source ipset="db_clients" port protocol="tcp" port="3306" accept'
# 明确拒绝其他来源的数据库访问
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port protocol="tcp" port="3306" reject'
firewall-cmd --reload
配置文件路径
firewalld 的配置文件位于以下目录:
/usr/lib/firewalld/— 系统默认配置(不建议修改)/etc/firewalld/— 用户自定义配置
查看特定区域的配置文件位置:
firewall-cmd --permanent --path-zone=public
查看服务的配置文件位置:
firewall-cmd --permanent --path-service=ssh