如何在RHEL 8上使用FirewallD设置防火墙
如何在RHEL 8上使用FirwallD设置防火墙?
说明:
Linux防火墙,用于保护您的工作站或服务器免受不必要的流量。
您可以设置规则以阻止流量或允许通过。
RHEL 8带有带有D-Bus接口的动态,可自定义的基于主机的防火墙。
您可以添加或删除或更新防火墙规则,而无需重新启动防火墙守护程序或服务。
firewall-cmd充当nftable的前端。
在RHEL 8中,nftables将iptables替换为默认的Linux网络数据包过滤框架。
本教程将学习"如何为RHEL 8设置防火墙以及如何通过firewall-cmd管理工具进行管理"。
FirewallD的基本概念
Firewalld简化了网络流量管理的概念。
在RHEL 8上进行防火墙保护时,您有两个主要想法。
1.区域(zone)
防火墙区域仅是预定义的规则集。
您可以通过运行以下ls命令来查看所有区域:
$ ls -l /usr/lib/firewalld/zones/
使用cat命令查看放置区域:
$ cat /usr/lib/firewalld/zones/drop.xml
列出RHEL 8上的所有防火墙区域
了解预定义区域
block
所有传入的网络连接被拒绝。仅可从系统内部启动的网络连接。dmz
经典非军事区(DMZ)区域,对您的LAN的访问受到限制,并且仅允许选定的传入端口。drop
丢弃所有传入的网络连接,仅允许传出的网络连接。external
对于路由器的连接类型很有用。您还需要LAN和WAN接口,以使伪装(NAT)正常工作。- `home'对您信任其他计算机的局域网内的家用计算机(例如笔记本电脑和台式机)有用。仅允许选择的TCP/IP端口。
internal
,当您主要信任LAN上的其他服务器或计算机时,用于内部网络。public
您不信任网络上的任何其他计算机和服务器。您仅允许所需的端口和服务。对于云服务器或您所托管的服务器,请始终使用公共区域。trusted
"可信任的"接受所有网络连接。我不建议将该区域用于连接到WAN的专用服务器或VM。work
用于您信任同事和其他服务器的工作场所。
只需运行以下命令即可查看所有区域:
$ firewall-cmd --get-zones
输出示例:
block dmz drop external home internal public trusted work
如何找出您的默认区域
可以将网络接口和源分配给一个区域。
这些区域之一被设置为默认区域。
要获取默认区域,请运行:
$ firewall-cmd --get-default-zone
要查看网络接口名称,请运行ip命令或nmcli命令:
$ ip link show $ nmcli device status
将新的接口连接(例如eth0或ens3)添加到NetworkManager后,它们将追加到默认区域。
通过运行以下命令进行验证:
$ firewall-cmd --get-active-zones
2.服务
服务不过是本地端口,协议,源端口,目标和防火墙帮助程序模块的列表。
一些例子:
- 端口80
- 服务SSH
- 协议ICMP
如何查看与公共区域关联的防火墙规则或服务
跑:
$ sudo firewall-cmd --list-all
或者
$ sudo firewall-cmd --list-all --zone=public
上面的命令表明我的默认区域是public,并且我允许RHEL 8上的传入SSH连接(端口22),dhcpv6-client和cockpit服务端口。
如果在RHEL 8上配置Apache或Nginx,则需要使用firewall-cmd打开端口80/443。
假设您不想要不必要的服务,例如座舱或dhcpv6-client,则可以通过修改规则来删除它们。
例如,删除服务dhcpv6-client和cockpit
$ sudo firewall-cmd --remove-service=cockpit --permanent $ sudo firewall-cmd --remove-service=dhcpv6-client --permanent $ sudo firewall-cmd --reload $ firewall-cmd --list-services
如何查看当前区域中允许哪些服务
$ sudo firewall-cmd --list-services
或者
$ sudo firewall-cmd --list-services --zone=public $ sudo firewall-cmd --list-services --zone=home
或使用bash进行循环,如下所示:
## 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
如何在RHEL 8上启动,停止,重新启动Firewalld服务
到目前为止,您已经了解了防火墙区域,服务以及如何查看默认值。
现在是时候激活和配置防火墙了。
启动并启用防火墙
$ sudo systemctl start firewalld $ sudo systemctl enable firewalld
停止并禁用firewalld
$ sudo systemctl stop firewalld $ sudo systemctl disable firewalld
检查防火墙状态
$ sudo firewall-cmd --state
更改规则时重新加载firewalld配置的命令
$ sudo firewall-cmd --reload
获取防火墙服务的状态
$ sudo systemctl status firewalld
了解运行时和永久防火墙规则集
运行时防火墙配置更改是临时的。
重新启动RHEL 8框后,它们消失了。
例如,以下内容将为Nginx Web服务器临时打开端口80/https:
$ sudo firewall-cmd --zone=public --add-service=http
重新启动Linux框或重新启动Firewalld服务本身时,不会保留上述规则。
如何将规则添加到永久集中并重新加载防火墙
让我们永久添加规则(HTTPS/443)并重新加载防火墙:
$ sudo firewall-cmd --zone=public --add-service=https --permanent $ sudo firewall-cmd --reload
验证一下:
$ sudo firewall-cmd --list-services $ sudo firewall-cmd --list-services --permanent
防火墙运行时与永久规则集示例
如何找到防火墙支持的服务列表
语法是
$ sudo firewall-cmd --get-services $ sudo firewall-cmd --get-services | grep mysql $ ls -l /usr/lib/firewalld/services/ $ cat /usr/lib/firewalld/services/dns.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
如何编写端口转发防火墙规则
将TCP端口443转发到同一服务器上的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端口443托管的lxd服务器/容器,请打开伪装:
$ 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子网/网络访问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