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
.
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.
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.
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:
icmp-host-prohibited
ou icmp6-adm-prohibited
.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.
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.
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
Outputrunning
Isso indica que nosso firewall está em funcionamento com a configuração padrão.
Antes de começar a fazer alterações, precisamos nos familiarizar com o ambiente e as regras padrão fornecidos pelo firewalld.
Podemos ver qual zona está atualmente selecionada como padrão, digitando:
- firewall-cmd --get-default-zone
Outputpublic
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
Outputpublic
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
Outputpublic (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).
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
Outputblock 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
Outputhome
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.
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.
É 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
Outputsuccess
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
Outputhome
interfaces: eth0
public
interfaces: eth1
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
Outputsuccess
Vamos examinar a maneira básica de definir exceções de firewall para os serviços que deseja disponibilizar.
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
OutputRH-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:
<?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
Outputcockpit 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
Outputsuccess
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
Outputcockpit 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
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.
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
Outputsuccess
Podemos verificar se isso foi bem-sucedido usando a operação --list-ports
:
- sudo firewall-cmd --zone=public --list-ports
Output5000/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
Outputsuccess
success
5000/tcp 4990-4999/udp
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:
<?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:
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>Example Service</short>
<description>This is just an example service. It probably shouldn't be used on a real system.</description>
<port protocol="tcp" port="7777"/>
<port protocol="udp" port="8888"/>
</service>
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
OutputRH-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 example 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.
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
Outputblock dmz drop external home internal privateDNS public publicweb 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
Outputblock 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
Outputblock dmz drop external home internal privateDNS public publicweb 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
Outputpublicweb
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
OutputprivateDNS
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
OutputprivateDNS
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
Outputhttp https ssh
- sudo firewall-cmd --zone=privateDNS --list-services
Outputdns
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
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.
Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.
This textbox defaults to using Markdown to format your answer.
You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!