概述
本文将带您来设置 zone 中的防火墙规则。
在 Firwalld 中,规则分为两大部分:
- 基本规则 – 将具体的 service 或 port 添加到 zone 中即表示允许的数据报文,不能设置匹配规则后的执行动作
- 富规则 – 顾名思义,即更加丰富更加复杂的防火墙规则。
基本规则
为了方便演示,我机器中的 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 的匹配优先级:
- 源IP 关联 zone 的优先级最高
- 网卡关联 zone 的优先级次之
- 默认 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 匹配优先级:
- 源 IP 关联 zone 的优先级最高;
- 报文入站的网卡关联 zone 的优先级其次;
- 默认 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 主要用于实现私有网络访问公共网络的功能。
一台多网卡的服务器是可以配置成网关的,众所周知,网关最基本的功能有两个:
- 路由功能;
-
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
效果达成:
