防火墙04 — Firewalld中区域的匹配优先级

zone 的匹配优先级

前面《防火墙03 — 了解Firewalld》中提到——在 Firewalld 中,信任优先级的不同,代表着不同严格程度的防火墙,信任级别越低,防火墙越严格。默认情况下,Firewalld 预定义了 9 个 zone。

对于数据报文,有它的 zone 匹配优先级:

  1. 源 IP 关联 zone 的优先级最高;
  2. 报文入站的网卡关联 zone 的优先级其次;
  3. 默认 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 --reloadsystemctl 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 的情况如下:

  1. 默认 zone 为 work
  2. ens160 网关关联的 zone 为 work
  3. 源网段关联的 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
扩展知识
bash 中 “&&” 代表的是一种逻辑与关系,即只有 “&&” 前一个命令非报错地正确执行后才执行 “&&” 后面的命令,若 “&&” 前一个命令执行后报错,则 “&&” 后面的命令不会执行。
“;” 表示前后的命令没有逻辑关系。
“||” 代表的是一种逻辑或关系,即若 “||” 前一个命令非报错地正确执行了,则 “||” 后面的命令不会执行。若 “||” 前一个命令执行后报错,则 “||” 后面的命令会执行。
Avatar photo

关于 陸風睿

GNU/Linux 从业者、开源爱好者、技术钻研者,撰写文档既是兴趣也是工作内容之一。Q - "281957576";WeChat - "jiulongxiaotianci"
用一杯咖啡支持我们,我们的每一篇[文档]都经过实际操作和精心打磨,而不是简单地从网上复制粘贴。期间投入了大量心血,只为能够真正帮助到您。
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇