Gerenciando Firewall com Firewalld

Em um dos posts anteriores vimos como gerenciar o firewall usando o ufw:

Gerenciando Firewall com UFW

Hoje iremos gerenciar usando o Firewalld.

Como vimos no post anterior, tanto o ufw quanto o firewalld são apenas facilitadores. Eles fornecem uma interface entre o usuário e o netfilter. Até o iptables é apenas um software que serve para criar um conjunto de regras  no firewall, mas ele em si não é o firewall. Falando em iptables, ele tem um substituto, o nftables.

O firewalld vem instalado em algumas distros, por exemplo, CentOs, Fedora, Red Hat –  ou seja, Firewalld é padrão na família red hat.

Firewalld é considerada, juntamente com o iptables, uma poderosa ferramenta para gerenciamento de firewall.

O Firewalld usa a ferramenta firewall-cmd para executarmos comandos.

Instalado o Firewalld

É bom reforçar que em distribuições da Red Hat e derivados o firewalld já vem instalado por padrão. Mas se quiser conferir tenta executar “firewall-cmd –state”, se retornar comando não encontrado provavelmente não estará instalado.

 

Como instalar?

Debian e derivados:

apt install firewalld

Red Hat e derivados:

yum install firewalld

Inicializando o Firewalld

 

Antes de tudo verifique se o firewalld está incializado

[elder@empresa10 ~]$ sudo firewall-cmd --state
running

Acima vemos que está ativo(running). Mas se não estivesse usaríamos o comando abaixo para iniciá-lo

[elder@empresa10 ~]$ sudo systemctl start firewalld

e esse outro comando para que o firewalld inicie automaticamente  ao iniciarmos o computador.

[elder@empresa10 ~]$ sudo systemctl enable firewalld

 

Alteração Permanente e temporária

As alterações que fazemos usando firewall-cmd serão apagadas ao reiniciarmos o firewalld.

Para que fiquem permanentes devemos usar a opção “–permanet“. Exemplo, vamos  liberar a porta 8080 usando protocolo tcp e deixando permanente a alteração

[elder@empresa10 services]$ sudo firewall-cmd --permanent  --add-port=8080/tcp

Acima, mesmo executando um “firewall-cmd –reload” ou “systemctl  restart firewalld” a configuração acima não será apagada.

 

As Zonas do Fiewalld

O que é uma zona no firewalld e para que serve?

Zona é um conjunto de regras prontas e usamos escolhemos uma zona de acordo com a segurança que queremos, de acordo com a confiança que temos nos computadores que irão se conectar à nossa rede. Por exemplo, se quisermos uma rede bem segura e sem acesso bem limitado a nenhuma máquina na rede então podemos definir nossa zona no firewalld como sendo “drop” ou “block”;  mas se confiamos em nos computadores conectados podemos definir a zona como sendo “trusted”.

A zona padrão é a public. É ela que está ativa e é usada ao iniciarmos o firewall pela primeira vez.

Em um rede com conexão com fio(wired) e e sem fio(wireless) definir zonas diferentes para cada um é algo importante em nossas casas; assim, um usuário que se descontada da rede cabeada e se conecta na sem fio passa a ter regras(zona) alteradas de acordo. Em empresas isso não tem muito sentido já que a rede dificilmente muda. Lembrando que rede sem fio em empresas não é seguro termos, a não ser se for um plano de internet totalmente separado e sem contato da usada nos computadores internos com conexão cabeada/com fio.

As zonas podem ser

  • mutável: pode ser alterada
  • imutável: não pode ser alterada

Zona no firewalld define o nível de confiança para interfaces de rede ou conexões. Executando o comando abaixo irá ser exibido todas as zonas disponíveis.

firewall-cmd --get-zones

 

Segue explicação onde ordeno as zonas da mais limitada para a menos; ou seja, a primeira(drop) zona da lista é a mais fechada, a mais desconfiada e a última(trust) é  a mais aberta:

 

  • drop: Imutável. Drop em inglês significa cair. Essa zona faz cair a maioria das conexões. Quanto à confiança, essa zona é a que menos confia nas conexões e assim é a que mais bloqueia. Toda conexão que entra é cortada/bloqueada e apenas conexões de saída é possível.
  • block: Imutável. É semelhante à zona drop, mas ao invés de apenas fazer cair as conexões de entrada elas rejeitadas com um icmp-host-prohibited. A zona block é um pouco mais suave que a drop.
  • public: Mutável. Representa uma rede pública, isto é, não confiável. Uma rede pública é aquela que todo mundo pode se conectar, podemos citar como exemplo redes de restaurantes, hotéis…. você não confia nos outros aparelhos conectados mais pode permitir conexão de entrada a depender do caso. Essa zona é mais aberta, confia mais, que as outras duas zonas acima.
  • external: Mutável. Externo aqui faz sentido quando usamos nosso computador como um gateway, ou seja, como um computador que distribui internet. Esse computador é configurado com NAT para tradução de endereços. Assim, essa zona “externa” faz com que nossa rede interna fique protegida enquanto o computador serve como Gateway para outros computadores.
  • InternalMutável.Quando um computador oferece serviço de gateway para outros ele acaba tendo dois lados, o externo que serve aos computadores externos e o lado interno que é referente à nossa rede interna, à porção interna do gateway.  Os computadores internos são confiáveis e alguns serviços são permitidos pelo firewall.
  • dmzMutável. Usado para computadores localizados em um DMZ( computadores isolados que não terão acesso ao restante da rede). Somente algumas entradas são permitidas pelo firewalld.
  • work: Mutável. Usado para computadores de trabalho. Confia na maioria dos computadores da rede. Alguns serviços à mais são liberados.
  • home: Uma zona para o ambiente de casa. Isso implica em uma confiança muito maior nos dispositivos conectados à sua rede caseira. Mais serviços são permitidos.
  • trusted: Imutável. Confie em todos os dispostivos/computadores da rede. Essa zona é muito aberta e deve ser usada com precaução.

 

A ferramenta de linha de comando para o firewalld é a firewall-cmd. Vamos usá-la.

Gerenciando Zonas no Firewalld

 

#1  Exibindo as zonas disponíveis

[elder@empresa10 ~]$ sudo firewall-cmd --get-zones
block dmz drop external home internal public trusted work

#2 Exibindo a zona ativa no momento. Abaixo vemos que é a pública(public)

[elder@empresa10 ~]$ sudo firewall-cmd --get-default-zone
public

#3 Listando as configurações da zona. Ainda que a opção “–list-all”  possa dar a entender que listará  tudo de todas as zonas na verdade apenas mostrar tudo mas da zona ativa atualmente.

[elder@empresa10 ~]$ sudo firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s3
  sources: 192.168.0.0/24
  services: cockpit dhcpv6-client ssh
  ports: 8300/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: echo-request echo-reply
  rich rules:

#4 Listando a zona ativa

[elder@empresa10 ~]$ sudo firewall-cmd --get-active-zones
public
  interfaces: enp0s3
  sources: 192.168.0.0/24

#5 Listando todas as zonas com  suas configurações. Agora sim, a opção “–list-all-zones” mostrar o que achávamos que “–list-all” exibiria. Não mostrarei o resultado do comando para não ficar muito longo a página desse artigo.

[elder@empresa10 ~]$ sudo firewall-cmd --list-all-zones
........
.......

#6 Podemos escolher uma única zona com a opção “–zone=nome_da_zona”  juntamente com “–list-all”

[elder@empresa10 ~]$ sudo firewall-cmd --zone=drop  --list-all
drop
  target: DROP
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: 
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 

 

#7 Alterando a zona com “–set-default-zone=nome_da_zona”

[elder@empresa10 ~]$ sudo firewall-cmd --set-default-zone=trusted
success

veja a zona ativa. Mudou de public para trusted

[elder@empresa10 ~]$ sudo firewall-cmd --get-default-zone 
trusted

#8 Se tiver mais de uma interface de rede no computador poderá associar cada interface de rede à uma zona diferente com a opção “–zone=nome_da_zona”  e “–change-interface=nome_da_interface”.

Por exemplo, vamos supor que além da interface enp0s3 eu tenha a enp0s8. Quer definir a zona drop para a interface enp0s8.

[elder@empresa10 ~]$ sudo firewall-cmd --zone=drop --change-interface=enp0s8

Liste agora as zonas ativas

[elder@empresa10 ~]$ sudo firewall-cmd --get-active-zones
drop
  interfaces: enp0s8
public
  sources: 192.168.0.0/24
trusted
  interfaces: enp0s3

#9 Podemos ver se uma interface pertence à uma zona com a opção “–query-interface=nome_da_interface”  juntamente com a zona “–zone=nome_zona”

[elder@empresa10 ~]$ sudo firewall-cmd --zone=trusted --query-interface=enp0s8
no

Acima vemos que a zona trusted não faz parte da interface enp0s8. Abaixo veremos que zona drop faz parte dessa interface

[elder@empresa10 ~]$ sudo firewall-cmd --zone=drop --query-interface=enp0s8
yes

 

 

Serviços do Firewalld

 

Sabemos que algumas zonas são alteráveis(mutáveis) enquanto outras não. Nas mutáveis podemos adicionar permissão de acesso através de nomes de programas pré-existentes. Por exemplo, se quero liberar o ssh para que outras máquinas acessem meu pc posso fazer da seguinte forma:

[elder@empresa10 ~]$ sudo firewall-cmd --add-service=ssh
success

Como não especifiquei a zona com “–zone=nome_zona” então a zona alterada é ativa, veja

[elder@empresa10 ~]$ sudo firewall-cmd --list-all
trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  interfaces: enp0s3
  sources: 
  services: ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

Para listar os serviços adicionados:

[elder@empresa10 ~]$ sudo firewall-cmd --list-services 
ssh

Para remover um serviço basta usar “–remove-service=nome_serviço”

[elder@empresa10 ~]$ sudo firewall-cmd --remove-service=ssh

Mas tem como ver a lista de todos os serviços disponíveis? Sim. Use a opção “–get-services”

[elder@empresa10 ~]$ sudo firewall-cmd --get-services 
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 kube-apiserver 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

 

Esses serviços listados nada mais são que arquivos dentro da pasta /usr/lib/firewalld/services ou /etc/firewalld/services

[elder@empresa10 ~]$ sudo ls /usr/lib/firewalld/services/
amanda-client.xml	 grafana.xml		mysql.xml		  smtp-submission.xml
amanda-k5-client.xml	 gre.xml		nfs3.xml		  smtps.xml
amqps.xml		 high-availability.xml	nfs.xml			  smtp.xml
amqp.xml		 https.xml	........................ não listei tudo para resumir o resultado

 

Se um programa não está nessa lista podemos pegar um arquivo desse como modelo e criar nosso próprio serviço. Sinta-se à vontade.

No meu caso acabei alterando  porta do ssh de 22 para 8888 e então posso copiar o conteúdo do arquivo ssh.xml que está dentro da pasta acima e criar meu novo serviço ssh

Vamos acessar a pasta

[elder@empresa10 ~]$ cd /usr/lib/firewalld/services

Copiar ssh.xml para ssh8888.xml

[elder@empresa10 services]$ sudo cp ssh.xml ssh8888.xml

Altere o a porta de 22 para 8888

[elder@empresa10 ~]$ vim ssh8888.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="8888"/>
</service>

Pronto, salve a edição e veja seu novos serviço.

recarregue o firewalld

[elder@empresa10 services]$ sudo firewall-cmd --reload

Veja o resultado

[elder@empresa10 services]$ sudo firewall-cmd --get-services | grep ssh8888

 

 

Gerenciando Portas  com Firewalld

Ao invés de liberar o serviço, como fizemos acima, podemos liberar a porta usada por ele. Por exemplo, a porta padrão do ssh é a 22.

Para liberar podemos tanto fazer

[elder@empresa10 services]$ sudo firewall-cmd --add-service=ssh

como assim

[elder@empresa10 services]$ sudo firewall-cmd --add-port=22/tcp

Lembre-se de indicar se a porta usará tcp ou udp. Acima foi usado tcp.

As configurações acima não são permanentes. Serão apagadas. Use “–permanent” para fixar essas alterações.

Exemplos:

#1 liberando uma série/intervalo de portas. Basta colocarmos a porta inicial e final separadas por um traço “-”

[elder@empresa10 services]$ sudo firewall-cmd --add-port=22-30/tcp

liste as portas abertas

#2 Liberando portas para uma zona específica

[elder@empresa10 services]$ sudo firewall-cmd --zone=drop --add-port=8888/tcp
[elder@empresa10 services]$ sudo firewall-cmd --zone=drop   --list-all
drop
  target: DROP
  icmp-block-inversion: no
  interfaces: 
  sources: 
  services: 
  ports: 8888/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules:

 

#3 Removendo portas com “–remove-port”

[elder@empresa10 services]$ sudo firewall-cmd --zone=drop   --remove-port=8888/tcp

 

#4 Vendo se uma porta(–query-port) ou serviço(–query-service) está ativa em alguma zona

Abaixo a resposta é não(no) pois removemos a porta 8888 no passo anterior.

[elder@empresa10 services]$ sudo firewall-cmd --zone=drop   --query-port=8888/tcp
no

Agora vamos ver o serviço ssh na zona pública

[elder@empresa10 services]$ sudo firewall-cmd --zone=public --query-service=ssh
yes

 

Redirecionamento de Portas –  Port Forwarding

 

Às vezes queremos que ao acessar de fora uma porta ela seja redirecionada para outra. Por exemplo, a porta o ssh é a 22  mas desejamos que o acesso dela seja feita pela 8080. Então, ao acessar 8080 haja um redirecionamento interno para a 22.

Para fazer esse redirecionamento precisamos ativar “masquerade” para a zona. Masquerade é uma forma de tradução, de mapeamento entre endereços. Masquerade é o que conhecemos como NAT.

#1 Vendo se masquerade já está ativo. A resposta abaixo é não(no)

[elder@empresa10 ~]$ sudo firewall-cmd --zone=public --query-masquerade 
no

#2 Ativando o masquerading para a zona public

[elder@empresa10 ~]$ sudo firewall-cmd --zone=public --permanent --add-masquerade
success

#3 fazendo o redirecionamento onde o acesso enviado para a porta tcp 8080  irá para a 22

[elder@empresa10 ~]$ sudo firewall-cmd --add-forward-port=port=8080:proto=tcp:toport=22:toaddr=192.168.0.44

Detalhando:

  • –add-forward-port Adicione redirecionamento de porta(port forwarding)
  • port=8080:proto=tcp: redirecione a porta 8080 que usa protocolo tcp
  • toport=22:toaddr=192.168.0.44  redirecione para a porta 22 do computador com endeço ip 192.168.0.44

 

#4 Recarregue o firewalld para aplicar as aterações

[elder@empresa10 ~]$ sudo firewall-cmd --reload

#5 Removendo o direcionamento da porta

Liste os dados os redirecionamentos. Em nosso caso vamos ver o que fizemos na zona pública

[elder@empresa10 ~]$ sudo firewall-cmd  --zone=public  --list-forward-ports 
port=8080:proto=tcp:toport=22:toaddr=192.168.0.44

Copie a linha acima: “port=8080:proto=tcp:toport=22:toaddr=192.168.0.44” e cole-a na frente de  –remove-forward-port=

[elder@empresa10 ~]$ sudo firewall-cmd --zone=public  --remove-forward-port=port=8080:proto=tcp:toport=22:toaddr=192.168.0.44

 

 

Conclusão

 

Geralmente ao instalar um distro derivada do Debian ela pode vir com o ufw como gerenciador de regras de firewall. Particularmente prefiro desinstalar o ufw e instalar o firewalld por ser mais completo e rico em opções.

Para mais informações sobre o firewalld pesquise seu manual com o comando “man firewalld”.

 

Leitor voraz e um dos administradores do GNU/Linux Brasil no Whatsapp, facebook, youtube e nesse dito site: www.gnulinuxbrasil.com.br

3 Comments to “Gerenciando Firewall com Firewalld”

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *