Featured image of post firewall-cmd 实现防火墙管理 常用命令及示例

firewall-cmd 实现防火墙管理 常用命令及示例

firewall-cmd 实现防火墙管理 常用命令及示例

firewall规则优先级

firewalld基于iptables, 规则优先级顺序为:直接执行规则 > 富规则 > 端口规则 > 服务规则 > 区域默认策略(例如public默认拒绝所有入站流量)。
firewalld默认区域是public ,zones缺省规则也都是public。

firewalld富规则执行优先级参数 priority ,值范围是 -32768到32767,数值越小优先级越高,比如 sudo firewall-cmd --add-rich-rule='rule priority=10' 。在同类规则中,“reject”优先于“accept” 。

--permanent 参数表示永久生效,需配合 --reload 使用。修改前建议备份配置: sudo cp /etc/firewalld/zones/public.xml /root/backup/

注意:开启firewalld之前务必手动写入规则,防止出现被阻断无法通过SSH连接的情况。可通过 nano /etc/firewalld/zones/public.xml 编辑,参考如下规则写法:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="mdns"/>
  <service name="dhcpv6-client"/>
  <port port="8080" protocol="tcp"/>
  <port port="5353" protocol="udp"/>
  <rule family="ipv4">
    <source address="10.1.1.1/32"/>
    <accept/>
  </rule>
  <rule family="ipv4">
    <source address="10.1.1.2/32"/>
    <accept/>
  </rule>
  <rule family="ipv4">
    <source address="10.1.0.0/24"/>
    <accept/>
  </rule>
  <rule family="ipv4">
    <source address="10.1.0.0/24"/>
    <port port="8080" protocol="tcp"/>
    <accept/>
  </rule>
  <forward/>
</zone>

开启防火墙服务:

1
2
systemctl enable firewalld
systemctl start firewalld

再次强调,开启firewalld之前务必手动写入规则,防止出现被阻断上不去SSH情况。

端口管理

  • 临时开放80/tcp端口(这里80仅为示例,实际可随机替换,以下同理): sudo firewall-cmd --add-port=80/tcp
  • 永久开放443/tcp端口: sudo firewall-cmd --add-port=443/tcp --permanent
  • 查看已开放端口: sudo firewall-cmd --list-ports
  • 移除8080/tcp端口: sudo firewall-cmd --remove-port=8080/tcp --permanent

高级规则

  • 允许一个 IPv4 网段 (如 10.1.2.0/24) 访问所有端口: sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.1.2.0/24" accept'
  • 允许一个 IPv4 地址 (如 10.1.3.4) 访问特定端口 (如 TCP 端口5000): sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.1.3.4/32" port protocol="tcp" port="5000" accept'
  • 拒绝 IPv4 地址 (如 10.1.4.5) 访问任何端口(优先级高于允许规则时): sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.1.4.5/32" reject'
  • 允许 IPv4 地址 (如 10.1.5.6) 访问指定服务: firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.1.5.6" service name="ssh" accept'
  • 移除永久规则,然后重载生效:
1
2
sudo firewall-cmd --zone=public --permanent --remove-rich-rule='rule family="ipv4" source address="10.1.5.6/32" accept'
sudo firewall-cmd --reload

配置重载

1
2
3
4
5
6
# 重载防火墙配置(不中断现有连接)
sudo firewall-cmd --reload
# 完全重启(中断所有连接)
sudo firewall-cmd --complete-reload
# 查看现有规则
sudo firewall-cmd --list-all

启动/停止/重启防火墙服务

1
2
3
4
5
6
7
8
sudo systemctl start firewalld
sudo systemctl stop firewalld
sudo systemctl restart firewalld
# 设置开机自启/禁用
sudo systemctl enable firewalld
sudo systemctl disable firewalld
# 检查服务状态
sudo systemctl status firewalld

基本状态查询

1
2
3
4
5
6
7
8
# 查看防火墙状态(运行中/未运行)
sudo firewall-cmd --state
# 查看所有活动区域及接口
sudo firewall-cmd --get-active-zones
# 查看默认区域
sudo firewall-cmd --get-default-zone
# 查看所有可用区域
sudo firewall-cmd --get-zones

区域管理

1
2
3
4
5
6
# 设置默认区域为public
sudo firewall-cmd --set-default-zone=public
# 查看指定区域(如public)的配置
sudo firewall-cmd --zone=public --list-all
# 将接口eth0绑定到work区域
sudo firewall-cmd --zone=work --add-interface=eth0 --permanent

服务管理

1
2
3
4
5
6
7
8
# 允许http服务(临时)
sudo firewall-cmd --add-service=http
# 永久允许https服务
sudo firewall-cmd --add-service=https --permanent
# 查看所有预定义服务
sudo firewall-cmd --get-services
# 查看已允许服务
sudo firewall-cmd --list-services

Licensed under CC BY-NC-SA 4.0
最后更新于 Nov 21, 2025 01:00 UTC
this is the end :)