防火墙05 — 在Firewalld的区域中设置规则

概述

本文将带您来设置 zone 中的防火墙规则。

在 Firwalld 中,规则分为两大部分:

  1. 基本规则 – 将具体的 service 或 port 添加到 zone 中即表示允许的数据报文,不能设置匹配规则后的执行动作
  2. 富规则 – 顾名思义,即更加丰富更加复杂的防火墙规则。

基本规则

为了方便演示,我机器中的 Firewalld 已经还原为初始设置。

我们说的 service 或 port 指的是这个:

Shell > systemctl start firewalld.service

Shell > firewall-cmd --get-default-zone
public

Shell > firewall-cmd --get-active-zones
public
  interfaces: ens160

Shell > firewall-cmd --list-all --zone=public
public (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:

service

相关命令:

  • --get-services – 显示预先定义的服务,即显示所有您可以添加的预定义服务:
  • --add-service=<service> – 为 zone 添加服务
  • --remove-service=<service> – 删除 zone 中的服务
  • --list-services – 显示 zone 中添加的服务

比如我需要将 ftp 服务添加到默认 zone 中:

Shell > firewall-cmd --permanent --add-service=ftp --zone=public && firewall-cmd --reload

Shell > firewall-cmd --zone=public --list-services
cockpit dhcpv6-client ftp ssh

service 不需要您死记硬背,当您键入命令到这里时可使用 Tab 键查看要添加的 service:

Shell > firewall-cmd --permanent --zone=public --add-service=
Display all 176 possibilities? (y or n)

port

相关命令:

  • --add-port=<端口号/协议> – 为 zone 添加端口以及对应的协议
  • --remove-port=<端口号/协议> – 从 zone 中删除端口
  • --list-ports – 列出为 zone 添加的端口

服务与其默认端口的对应关系可通过 /etc/services 文件查看。

比如将这个 port 添加到默认 zone 中:

Shell > firewall-cmd --permanent --zone=public --add-port=443/tcp && firewall-cmd --reload
success
success

Shell > firewall-cmd --list-ports --zone=public
443/tcp

Shell > firewall-cmd --list-all --zone=public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: cockpit dhcpv6-client ftp ssh
  ports: 443/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

Q:对于默认 zone,如果数据报文既不在 service 中,也不在 port 中,那么这个数据报文是否一定会被拒绝?

不一定。前面《防火墙04 — Firewalld中区域的匹配优先级》提到 zone 的匹配优先级:

  1. 源IP 关联 zone 的优先级最高
  2. 网卡关联 zone 的优先级次之
  3. 默认 zone 的优先级最低

拿上面的例子来说,我们只是在默认 zone 中设置防火墙规则。

基本规则注意事项

  • 确定默认 zone 是哪个
  • 注意 zone 的匹配优先级
  • 基本规则不需要设置匹配规则后的执行动作,只要基本规则中存在对应的条目,即允许数据报文通过
  • 仅当数据报文没有匹配到所有活跃 zone 中的防火墙规则时才最终被拒绝

富规则

相关语法:

  • --add-rich-rule='<RULE>' – 在指定 zone 中添加一条富规则
  • --remove-rich-rule='<RULE>' – 在指定的 zone 中删除一条富规则
  • --query-rich-rule='<RULE>' – 查询富规则是否已经被添加,若被添加则返回 0,未添加则返回 1
  • --list-rich-rule – 列出指定 zone 里的所有富规则

在富规则中,多种多样的元素扩展了防火墙规则,每种元素对应着特定的富规则匹配属性:

  • Rule 元素 —— rule [family="ipv4|ipv6"] [priority="priority"]
  • Source 元素 —— source [not] address="address[/mask]"|mac="mac-address"|ipset="ipset"
  • Destination 元素 —— destination [not] address="address[/mask]"|ipset="ipset"
  • Service 元素 —— service name="service name","service name" 请查询 /etc/services 文件
  • Port 元素 —— port port="port value" protocol="tcp|udp|sctp|dccp"
  • Protocol 元素 —— protocol value="protocol value","protocol value" 请查阅 /etc/protocols 文件
  • ICMP-Block 元素 —— icmp-block name="icmptype name"
  • Masquerade 元素 —— masquerade
  • ICMP-Type 元素 —— icmp-type name="icmptype name"
  • Forward-Port 元素 —— forward-port port="port value" protocol="tcp|udp|sctp|dccp" to-port="port value" to-addr="address"
  • Source-Port 元素 —— source-port port="port value" protocol="tcp|udp|sctp|dccp"
  • Log 元素 —— log [prefix="prefix text"] [level="log level"] [limit value="rate/duration"]
  • Audit 元素 —— audit [limit value="rate/duration"]
  • Action 元素 —— accept | reject | drop | mark
  • Limit 元素 —— limit value="rate/duration"

富规则与基本规则一样,对于数据报文,有它的 zone 匹配优先级:

  1. 源 IP 关联 zone 的优先级最高;
  2. 报文入站的网卡关联 zone 的优先级其次;
  3. 默认 zone

富规则使用示例

# 这条命令的意思是 —— 对于 IPv4,当有源地址是 172.16.0.0/24 这个网段来访问当前机器的 ftp 服务时,则允许通过。
Shell > firewall-cmd --permanent --zone=public \
--add-rich-rule='rule family=ipv4 source address=172.16.0.0/24 service name=ftp accept' && firewall-cmd --reload

Shell > firewall-cmd --list-rich-rules --zone=public
rule family="ipv4" source address="172.16.0.0/24" service name="ftp" accept

Shell > firewall-cmd --list-all --zone=public
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: cockpit dhcpv6-client ftp ssh
  ports: 443/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
        rule family="ipv4" source address="172.16.0.0/24" service name="ftp" accept

# 若您不再需要这条富规则,将其移除即可
Shell > firewall-cmd --permanent --zone=public \
--remove-rich-rule='rule family=ipv4 source address=172.16.0.0/24 service name=ftp accept' && firewall-cmd --reload

Shell > firewall-cmd --zone=public --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens160
  sources:
  services: cockpit dhcpv6-client ftp ssh
  ports: 443/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
# 端口也可以是连续的,也可以是单个端口
Shell > firewall-cmd --permanent --zone=public \
--add-rich-rule='rule family=ipv4 source address=10.0.0.0/24 port port=80-100 protocol=tcp reject' && firewall-cmd --reload
# 当有来自源地址是 192.168.100.3 的 ICMP 探测数据报文时,则拒绝
Shell > firewall-cmd --permanent --zone=public \
--add-rich-rule='rule  family=ipv4  source address=192.168.100.3 protocol value=icmp  reject' && firewall-cmd --reload

# Windows 的 PowerShell
PS > ping 192.168.100.20

正在 Ping 192.168.100.20 具有 32 字节的数据:
来自 192.168.100.20 的回复: 无法连到端口。
来自 192.168.100.20 的回复: 无法连到端口。
来自 192.168.100.20 的回复: 无法连到端口。
来自 192.168.100.20 的回复: 无法连到端口。

192.168.100.20 的 Ping 统计信息:
    数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),

Firewalld 富规则在 NAT 中的实验

当您的服务器充当的角色为网关时,可能还需要 Destination 元素。

NAT(Network Address Translation,网络地址转换):将 IP 数据包头中的 IP 地址转换为另一个IP 地址的过程。在实际应用中,NAT 主要用于实现私有网络访问公共网络的功能。

一台多网卡的服务器是可以配置成网关的,众所周知,网关最基本的功能有两个:

  1. 路由功能;
  2. NAT。NAT 又划分为 SNAT 和 DNAT。

    • SNAT( Source Network Address Translation )源网络地址转换。将私有地址转换为公网地址的过程被称为 SNAT。比如我们家庭网络中的私有 IP 访问具有公网 IP 的资源服务时,路由器或防火墙就需要使用 SNAT 。
    • DNAT (Destination Network Address Translation) 目的网络地址转换。将公网地址转换为内网地址的过程被称为 DNAT,当您的内部资源需要对外提供访问时就需要 DNAT。

SNAT 实验

如下图的说明:

最终效果:网关做了SNAT以及路由转发后,私有IP的地址在公网上是 172.16.200.30/24,我们可以通过ssh连接公网 WEB 服务器看见。

Vmware 的设置如下:

RockyLinux 8.9 的网络信息:

Fedora 42 的网络信息:

Fedora 42 开启 Firewalld 中的地址伪装以及 IPv4 路由转发:

Fedora > vim /etc/sysctl.conf
net.ipv4.conf.all.forwarding = 1

Fedora > sysctl -p

Fedora > systemctl start firewalld.service

Fedora > firewall-cmd --permanent --zone=FedoraServer --add-masquerade && firewall-cmd --reload

Fedora > firewall-cmd --zone=FedoraServer --list-all
...
forward: yes
masquerade: yes
...

RockyLinux 9.5 的网络信息:

可以在 RockyLinux 9.5 上通过 SSH 远程登录 172.16.200.20:

通过截图看到我们的 SNAT 成功了。

DNAT 实验

如果公网 IP 地址需要访问私有 IP 地址中的资源,则需要 DNAT。它的原理是——当有任意公网 IP 地址访问路由器(网关)时,通过 DNAT 技术,将数据报文里的目标 IP 地址和目标端口做一个替换,转发给内网的服务器。

如下图所示:

将网关的 sshd 服务关闭,当公网设备通过 ssh -p 22 [email protected] 时,,可以通过 DNAT 技术将数据包转给 RockyLinux 9.5,即最终响应的是具有私有 IP 地址的这台设备。

RockyLinux 8.9 的网络信息:

Fedora 则执行以下命令:

Fedora > firewall-cmd --permanent --zone=FedoraServer -add-forward-port=port=22:proto=tcp:toport=22:toaddr=192.168.150.5
Fedora > firewall-cmd --reload 

# 等同于这条 iptables 命令
Fedora > iptables -t nat  -A PREROUTING  -i ens160 -d 172.16.200.30 -p tcp --dport 22 -j DNAT --to-destination 192.168.150.5

效果达成:

Avatar photo

关于 陸風睿

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

发送评论 编辑评论


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