zone 的匹配优先级
前面《防火墙03 — 了解Firewalld》中提到——在 Firewalld 中,信任优先级的不同,代表着不同严格程度的防火墙,信任级别越低,防火墙越严格。默认情况下,Firewalld 预定义了 9 个 zone。
对于数据报文,有它的 zone 匹配优先级:
- 源 IP 关联 zone 的优先级最高;
- 报文入站的网卡关联 zone 的优先级其次;
- 默认 zone
在初次使用 Firewalld 时,基本思路:
- 确认默认 zone 是哪个;
- 确认源网段或源 IP 或网卡关联的 zone;
- 设定 zone 的匹配规则
默认 zone
前面《防火墙03 — 了解Firewalld》我们提到,由于配置文件中定义了初始默认的 zone(DefaultZone=public),因此当您第一次启动 Firewalld 时,默认的 zone 就是 public。
Shell > grep -i defaultzone /etc/firewalld/firewalld.conf
DefaultZone=public
Shell > systemctl start firewalld.service
Shell > firewall-cmd --get-default-zone
public
直接键入 firewall-cmd --set-default-zone=work
命令即可永久更改初始默认 zone。
Shell > firewall-cmd --set-default-zone=work
Shell > grep -i defaultzone /etc/firewalld/firewalld.conf
DefaultZone=work
源 IP 或源网段
添加源网段到某个 zone
比如我要将 192.168.10.0/24 这个网段关联到 home 这个zone,可以键入这个命令:
Shell > firewall-cmd --permanent --add-source=192.168.10.0/24 --zone=home
若此刻查看 home 这个 zone 的内容,会发现其没有生效,我们需要再使用 firewall-cmd --reload
或 systemctl restart firewalld.service
让你的修改生效:
Shell > firewall-cmd --list-all --zone=home
home
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client mdns samba-client ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Shell > firewall-cmd --reload
success
Shell > firewall-cmd --list-all --zone=home
home (active)
target: default
icmp-block-inversion: no
interfaces:
sources: 192.168.10.0/24
services: cockpit dhcpv6-client mdns samba-client ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
此时 zone 的情况如下:
- 默认 zone 为 work
- ens160 网关关联的 zone 为 work
- 源网段关联的 zone 为 home
Shell > firewall-cmd --get-active-zones
home
sources: 192.168.10.0/24
work
interfaces: ens160
Shell > firewall-cmd --get-default-zone
work
当有数据报文过来时,其 zone 的匹配优先级为 home ——> work
变更源网段所在的 zone
当您需要更改这个源网段所在的 zone 时,键入如下命令即可:
Shell > firewall-cmd --permanent --change-source=192.168.10.0/24 --zone=public && firewall-cmd --reload
success
success
Shell > firewall-cmd --list-all --zone=public
public (active)
target: default
icmp-block-inversion: no
interfaces:
sources: 192.168.10.0/24
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Shell > firewall-cmd --get-active-zones
public
sources: 192.168.10.0/24
work
interfaces: ens160
当有数据报文过来时,其 zone 的匹配优先级为 public ——> work
删除某个 zone 中的源网段
Shell > firewall-cmd --permanent --remove-source=192.168.10.0/24 --zone=public && firewall-cmd --reload
Shell > firewall-cmd --list-all --zone=public
public
target: default
icmp-block-inversion: no
interfaces:
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Shell > firewall-cmd --get-active-zones
work
interfaces: ens160
当有数据报文过来时,其 zone 的匹配优先级为 work
网卡
需要注意的是,活跃的网卡默认会绑定到默认 zone 中,是 不能被移除 的(除非网卡已经处于非活跃状态,即已经不受 NetworkManager 控制或物理移除了网卡),即使移除了,重载后也会加到默认的 zone 中。换言之,活跃网卡一定要关联到一个 zone 中,不能是孤立的。对于多网卡的服务器,我们建议您需要合理地将网卡分配到对应的 zone 中(通过 firewall-cmd --permanent --change-interface=<interface> --zone=<zone>
来改变)。
Shell > firewall-cmd --state
running
Shell > firewall-cmd --get-default-zone
work
Shell > firewall-cmd --get-active-zones
work
interfaces: ens160
Shell > firewall-cmd --list-all --zone=work
work (active)
target: default
icmp-block-inversion: no
interfaces: ens160 ←←←← 这里
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
forward: no
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
假设我需要将 ens160 从默认的 work 中移除:
Shell > firewall-cmd --permanent --remove-interface=ens160 --zone=work && firewall-cmd --reload
The interface is under control of NetworkManager and already bound to the default zone
The interface is under control of NetworkManager, setting zone to default.
success
success
Shell > firewall-cmd --get-default-zone
work
Shell > firewall-cmd --get-active-zones
work
interfaces: ens160
“;” 表示前后的命令没有逻辑关系。
“||” 代表的是一种逻辑或关系,即若 “||” 前一个命令非报错地正确执行了,则 “||” 后面的命令不会执行。若 “||” 前一个命令执行后报错,则 “||” 后面的命令会执行。