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
|