在CentOS/RHEL 8上如何设置防火墙

时间:2019-11-20 08:52:51  来源:igfitidea点击:

在CentOS/RHEL 8上如何使用FirewallD设置防火墙?

在RHEL 8中,nftables将iptables替换为默认的Linux网络数据包过滤框架。
RHEL 8带有带有D-Bus接口的动态,可自定义的基于主机的防火墙。您可以添加或删除或更新防火墙规则,而无需重启防火墙守护程序或服务。 firewall-cmd充当nftable的前端。

FirewallD的基本概念

Firewalld简化了网络流量管理的概念。
在CentOS/RHEL 8上进行防火墙保护时,有两个术语

1.区域zone

防火墙zone是预定义的规则集。

您可以使用ls命令来查看所有区域:

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

使用cat命令查看drop zone(定义丢弃数据包规则):

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

了解预定义的zone

  • 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

如何查看默认区域

查看默认zone,请运行:

$ firewall-cmd --get-default-zone

查看活动的zone

$ firewall-cmd --get-active-zones

2.服务

服务是本地端口,协议,源端口,目标和防火墙帮助程序模块的列表。

比如

  • 端口80 (提供web服务)
  • 服务SSH
  • 协议ICMP

如何查看与public zone相关联的防火墙规则或者服务

运行:

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

在防火墙中,如何从默认zone删除服务?

删除服务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

在CentOS/RHEL 8上如何启动,停止,重启Firewalld服务

现在激活和配置防火墙了。

在CentOS/RHEL 8上启动防火墙并设置开机自启动

$ sudo systemctl start firewalld
$ sudo systemctl enable firewalld

在CentOS/RHEL 8上禁用防火墙firewalld

$ sudo systemctl stop firewalld
$ sudo systemctl disable firewalld

在CentOS/RHEL 8上检查防火墙状态

$ sudo firewall-cmd --state

CentOS/RHEL 8在更改防火墙规则时重新加载配置

$ sudo firewall-cmd --reload

CentOS/RHEL 8获取防火墙服务的状态

$ sudo systemctl status firewalld

使防火墙规则永久生效

下面更改防火墙规则的命令是临时的,在重启Linux框或重启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

如何查看防火墙支持的服务

语法是

$ 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

防火墙规则集示例

如何向防火墙区域中添加服务

在防火墙中允许dns服务通过(TCP/UDP端口53):

sudo firewall-cmd --zone=public --add-service=dns --permanent

如何在防火墙zone中删除服务

删除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

查看zone开放的端口

$ sudo firewall-cmd --zone=internal --list-ports

防火墙如何拒绝/阻止某个端口

拒绝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

$ 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

富规则示例

在防火墙中设置,只允许从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'