Linux Firewalld 是什么

Firewalld 是 Linux 系统中一个动态的防火墙管理工具,旨在简化防火墙规则的配置和管理。它通过引入“区域(zone)”和“服务(service)”的概念,提供更灵活的网络安全管理方式。

动态防火墙管理工具,相比传统的iptables的静态方式,更新规则后不需要重启服务。 基于区域(zone),集成了常见的服务(http、ssh)等,简化配置流程

为什么要使用firewalld

  1. 动态更新 - 规则变更即时生效,无需重启服务,避免网络中断
  2. 简化管理 - 通过区域和服务抽象复杂规则,降低配置难度
  3. 灵活性 - 支持临时和永久规则,适应测试和生产环境需求
  4. 与系统集成 - 与 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,确认无误后再永久保存。 如果发现某个端口访问不通,优先排查有没有被防火墙挡在外面。