Introdução

O firewalld é um software de gerenciamento de firewall disponível para muitas distribuições do Linux. Ele atua como um front-end para os sistemas de filtragem de pacotes dentro do kernel do Linux nftables ou iptables.

Neste guia, mostraremos a você como configurar um firewall do firewalld para seu servidor CentOS 8 e abordaremos as noções básicas sobre o gerenciamento de firewall com a ferramenta administrativa firewall-cmd.

Pré-requisitos

firewall illustration for: Pré-requisitos

Para completar este tutorial, você precisará de um servidor executando em CentOS 8. Presumiremos que você está conectado a esse servidor como um non-root user com privilégios sudo habilitado. Para configurar isso, consulte nosso Guia de configuração inicial de servidor para o CentOS 8.

Conceitos básicos no firewalld

Antes de começarmos a falar sobre como de fato usar o utilitário firewall-cmd para gerenciar sua configuração de firewall, precisamos nos familiarizar com alguns conceitos que a ferramenta introduz.

Zonas

O daemon do firewalld gerencia grupos de regras usando entidades chamadas de _zonas_. As zonas são conjuntos de regras que ditam qual tráfego deve ser permitido, dependendo do nível de confiança que você tem na rede. As interfaces de rede são atribuídas a uma zona para ditar o comportamento que o firewall deve permitir.

Para computadores que possam se mover frequentemente entre redes (como notebooks), esse tipo de flexibilidade fornece um bom método para alterar suas regras, a depender do seu ambiente. Pode ser que você tenha regras rigorosas em funcionamento, proibindo a maioria do tráfego ao operar em uma rede Wi-Fi pública, ao mesmo tempo que permite restrições mais brandas ao se conectar à sua rede local. Para um servidor, essas zonas geralmente não são tão importantes, pois o ambiente de rede raramente muda – se é que muda em algum momento.

Independentemente do quão dinâmico possa ser seu ambiente de rede, ainda é útil se familiarizar com a ideia geral por trás de cada uma das zonas pré-definidas para o firewalld. As zonas pré-definidas dentro do firewalld são ordenadas das menos confiáveis para as mais confiáveis:

  • drop: o nível de confiança mais baixo. Todas as conexões de entrada são interrompidas sem resposta e apenas são possíveis conexões de saída.
  • block: parecido com a anterior, mas, em vez de simplesmente interromper as conexões, as solicitações de entrada são rejeitadas com uma mensagem de icmp-host-prohibited ou icmp6-adm-prohibited.
  • public: representa redes públicas e não confiáveis. Você não confia em outros computadores, mas pode permitir conexões de entrada, selecionadas caso de caso.
  • external: redes externas, no caso de você estar usando o firewall como seu gateway. Ela está configurada para o mascaramento de NAT, para que sua rede interna permaneça privada, mas acessível.
  • internal: o outro lado da zona externa, usada para a porção interna de um gateway. Os computadores são relativamente confiáveis e alguns serviços adicionais estão disponíveis.
  • dmz: usada para computadores localizados em uma DMZ (computadores isolados que não terão acesso ao resto de sua rede). Só são permitidas certas conexões de entrada.
  • work: usada para máquinas de trabalho. Confia na maioria dos computadores na rede. Podem ser permitidos alguns serviços adicionais.
  • home: um ambiente local. Geralmente, isso significa que você confia na maioria dos outros computadores e que alguns outros serviços serão aceitos.
  • trusted: confia em todas as máquinas na rede. A mais aberta das opções disponíveis e deve ser usada com moderação.

Para usar o firewall, podemos criar regras e alterar as propriedades de nossas zonas. Em seguida, atribuímos nossas interfaces de rede às zonas que sejam mais apropriadas.

Permanência de regras

No firewalld, as regras podem ser aplicadas ao conjunto de regras _tempo de execução_ atual, ou definidas como _permanentes_. Quando uma regra é adicionada ou modificada, por padrão, apenas o firewall atualmente em execução é modificado. Após a próxima reinicialização – ou quando o serviço do firewalld é recarregado – apenas as regras permanentes permanecerão.

A maioria das operações do firewall-cmd pode usar um sinalizador --permanent para indicar que as alterações devem ser aplicadas na configuração permanente. Além disso, o firewall atualmente em execução pode ser salvo na configuração permanente com o comando firewall-cmd --runtime-to-permanent.

Essa separação das configurações do tempo de execução vs permanentes significa que você pode testar as regras com segurança em seu firewall ativo e, em seguida, recarregar para começar novamente, caso haja problemas.

Instalando e habilitando o firewalld

O firewalld vem instalado por padrão em algumas distribuições do Linux, incluindo muitas imagens do CentOS 8. No entanto, pode ser que precise instalar o firewalld por conta própria:

				
					
sudo dnf install firewalld

				
			

Após instalar o firewalld, você pode habilitar o serviço e reinicializar o seu servidor. Lembre-se de que, habilitar o firewalld fará com que o serviço seja iniciado durante a inicialização. É uma prática recomendada criar suas regras de firewall e aproveitar a oportunidade para testá-las antes de configurar esse comportamento, para evitar possíveis problemas.

				
					
sudo systemctl enable firewalld

sudo systemctl start firewalld

				
			

Quando o servidor for reinicializado, seu firewall deve ser iniciado, suas interfaces de rede devem ser colocadas nas zonas que você configurou (ou retornarem para a zona padrão configurada) e as regras associadas à(s) zona(s) será(ão) aplicada(s) à(s) interface(s) associada(s).

Podemos verificar se o serviço está em execução e acessível, digitando:

				
					
sudo firewall-cmd --state

				
			
				
					
[secondary_label Output]

running

				
			

Isso indica que nosso firewall está em funcionamento com a configuração padrão.

Familiarizando-se com as regras do firewall em vigor

Antes de começar a fazer alterações, precisamos nos familiarizar com o ambiente e as regras padrão fornecidos pelo firewalld.

Explorando os padrões

Podemos ver qual zona está atualmente selecionada como padrão, digitando:

				
					
firewall-cmd --get-default-zone

				
			
				
					
[secondary_label Output]

public

				
			

Uma vez que não demos ao firewalld nenhum comando para se desviar da zona padrão e nenhuma das nossas interfaces foi configurada para se vincular a outra zona, tal zona também será a única zona ativa (ou seja, a zona que está controlando o tráfego para nossas interfaces). Podemos verificar isso, digitando:

				
					
firewall-cmd --get-active-zones

				
			
				
					
[secondary_label Output]

public

 interfaces: eth0 eth1

				
			

Aqui, podemos ver que nosso servidor de exemplo tem duas interfaces de rede sendo controladas pelo firewall (eth0 eth1). Ambas estão sendo gerenciadas de acordo com as regras definidas para a zona pública.

No entanto, como fazemos para saber quais regras estão associadas à zona pública? Podemos imprimir a configuração da zona padrão, digitando:

				
					
sudo firewall-cmd --list-all

				
			
				
					
[secondary_label Output]

public (active)

 target: default

 icmp-block-inversion: no

 interfaces: eth0 eth1

 sources:

 services: <^>cockpit<^> <^>dhcpv6-client<^> <^>ssh<^>

 ports:

 protocols:

 masquerade: no

 forward-ports:

 source-ports:

 icmp-blocks:

 rich rules:

				
			

Vendo o resultado, podemos dizer que essa zona é a padrão e que está ativa, bem como que as interfaces eth0 e eth1 estão associadas a essa zona (já sabíamos tudo isso pelas nossas consultas anteriores). No entanto, podemos ver também que essa zona permite o tráfego para um cliente DHCP (para atribuição de endereço IP), SSH (para administração remota) e Cockpit (um console baseado em Web).

Explorando zonas alternativas

Agora, temos uma boa noção sobre a configuração da zona padrão e da zona ativa. Também somos capazes de encontrar informações sobre outras zonas.

Para obter uma lista das zonas disponíveis, digite:

				
					
firewall-cmd --get-zones

				
			
				
					
[secondary_label Output]

block dmz drop external home internal public trusted work

				
			

Podemos ver a configuração específica associada a uma zona, incluindo o parâmetro --zone= em nosso comando --list-all:

				
					
sudo firewall-cmd --zone=<^>home<^> --list-all

				
			
				
					
[secondary_label Output]

home

 target: default

 icmp-block-inversion: no

 interfaces:

 sources:

 services: cockpit dhcpv6-client mdns samba-client ssh

 ports:

 protocols:

 masquerade: no

 forward-ports:

 source-ports:

 icmp-blocks:

 rich rules:

				
			

Você pode gerar como resultado todas as definições de zona, usando a opção --list-all-zones. Provavelmente, você irá querer canalizar o resultado para um pager para facilitar a visualização:

				
					
sudo firewall-cmd --list-all-zones | less

				
			

Em seguida, vamos aprender sobre como atribuir zonas às interfaces de rede.

Selecionando zonas para suas interfaces

A menos que tenha configurado suas interfaces de rede de outra forma, cada interface será colocada na zona padrão quando o firewall for iniciado.

Alterando a zona de uma interface

É possível mover uma interface entre zonas durante uma sessão, usando o parâmetro --zone= em combinação com o parâmetro --change-interface=. Assim como acontece com todos os comandos que modificam o firewall, você precisará usar o sudo.

Por exemplo, podemos mover nossa interface eth0 para a zona local, digitando o seguinte:

				
					
sudo firewall-cmd --zone=home --change-interface=eth0

				
			
				
					
[secondary_label Output]

success

				
			

Nota: sempre que estiver movendo uma interface para uma nova zona, saiba que você provavelmente está modificando os serviços que ficarão operacionais. Por exemplo, aqui estamos movendo a interface para a zona home (inicial), que tem o SSH disponível. Isso significa que nossa conexão não deve ser interrompida. Algumas outras zonas não têm o SSH habilitado por padrão. A mudança para uma dessas zonas pode fazer com que sua conexão seja interrompida, impedindo que você torne a fazer login no seu servidor.

Podemos verificar se isso foi bem-sucedido, pedindo pelas zonas ativas novamente:

				
					
firewall-cmd --get-active-zones

				
			
				
					
[secondary_label Output]

home

 interfaces: eth0

public

 interfaces: eth1

				
			

Ajustando a zona padrão

Se todas as suas interfaces puderem ser bem gerenciadas por uma única zona, provavelmente, o mais fácil seja, simplesmente, designar a melhor zona como sendo a padrão e, em seguida, usá-la para a sua configuração.

Você pode alterar a zona padrão com o parâmetro --set-default-zone=. Isso mudará de imediato qualquer interface que esteja usando a zona padrão:

				
					
sudo firewall-cmd --set-default-zone=<^>home<^>

				
			
				
					
[secondary_label Output]

success

				
			

Definindo regras para seus aplicativos

Vamos examinar a maneira básica de definir exceções de firewall para os serviços que deseja disponibilizar.

Adicionando um serviço às suas zonas

O método mais simples é adicionar os serviços ou portas que você precisa às zonas que está usando. Você pode obter uma lista das definições de serviço disponíveis com a opção --get-services:

				
					
firewall-cmd --get-services

				
			
				
					
[secondary_label Output]

RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

				
			

Nota: você pode obter mais detalhes sobre cada um desses serviços, examinando o arquivo .xml associado dentro do diretório /usr/lib/firewalld/services. Por exemplo, o serviço SSH é definido desta forma:

				
					
[label /usr/lib/firewalld/services/ssh.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>

				
			

Você pode habilitar um serviço para uma zona usando o parâmetro --add-service=. A operação terá como alvo a zona padrão ou a zona que estiver especificada pelo parâmetro --zone=. Por padrão, isso ajustará apenas a sessão atual do firewall. Você pode ajustar a configuração permanente do firewall, incluindo o sinalizador --permanent.

Se estivermos executando um servidor Web que atende o tráfego HTTP convencional, por exemplo, podemos temporariamente permitir esse tráfego para interfaces em nossa zona pública, digitando:

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

				
			

Você pode deixar o sinalizador --zone= de fora caso deseje modificar a zona padrão. Podemos verificar se a operação foi bem-sucedida, usando as operações --list-all ou --list-services:

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

				
			
				
					
[secondary_label Output]

cockpit dhcpv6-client <^>http<^> ssh

				
			

Assim que tiver testado se tudo está funcionando como deveria, você provavelmente vai querer modificar as regras permanentes do firewall, de modo que seu serviço ainda esteja disponível após uma reinicialização. Podemos tornar a nossa mudança anterior permanente, digitando-a novamente e adicionando o sinalizador --permanent:

				
					
sudo firewall-cmd --zone=public --add-service=http <^>--permanent<^>

				
			
				
					
[secondary_label Output]

success

				
			

De maneira alternativa, você poderia usar o sinalizador --runtime-to-permanent para salvar a configuração de firewall atualmente em execução na configuração permanente:

				
					
sudo firewall-cmd --runtime-to-permanent

				
			

Tome cuidado com isso, já que _todas_ as alterações feitas no firewall em execução serão instauradas de maneira permanente.

Independentemente do método que você escolher, você poderá verificar se ele foi bem-sucedido, adicionando o sinalizador --permanent na operação --list-services. Você precisa usar o sudo para toda operação --permanent:

				
					
sudo firewall-cmd --zone=public --list-services <^>--permanent<^>

				
			
				
					
[secondary_label Output]

cockpit dhcpv6-client <^>http<^> ssh

				
			

Sua zona pública agora permitirá o tráfego Web HTTP na porta 80. Caso seu servidor Web estiver configurado para usar SSL/TLS, você também vai querer adicionar o serviço https. Podemos adicionar isso à sessão atual e ao conjunto de regras permanentes, digitando:

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

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

				
			

E se nenhum serviço apropriado estiver disponível?

Os serviços incluídos na instalação do firewalld representam muitos dos aplicativos mais comuns para os quais você pode querer permitir o acesso. No entanto, é provável que haja cenários onde esses serviços não se encaixem em seus requisitos.

Nessa situação, você tem duas opções.

Abrir uma porta para suas zonas

A maneira mais fácil de adicionar suporte para seu aplicativo específico é abrir as portas que ele utiliza na(s) zona(s) apropriada(s). Isto é feito pela especificação da porta ou da faixa de portas, além do protocolo associado (TCP ou UDP) para as portas.

Por exemplo, caso nosso aplicativo seja executado na porta 5000 e utilize TCP, poderíamos adicionar isso temporariamente à zona pública usando o parâmetro --add-port=. Os protocolos podem ser designados como tcp ou udp:

				
					
sudo firewall-cmd --zone=public --add-port=5000/tcp

				
			
				
					
[secondary_label Output]

success

				
			

Podemos verificar se isso foi bem-sucedido usando a operação --list-ports:

				
					
sudo firewall-cmd --zone=public --list-ports

				
			
				
					
[secondary_label Output]

5000/tcp

				
			

Também é possível especificar uma faixa sequencial de portas, separando a porta inicial e final na faixa com um traço. Por exemplo, caso nosso aplicativo utilize as portas UDP de 4990 a 4999, poderíamos abri-las na zona pública, digitando:

				
					
sudo firewall-cmd --zone=public --add-port=4990-4999/udp

				
			

Após os testes, provavelmente vamos querer adicioná-las ao firewall permanente. Use sudo firewall-cmd --runtime-to-permanent para fazer isso, ou execute novamente os comandos com o sinalizador --permanent:

				
					
sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp

sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp

sudo firewall-cmd --zone=public --permanent --list-ports

				
			
				
					
[secondary_label Output]

success

success

5000/tcp 4990-4999/udp

				
			

Definir um serviço

Abrir portas para suas zonas é uma solução simples, mas pode ser difícil monitorar a finalidade de cada uma delas. Caso encerre um serviço em seu servidor, você pode ter dificuldades para lembrar quais das portas que foram abertas ainda são necessárias. Para evitar essa situação, é possível definir um novo serviço.

Os serviços são coleções de portas com um nome e descrição associados. Usar serviços é mais fácil de administrar do que portas, mas exige um pouco de trabalho inicial. A maneira mais fácil de começar é copiar um script existente (encontrado em /usr/lib/firewalld/services) para o diretório /etc/firewalld/services, onde o firewall busca por definições não padrão.

Por exemplo, poderíamos copiar desta forma a definição de serviço SSH para usar para nossa definição de serviço exemplo. O nome do arquivo menos o sufixo .xml determinará o nome do serviço dentro da lista de serviços do firewall:

				
					
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/<^>example<^>.xml

				
			

Agora, você pode ajustar a definição encontrada no arquivo que copiou. Primeiro, abra-o em seu editor de texto favorito. Usaremos o vi aqui:

				
					
sudo vi /etc/firewalld/services/<^>example<^>.xml

				
			

Para começar, o arquivo possuirá a definição SSH que você copiou:

				
					
[label /etc/firewalld/services/example.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>

				
			

A maior parte dessa definição, na verdade, consiste em metadados. Você vai querer alterar o nome curto para o serviço dentro de tags <short>. Esse é um nome legível para seu serviço. Você também deve adicionar uma descrição, para que tenha mais informações caso precise auditar o serviço. A única configuração que precisa fazer que afetará de fato a funcionalidade do serviço, provavelmente será a definição da porta onde você identifica o número de porta e o protocolo que deseja abrir. Várias tags <port/> podem ser especificadas.

Em nosso serviço exemplo, imagine que precisamos abrir a porta 7777 para o TCP e 8888 para o UDP. Podemos modificar a definição existente com algo parecido com isto:

				
					
[label /etc/firewalld/services/example.xml]

&lt;?xml version="1.0" encoding="utf-8"?&gt;

&lt;service&gt;

 &lt;short&gt;&lt;^&gt;Example Service&lt;^&gt;&lt;/short&gt;

 &lt;description&gt;&lt;^&gt;This is just an example service. It probably shouldn't be used on a real system.&lt;^&gt;&lt;/description&gt;

 &lt;port protocol="&lt;^&gt;tcp&lt;^&gt;" port="&lt;^&gt;7777&lt;^&gt;"/&gt;

 &lt;port protocol="&lt;^&gt;udp&lt;^&gt;" port="&lt;^&gt;8888&lt;^&gt;"/&gt;

&lt;/service&gt;

				
			

Salve e feche o arquivo.

Recarregue seu firewall para obter acesso ao seu novo serviço:

				
					
sudo firewall-cmd --reload

				
			

Você pode ver que ele está agora entre a lista de serviços disponíveis:

				
					
firewall-cmd --get-services

				
			
				
					
[secondary_label Output]

RH-Satellite-6 amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bb bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc bittorrent-lsd ceph ceph-mon cfengine cockpit condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns dns-over-tls docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server &lt;^&gt;example&lt;^&gt; finger freeipa-4 freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git grafana gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kdeconnect kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns memcache minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy prometheus proxy-dhcp ptp pulseaudio puppetmaster quassel radius rdp redis redis-sentinel rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync spotify-sync squid ssdp ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tentacle tftp tftp-client tile38 tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server

				
			

Agora, você pode utilizar esse serviço em suas zonas, como normalmente faria.

Criando suas próprias zonas

Embora as zonas pré-definidas sejam mais que suficientes para a maioria dos usuários, pode ser útil definir suas próprias zonas, que sejam mais descritivas em relação às suas funções.

Por exemplo, você pode querer criar uma zona para seu servidor Web, chamada publicweb. No entanto, pode querer ter outra zona configurada para o serviço DNS que você provisiona em sua rede privada. Você pode querer uma zona chamada "privateDNS" para isso.

Ao adicionar uma zona, você _deve_ adicioná-la à configuração permanente do firewall. Depois disso, você pode recarregar para trazer a configuração para sua sessão em execução. Por exemplo, poderíamos criar as duas zonas discutidas acima, digitando:

				
					
sudo firewall-cmd --permanent --new-zone=publicweb

sudo firewall-cmd --permanent --new-zone=privateDNS

				
			

Você pode verificar se elas estão presentes em sua configuração permanente, digitando:

				
					
sudo firewall-cmd --permanent --get-zones

				
			
				
					
[secondary_label Output]

block dmz drop external home internal &lt;^&gt;privateDNS&lt;^&gt; public &lt;^&gt;publicweb&lt;^&gt; trusted work

				
			

Como dito anteriormente, essas zonas ainda não estarão disponíveis no firewall de tempo de execução:

				
					
firewall-cmd --get-zones

				
			
				
					
[secondary_label Output]

block dmz drop external home internal public trusted work

				
			

Recarregue o firewall para trazer essas novas zonas para a configuração ativa de tempo de execução:

				
					
sudo firewall-cmd --reload

firewall-cmd --get-zones

				
			
				
					
[secondary_label Output]

block dmz drop external home internal &lt;^&gt;privateDNS&lt;^&gt; public &lt;^&gt;publicweb&lt;^&gt; trusted work

				
			

Agora, você pode começar a atribuir os serviços e portas apropriados para suas zonas. Normalmente, é uma boa ideia ajustar o firewall de tempo de execução e, em seguida, salvar essas alterações na configuração permanente após realizar testes. Por exemplo, para a zona publicweb, você pode querer adicionar os serviços SSH, HTTP e HTTPS:

				
					
sudo firewall-cmd --zone=publicweb --add-service=ssh

sudo firewall-cmd --zone=publicweb --add-service=http

sudo firewall-cmd --zone=publicweb --add-service=https

sudo firewall-cmd --zone=publicweb --list-all

				
			
				
					
[secondary_label Output]

publicweb

 target: default

 icmp-block-inversion: no

 interfaces:

 sources:

 services: http https ssh

 ports:

 protocols:

 masquerade: no

 forward-ports:

 source-ports:

 icmp-blocks:

 rich rules:

				
			

De maneira semelhante, podemos adicionar o serviço DNS à nossa zona privateDNS:

				
					
sudo firewall-cmd --zone=privateDNS --add-service=dns

sudo firewall-cmd --zone=privateDNS --list-all

				
			
				
					
[secondary_label Output]

privateDNS

 target: default

 icmp-block-inversion: no

 interfaces:

 sources:

 services: dns

 ports:

 protocols:

 masquerade: no

 forward-ports:

 source-ports:

 icmp-blocks:

 rich rules:

				
			

Depois disso, poderíamos mudar nossas interfaces para essas novas zonas, para testá-las:

				
					
sudo firewall-cmd --zone=publicweb --change-interface=eth0

sudo firewall-cmd --zone=privateDNS --change-interface=eth1

				
			

Neste ponto, você tem a oportunidade de testar sua configuração. Se esses valores funcionarem, você vai querer adicionar essas regras à configuração permanente. Você _poderia_ fazer isso, executando todos os comandos novamente com o sinalizador --permanent acrescentado a eles. Neste caso, porém, usaremos o sinalizador --runtime-to-permanent para salvar nossa configuração de tempo de execução inteira permanentemente:

				
					
sudo firewall-cmd --runtime-to-permanent

				
			

Após aplicar permanentemente essas regras, recarregue o firewall para testar se as mudanças permanecem:

				
					
sudo firewall-cmd --reload

				
			

Confirme se as zonas corretas foram atribuídas:

				
					
firewall-cmd --get-active-zones

				
			
				
					
[secondary_label Output]

privateDNS

 interfaces: eth1

publicweb

 interfaces: eth0

				
			

E confirme se os serviços apropriados estão disponíveis para ambas as zonas:

				
					
sudo firewall-cmd --zone=publicweb --list-services

				
			
				
					
[secondary_label Output]

http https ssh

				
			
				
					
sudo firewall-cmd --zone=privateDNS --list-services

				
			
				
					
[secondary_label Output]

dns

				
			

Você configurou suas próprias zonas com sucesso! Se quiser transformar uma dessas zonas o padrão para outras interfaces, lembre-se de configurar esse comportamento com o parâmetro --set-default-zone=:

				
					
sudo firewall-cmd --set-default-zone=publicweb

				
			

Conclusão

Agora, você já deve ter uma compreensão bem abrangente de como administrar o serviço firewalld em seu sistema CentOS para o uso do dia a dia.

O serviço firewalld permite que você configure regras e conjuntos de regras que podem ser mantidas e que levam em consideração seu ambiente de rede. Ele permite que você escolha sem dificuldades diferentes políticas de firewall com o uso de zonas. Além disso, oferece aos administradores a capacidade de abstrair a gestão de portas em definições de serviço mais amigáveis. Obter um conhecimento prático desse sistema permitirá que você aproveite a flexibilidade e o poder que essa ferramenta propicia.

Para obter mais informações sobre o firewalld, consulte a documentação oficial do firewalld.