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,确认无误后再永久保存。
如果发现某个端口访问不通,优先排查有没有被防火墙挡在外面。