7

如何在 CentOS 8 上使用 FirewallD 设置防火墙?-51CTO.COM

 2 years ago
source link: https://os.51cto.com/article/707726.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

d25af6e86de46cf7d674352c1bfdb15639fe1c.jpg

我是一个 CentOS Enterprise Linux 8 系统管理员。如何在 CentOS8 上使用 FirwallD 设置防火墙?

一个 Linux 防火墙可用于保护您的工作站或服务器免受不需要的流量干扰。您可以设置规则来阻止或允许流量通过。CentOS 8 带有一个动态的、可定制的基于主机的防火墙和一个 D-Bus 接口。您可以添加、删除或更新防火墙的规则,而无需重新启动防火墙守护程序或服务。​​firewall-cmd​​ 充当着 ​​nftables​​ 的前端。在 CentOS 8 中,​​nftables​​ 取代了 ​​iptables​​ 作为默认的 Linux 网络包过滤框架。本页展示了如何为您的 CentOS 8 设置防火墙,和如何在 ​​firewall-cmd​​ 工具的帮助下进行管理。

FirewallD 的基本概念

​firewalld​​ 简化了网络流量管理的概念。当谈到 CentOS 8 上的 ​​firewalld​​ 时,我们有以下两个主要的概念。

Firewalld 区域(Zone)只不过是预定义的规则集。您可以通过运行以下 ls 命令查看所有区域:

$ ls -l /usr/lib/firewalld/zones/

使用 ​​cat​​ 命令查看 ​​public​​ 区域:

$ cat /usr/lib/firewalld/zones/public.xml

e21bd4388d5a190804699569dfd8dff92e20f4.png

了解预定义区域

  • block:所有传入的网络连接都被拒绝。只可以从系统内部发起网络连接。
  • dmz:经典的非军事区 (DMZ) 区域,提供对 LAN 的有限访问,并且只允许指定的传入端口。
  • drop:丢弃所有传入的网络连接,只允许传出的网络连接。
  • external:对于路由器类型的连接很有用。您还需要 LAN 和 WAN 接口才能使伪装 NAT 正常工作。
  • home:适用于您信任其他计算机的 LAN 中的家用计算机,例如笔记本电脑和台式机。仅允许指定的 TCP/IP 端口。
  • internal:用于内部网络,当您非常信任 LAN 上的其他服务器或计算机时适用。
  • public:您不信任网络上的任何其他计算机和服务器。您只允许所需的端口和服务。对于托管在您所在地的云服务器或服务器,请始终使用公共区域。
  • trusted:接受所有网络连接。我不建议将此区域用于连接到 WAN 的专用服务器或虚拟机。
  • work:用于您比较信任的同事和其他服务器的工作场所。

运行以下命令以查看 CentOS 8 上的所有区域:

$ firewall-cmd --get-zones

如何找出您的默认区域

可以将网络接口和源分配给区域。这些区域中的一员可被设置为默认区域。以下命令可以让您的默认区域运行:

$ firewall-cmd --get-default-zone

要查看您的网络接口名称,请运行 ​​ip​​ 命令或 ​​nmcli​​ 命令:

$ ip link show
$ nmcli device status

当向 NetworkManager 添加新的接口连接(例如 ​​eth0​​ 或 ​​ens3​​)时,它们将被附加到默认区域。通过运行以下命令进行验证:

$ firewall-cmd --get-active-zones

55daa4492e3a879f336211e7a343f3d3a315d6.png

服务不过是本地端口、协议、源端口、目标端口和防火墙帮助模块的列表。举些例子:

  • 端口:443、25 或 110
  • 服务:SSH、HTTP
  • 协议:ICMP

如何查看与公共(public)区域相关的防火墙规则或服务

$ sudo firewall-cmd --list-all

$ sudo firewall-cmd --list-all --zone=public

49dc08116c90c16d90d170acf58c38ada8728f.png

上面的命令表明我的默认区域是 ​​public​​,并且我允许传入 SSH 连接(端口 22)、​​dhcpv6-client​​ 和 CentOS 8/RHEL 8 上的 ​​cockpit​​ 服务端口。所有其他流量默认被丢弃。如果我在 CentOS 8 上配置 Apache 或 Nginx,则我需要使用 ​​firewall-cmd​​ 打开 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

59019d876a6906cdff9794170260494c91f4c5.png

如何查看当前区域允许的服务

$ sudo firewall-cmd --list-services

$ sudo firewall-cmd --list-services --zone=public
$ sudo firewall-cmd --list-services --zone=home

或使用 ​​bash​​ 的 ​​for​​ 循环,如下所示:

## 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

651e37134aed736952a560fcb7cbe977656b7c.png

如何在 CentOS 8 上启动、停止、重启 firewalld 服务

到目前为止,您已经了解了 ​​firewalld​​ 区域、服务以及如何查看默认值。是时候在 CentOS 8 Linux 机器上激活和配置我们的防火墙了。

启动并启用 ​​firewalld​

$ sudo systemctl start firewalld
$ sudo systemctl enable firewalld

停止并禁用 ​​firewalld​

$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld

检查 ​​firewalld​​ 状态

$ sudo firewall-cmd --state

更改规则时重新加载 ​​firewalld​​ 配置的命令

$ sudo firewall-cmd --reload

获取 ​​firewalld​​ 服务的状态

$ sudo systemctl status firewalld

0835f734202c8658147608a768062ba00fc9cf.png

了解运行时和永久性防火墙规则集

运行时更改 ​​firewalld​​ 的配置是临时的。当您重新启动 CetnOS 8 服务器时,这些配置就消失了。例如,以下命令将临时为 Nginx/Apache Web 服务器打开 80/443(https)TCP 端口  :

$ sudo firewall-cmd --zone=public --add-service=http
$ sudo firewall-cmd --zone=public --add-service=https

当您重新启动 Linux 机器或重新启动防火墙服务本身时,上述规则不会保留。

如何将规则添加到永久的规则集中,并重新加载 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

56d12b6823e6e6dbef93910187302fb64c0538.png

Firewalld 的运行时与永久性规则集示例

如何查找 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

b1530ba1380acc760883872a2e7ba1a669ca8a.png

用 firewalld 获取可从规则集中添加或删除的服务列表

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 规则

在同一台服务器上将 443 TCP 端口转发到 8080:

$ 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

如果您需要将流量(端口 443)转发到托管在 192.168.2.42 的 lxd 服务器/容器的 443 端口,请开启伪装

$ 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

Rich 规则示例

假设您只想允许从 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 子网访问 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

您可以按照如下所示删除 rich 规则:

$ 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 服务器的一些常见示例。有关更多信息,请参阅的官方(https://firewalld.org/documentation/)​​firewalld​​ 文档。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK