Linux Firewalld 是什么
Firewalld 是 Linux 系统中一个动态的防火墙管理工具,旨在简化防火墙规则的配置和管理。它通过引入“区域(zone)”和“服务(service)”的概念,提供更灵活的网络安全管理方式。
动态防火墙管理工具,相比传统的iptables的静态方式,更新规则后不需要重启服务。 基于区域(zone),集成了常见的服务(http、ssh)等,简化配置流程
为什么要使用firewalld
- 动态更新 - 规则变更即时生效,无需重启服务,避免网络中断
- 简化管理 - 通过区域和服务抽象复杂规则,降低配置难度
- 灵活性 - 支持临时和永久规则,适应测试和生产环境需求
- 与系统集成 - 与 NetworkManager 协作,自动切换区域(如从家庭网络切换到公共网络)
如何使用firewalld
一般情况下,系统会自带firewalld,如果没有,需要自行安装。
sudo apt install firewalld # Debian/Ubuntu
sudo dnf install firewalld # CentOS/RHEL/Fedora
管理firewalld
sudo systemctl enable --now firewalld # 启用并立即启动
sudo systemctl stop firewalld # 停止
sudo systemctl restart firewalld # 重启
- 查询状态
firewall-cmd --state # 显示 running/not running
- 查看默认区域
firewall-cmd --get-default-zone # 例如输出:public
- 列出所以区域
firewall-cmd --get-zones
- 切换默认区域
sudo firewall-cmd --set-default-zone=home --permanent
sudo firewall-cmd --reload
- 查看活动区域
firewall-cmd --get-active-zones
服务/端口管理
- 临时开发http服务
sudo firewall-cmd --add-service=http
- 永久开发https服务
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
- 开放指定端口
sudo firewall-cmd --add-port=8080/tcp --permanent
sudo firewall-cmd --reload
规则管理
- 列出当前规则
sudo firewall-cmd --list-all # 显示所有规则(当前区域)
- 移除规则
sudo firewall-cmd --remove-port=8080/tcp --permanent
sudo firewall-cmd --reload
-
富规则
- 允许特定ip访问ssh
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.100/32" service name="ssh" accept' --permanent sudo firewall-cmd --reload
- 拒绝某ip访问80端口
sudo firewall-cmd --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" port port="80" protocol="tcp" reject'
紧急阻断所有流量
sudo firewall-cmd --panic-on # 启用紧急模式
sudo firewall-cmd --panic-off # 关闭
一些例子
查看所有预定义服务
firewall-cmd --get-services
# 示例输出:ssh dhcpv6-client http https ...
永久允许https服务
sudo firewall-cmd --add-service=https --permanent
sudo firewall-cmd --reload
移除ssh服务
sudo firewall-cmd --remove-service=ssh --permanent
sudo firewall-cmd --reload
- 临时开放3306
sudo firewall-cmd --add-port=3306/tcp
- 永久开放123
sudo firewall-cmd --add-port=123/udp --permanent
sudo firewall-cmd --reload
- 开放范围端口
sudo firewall-cmd --add-port=5000-6000/tcp --permanent
sudo firewall-cmd --reload
- 移除3306(永久)
sudo firewall-cmd --remove-port=3306/tcp --permanent
sudo firewall-cmd --reload
富规则
- 允许特定 IP 访问 SSH
sudo firewall-cmd --add-rich-rule='
rule family="ipv4"
source address="192.168.1.100/32"
service name="ssh"
accept' --permanent
sudo firewall-cmd --reload
- 拒绝某 IP 段访问 HTTP 端口
sudo firewall-cmd --add-rich-rule='
rule family="ipv4"
source address="10.0.0.0/24"
port port="80" protocol="tcp"
reject' --permanent
sudo firewall-cmd --reload
- 允许某 IP 访问特定端口范围
sudo firewall-cmd --add-rich-rule='
rule family="ipv4"
source address="203.0.113.50/32"
port port="8000-9000" protocol="tcp"
accept' --permanent
sudo firewall-cmd --reload
- 查看富规则
sudo firewall-cmd --list-rich-rules
- 允许http/https
sudo firewall-cmd --add-service={http,https} --permanent
sudo firewall-cmd --reload
总结
一般情况下,都是添加或者移除某个端口的的访问,有时候需要端口段的添加和移除。特殊情况下,比如要精准控制的时候,就使用富规则, 富规则配置更多,越早添加的规则优先级越高。 测试的时候,可以先不加permanent,确认无误后再永久保存。 如果发现某个端口访问不通,优先排查有没有被防火墙挡在外面。