如何在 CentOS 8 上使用 FirewallD 设置防火墙
简介– Linux 防火墙用于保护您的工作站或服务器免受不必要的流量侵害。您可以设置规则来阻止流量或允许通过。CentOS 8 附带一个动态、可自定义的基于主机的防火墙,带有 D-Bus 接口。您可以添加、删除或更新防火墙规则,而无需重新启动防火墙守护程序或服务。firewall-cmd 充当 nftables 的前端。在 CentOS 8 中,nftables 取代 iptables 成为默认的 Linux 网络数据包过滤框架。本页介绍如何为您的 CentOS 8 设置防火墙,并借助防火墙-cmd管理工具进行管理。
教程详细信息 | |
---|---|
难度等级 | 中间的 |
Root 权限 | 是的 |
要求 | Linux 终端 |
类别 | 防火墙 |
操作系统兼容性 | Alma • Amazon Linux • Fedora • RHEL • Rocky • Stream |
预计阅读时间 | 7 分钟 |
FirewallD的基本概念
Firewalld 简化了网络流量管理的概念。当谈到 CentOS 8 上的 Firewalld 时,您有以下两个主要想法。
1. 区域
Firewalld 区域只是一组预定义的规则。您可以通过运行以下 ls 命令查看所有区域:
$ ls -l /usr/lib/firewalld/zones/
使用cat 命令查看 drop zone:
$ cat /usr/lib/firewalld/zones/public.xml
了解预定义区域
- block – 拒绝所有传入网络连接。仅允许从系统内部发起的网络连接。
- dmz – 经典的非军事区 (DMZ) 区域,对您的 LAN 提供有限的访问并且只允许选定的传入端口。
- drop – 丢弃所有传入网络连接,仅允许传出网络连接。
- 外部– 适用于路由器类型的连接。您还需要 LAN 和 WAN 接口才能使伪装 (NAT) 正常工作。
- 家庭– 适用于局域网内您信任的其他计算机的家用计算机(如笔记本电脑和台式机)。仅允许选定的 TCP/IP 端口。
- 内部– 当您主要信任 LAN 上的其他服务器或计算机时,可在内部网络上使用。
- 公共– 您不信任网络上的任何其他计算机和服务器。您只允许所需的端口和服务。对于云服务器或您所在地托管的服务器,请始终使用公共区域。
- 受信任– 接受所有网络连接。我不建议将此区域用于专用服务器或连接到 WAN 的虚拟机。
- 工作– 适用于您信任的同事和其他服务器的工作场所。
运行以下命令查看 CentOS 8 上的所有区域:
$ firewall-cmd --get-zones
如何找出你的默认区域
可以将网络接口和源分配给区域。这些区域之一设置为默认区域。要获取默认区域,请运行:
$ firewall-cmd --get-default-zone
要查看网络接口名称,请运行ip 命令或 nmcli 命令:
当将新的接口连接(例如 eth0 或 ens3)添加到 NetworkManager 时,它们将附加到默认区域。通过运行以下命令进行验证:
$ ip link show
$ nmcli device status
$ firewall-cmd --get-active-zones
2. 服务
服务不过是本地端口、协议、源端口、目标和防火墙辅助模块的列表。以下是一些示例:
- 端口 – 443 或 25 或 110
- 服务 – SSH、HTTP
- 协议 — ICMP
如何查看与公共区域相关的防火墙规则或服务
运行:
$ sudo firewall-cmd --list-all
或
$ sudo firewall-cmd --list-all --zone=public
上述命令表明我的默认区域是公共的,并且我允许在 CentOS 8/RHEL 8 上传入 SSH 连接(端口 22)、dhcpv6-client 和 cockpit 服务端口。默认情况下,所有其他流量都被丢弃。如果我在 CentOS 8 上配置 Apache 或 Nginx,则需要使用防火墙命令打开端口 80/443。假设您不想要 cockpit 或 dhcpv6-client 等不必要的服务,您可以通过修改规则来删除它们。例如,删除服务 dhcpv6-client 和 cockpit:
$ sudo firewall-cmd --remove-service=cockpit --permanent
$ sudo firewall-cmd --remove-service=dhcpv6-client --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-services
如何查看当前区域允许哪些服务
$ sudo firewall-cmd --list-services
或者
或者使用bash for 循环如下:
$ sudo firewall-cmd --list-services --zone=public
$ sudo firewall-cmd --list-services --zone=home
## or just use 'sudo firewall-cmd --list-all-zones' ## for z in $(firewall-cmd --get-zones) do echo "Services allowed in $z zone: $(sudo firewall-cmd --list-services --zone=$z)" done
如何在 CentOS 8 上启动、停止、重启 Firewalld 服务
现在您已经了解了防火墙区域、服务以及如何查看默认值。现在是时候在 CentOS 8 Linux 机器上激活和配置我们的防火墙了。
启动并启用firewalld
$ sudo systemctl start firewalld
$ sudo systemctl enable firewalld
停止并禁用firewalld
$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld
检查防火墙状态
$ sudo firewall-cmd --state
当更改规则时重新加载防火墙配置的命令
$ sudo firewall-cmd --reload
获取firewalld服务的状态
$ sudo systemctl status firewalld
了解运行时和永久防火墙规则集
运行时的防火墙配置更改是临时的。当您重新启动 CetnOS 8 服务器时,这些更改将消失。例如,以下内容将暂时为 Nginx/Apache Web 服务器打开 TCP 端口 80/443 (https):
当您重新启动 Linux 机器或重新启动防火墙服务本身时,上述规则不会保留。
$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=https
如何将规则添加到永久集并重新加载firewalld
让我们永久添加规则(HTTPS / 443 和 HTTP / 80)并重新加载firewalld:
验证它:
$ sudo firewall-cmd --zone=public --add-service=http --permanent
$ sudo firewall-cmd --zone=public --add-service=https --permanent
$ sudo firewall-cmd --reload
$ sudo firewall-cmd --list-services
$ sudo firewall-cmd --list-services --permanent
Firewalld 运行时与永久规则集示例
如何查找防火墙支持的服务列表
您的系统上的语法如下:
$ sudo firewall-cmd --get-services
$ sudo firewall-cmd --get-services | grep mysql
$ ls -l /usr/lib/firewalld/services/
$ cat /usr/lib/firewalld/services/ssh.xml
Firewalld 获取可在规则集中添加或删除的服务列表
Firewalld 规则集示例
让我们看一下针对您的默认区域的一些常见防火墙示例。
如何向您的区域添加服务
添加dns服务(TCP/UDP端口53):
$ sudo firewall-cmd --zone=public --add-service=dns --permanent
如何从区域移除(删除)服务
删除vnc服务器服务(TCP端口范围5900-5903):
$ sudo firewall-cmd --zone=public --remove-service=vnc-server --permanent
如何允许/打开 TCP/UDP 端口/协议
打开 TCP 端口 #9009:
$ sudo firewall-cmd --zone=public --add-port=9009/tcp --permanent
要查看添加的端口,请运行:
$ sudo firewall-cmd --zone=internal --list-ports
如何拒绝/阻止 TCP/UDP 端口/协议
打开 TCP 端口#23,输入:
$ sudo firewall-cmd --zone=public --remove-port=23/tcp --permanent
如何编写端口转发firewalld规则
在同一服务器上将 TCP 端口 443 转发到 8080:
要删除上述端口转发,请运行
打开伪装如果您需要将流量(端口 443)转发到托管在 192.168.2.42 端口 443 上的 lxd 服务器/容器:
要删除上述伪装规则,请运行:
像往常一样使用以下命令列出规则:
$ sudo firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080 --permanent
$ sudo firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=8080
$ sudo firewall-cmd --zone=public --add-masquerade
$ sudo firewall-cmd --zone=public --add-forward-port=port=443:proto=tcp:toport=443:toaddr=192.168.2.42 --permanent
$ sudo firewall-cmd --zone=public --remove-masquerade
$ firewall-cmd --zone=public --remove-forward-port=port=443:proto=tcp:toport=443:toaddr=192.168.2.42 --permanent
$ firewall-cmd --zone=public --list-all --permanent
丰富规则示例
假设您只想允许从 10.8.0.8 IP 地址访问 SSH 端口 22,请运行:
$ sudo firewall-cmd --permanent --zone=public --add-rich-rule 'rule family="ipv4" source address="10.8.0.8" port port=22 protocol=tcp accept'
要验证新规则,请运行:
$ sudo firewall-cmd --list-rich-rules --permanent
在下面的示例中,允许 192.168.1.0/24 sub/net 访问 tcp 端口 11211:
sudo firewall-cmd --permanent --zone=public --add-rich-rule=' rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="11211" accept'
再次验证:
$ sudo firewall-cmd --list-rich-rules --permanent
示例输出:
rule family="ipv4" source address="10.8.0.8" port port="22" protocol="tcp" accept rule family="ipv4" source address="192.168.1.0/24" port port="11211" protocol="tcp" accept
您可以按如下方式删除丰富的规则:
$ sudo firewall-cmd --remove-rich-rule 'rule family="ipv4" source address="10.8.0.8" port port=22 protocol=tcp accept' --permanent
$ sudo firewall-cmd --remove-rich-rule 'rule family="ipv4" source address="192.168.1.0/24" port port="11211" protocol="tcp" accept' --permanent
结论
您学习了firewalld的基本概念和CentOS 8服务器的一些常见示例。有关更多信息,请参阅此处的官方firewalld文档或使用man命令/info命令阅读手册页或传递--help选项,如下所示:
$ man firewalld
$ man firewall-cmd
$ man firewall-cmd --help
- RHEL 8 防火墙
- CentOS 8 防火墙
- OpenSUSE 15.5 防火墙D
- 启用 FirewallD 日志记录拒绝的数据包