广告位
使用FirewallD在CentOS 7上管理防火墙
作者: 分类:Linux浏览(1,685)2019-11-8

是动态管理的防火墙,它支持基于RHEL 7的服务器上可用的IPv4和IPv6防火墙规则以及防火墙区域。它是iptables内核netfilter代码的直接替代品,并且可以使用。

本文将简要介绍使用firewall-cmd命令在 7上管理防火墙。

检查FirewallD是否正在运行

第一步是检查FirewallD是否已安装并正在运行。这可以通过systemd运行以下命令来完成:

$ systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2016-03-10 15:07:00 UTC; 1min 30s ago
   ...

或者,您可以使用以下firewall-cmd工具进行检查:

$ firewall-cmd --state
running

管理区域

FirewallD使用zones区域定义连接所用信任级别的概念进行操作。您可以将不同的网络接口划分为不同的区域,以便对每个接口应用特定的防火墙规则,也可以对所有接口使用一个区域。

开箱即用,所有操作都在默认public区域上完成,但是也可以应用其他几个预先配置的区域。

列出所有可用区域

您可能需要获取所有可用区域的列表,其中有些是开箱即用的。再次,这是可以做到用firewall-cmd

$ firewall-cmd --get-zones
block dmz drop external home internal public trusted work

检查默认区域

您可以使用来发现当前配置的默认区域firewall-cmd

$ firewall-cmd --get-default-zone
public

如果您希望更改默认区域(例如home),可以通过运行以下命令来完成:

$ firewall-cmd --set-default-zone=home
success

此信息将反映在主配置文件中/etc/firewalld/firewalld.conf。但是,建议您不要手动修改此文件,而应使用firewall-cmd

检查当前分配的区域

您可以通过运行以下命令获取分配了接口的区域的列表:

$ firewall-cmd --get-active-zones
public
  interfaces: eth0

您还可以eth0通过运行以下命令检查单个接口的区域(在这种情况下):

$  firewall-cmd --get-zone-of-interface=eth0
public

创建区域

如果默认的预配置区域无法完全满足您的需求,那么zone1再次创建新区域()的最简单方法是firewall-cmd

$ firewall-cmd --permanent --new-zone=zone1
success

创建后,您需要重新加载:

$ firewall-cmd --reload
success

将区域应用于接口

为了将网络接口永久分配给一个区域,您可以使用firewall-cmd记住--permanent保留该标记以保留更改的方法。如果使用NetworkManager,则还应确保使用nmcli来设置连接区域。

$ firewall-cmd --permanent --zone=internal --change-interface=eth1`
success

获取区域的永久配置

为了检查区域的永久配置(public在这种情况下),包括分配的接口,允许的服务,端口设置等,请运行:

$ firewall-cmd --permanent --zone=public --list-all
public (default)
  interfaces:
  sources:
  services: dhcpv6-client ssh
  ports:
  masquerade: no
  forward-ports:
  icmp-blocks:
  rich rules:

管理服务

一旦分配并配置了所需的区域,就可以开始向区域添加服务。服务描述了可为区域访问的协议和端口。

列出现有服务

在firewalld中预先配置了许多常用服务。这些可以列出:

$ firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns freeipa-ldap freeipa-ldaps freeipa-replication ftp high-availability http https imaps ipp ipp-client ipsec iscsi-target kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind rsyncd samba samba-client smtp ssh telnet tftp tftp-client transmission-client vdsm vnc-server wbem-https

您还可以获取为默认区域启用的服务的列表:

$ firewall-cmd --list-services
dhcpv6-client ssh

将服务添加到区域

您可以public使用以下--add-service标志永久为区域()启用给定服务:

$ firewall-cmd --permanent --zone=public --add-service=http
success

然后重新加载当前的防火墙会话:

$ firewall-cmd --reload
success

然后,验证是否已添加:

$ firewall-cmd --zone=public --list-services
dhcpv6-client http ssh

从区域中删除服务

您可以public使用以下--remove-service标志永久删除区域()的给定服务:

$ firewall-cmd --permanent --zone=public --remove-service=http
success

然后重新加载当前的防火墙会话:

$ firewall-cmd --reload
success

然后,验证是否已添加:

$ firewall-cmd --zone=public --list-services
dhcpv6-client ssh

从区域添加/删除多个服务

您可以添加或删除多个服务(例如,httphttps从区按一次一个一次通过在大括号包裹所需的服务名称(),或全部{}):

$ firewall-cmd --permanent --zone=public --add-service=
success

$ firewall-cmd --permanent --zone=public --list-services
dhcpv6-client http https ssh

创建新服务

有时您可能需要添加新的自定义服务-例如,如果您更改了SSH守护程序的端口。服务是使用简单的XML文件定义的,默认文件位于/usr/lib/firewalld/services

$  tree /usr/lib/firewalld/services
/usr/lib/firewalld/services
├── amanda-client.xml
├── bacula-client.xml
├── bacula.xml
├── dhcpv6-client.xml
├── dhcpv6.xml
├── dhcp.xml
├── dns.xml
├── freeipa-ldaps.xml
├── freeipa-ldap.xml
├── freeipa-replication.xml
├── ftp.xml
├── high-availability.xml
├── https.xml
├── http.xml
...

创建新服务的最简单方法是复制这些现有服务文件之一并进行修改。定制服务应位于中/etc/firewalld/services。例如,要自定义SSH服务:

$ cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/ssh-custom.xml

此复制文件的内容应类似于:

$ cat /etc/firewalld/services/ssh-custom.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="22"/>
</service>

为了更改端口,您应该更改服务的简称和端口。您也可以根据需要更改描述,但这只是用户界面或其他应用程序可以使用的额外元数据。在此示例中,我将端口更改为1234:

$ nano /etc/firewalld/services/ssh-custom.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>SSH-Custom</short>
  <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description>
  <port protocol="tcp" port="1234"/>
</service>

保存后,您将需要重新加载防火墙,然后可以将规则应用于您的区域:

$ firewall-cmd --reload
success

$ firewall-cmd --permanent --zone=public --add-service=ssh-custom
success

港口管理

除了使用服务外,您还可以按协议手动允许端口。要允许7777public区域的TCP端口:

$ firewall-cmd --permanent --zone=public --add-port=7777/tcp
success

您还可以添加端口范围:

$ firewall-cmd --permanent --zone=public --add-port=7000-8000/tcp
success

要删除(并因此拒绝)7777public区域的TCP端口:

$ firewall-cmd --permanent --zone=public --remove-port=7777/tcp
success

public重新加载当前防火墙会话后,您还可以列出给定区域()当前允许的端口:

$ firewall-cmd --zone=public --list-ports
7000-8000/tcp

启用防火墙D

一旦按照自己的喜好配置了防火墙,就应该确保通过systemd启用它,以确保它在启动时启动:

$ systemctl enable firewalld

结论

FirewallD中还有许多其他设置和选项,例如端口转发,伪装和通过D-Bus与防火墙通信。希望本指南可以帮助您掌握基础知识,并为您提供了开始对服务器进行防火墙保护的工具。下面的其他一些阅读材料将帮助您充分利用防火墙。

图片压缩在线工具 tools online