Pesquisa de site

Tutorial do Iptables


Iptables é um firewall de linha de comando que filtra pacotes de acordo com as regras definidas. Com o Iptables, os usuários podem aceitar, recusar ou encaminhar conexões; é incrivelmente versátil e amplamente utilizado, apesar de ter sido substituído por nftables.

Depois de ler este tutorial, você entenderá as políticas do Iptables e definirá as regras do Iptables para proteger sua rede doméstica.

Nota: o comando sudo foi adicionado para leitores que precisam copiar e colar as regras mencionadas neste tutorial do iptables.

Glossário do Iptables:

TARGET: Ao usar o iptables, um destino é uma ação que você deseja que o Iptables aplique quando um pacote corresponder a uma regra.

CHAIN: Uma cadeia é uma lista de regras; as cadeias incorporadas disponíveis são: INPUT, OUTPUT, FORWARD, PREROUTING e POSTROUTING.

TABELA: Tabelas são recursos do iptables para cada propósito. Por exemplo, existe uma tabela para tarefas de roteamento e outra tabela para tarefas de filtragem; cada tabela contém cadeias de regras.

As tabelas disponíveis são filter, nat, raw, security e mangle. Cada tabela contém cadeias internas (regras). A lista a seguir mostra quais cadeias incluem cada tabela:

FILTER INPUT OUTPUT FORWARD
NAT PREROUTING POSTROUTING OUTPUT
RAW PREROUTING OUTPUT
MANGLE PREROUTING POSTROUTING OUTPUT INPUT FORWARD
SECURITY INPUT OUTPUT FORWARD

Dependendo da ação que você deseja que o iptables faça, você precisa especificar uma tabela usando a opção -t seguida do nome da tabela. Neste tutorial, a opção -t não é usada. Este tutorial se concentra nos propósitos de filtragem usando a tabela de filtros aplicada por padrão quando a opção -t não é passada. Ao ler este tutorial, você aprenderá alguns dos conceitos mencionados acima.

Como instalar:

Para instalar o Iptables no Debian e suas distribuições Linux baseadas, execute:

sudo apt install iptables -y

Antes de instalar o Iptables em distribuições Linux baseadas em RedHat, você precisa desativar o Firewalld executando:

sudo systemctl stop firewalld
sudo systemctl disable firewalld
sudo systemctl mask --now firewalld

Em seguida, instale o Iptables executando:

sudo yum install iptables-services
sudo systemctl start iptables
sudo systemctl start ip6tables
sudo systemctl enable iptables
sudo systemctl enable ip6tables
sudo systemctl start ip6tables

Introdução ao Iptables:

Antes de começar, verifique as regras anteriores instruindo o iptables a listar as políticas e regras existentes usando o parâmetro -L (–list).

sudo iptables -L

A saída acima mostra 3 linhas: Chain INPUT, Chain FORWARD e Chain OUTPUT. Onde INPUT refere-se a políticas relacionadas ao tráfego de entrada, OUTPUT refere-se a políticas aplicadas ao tráfego de saída e FORWARD refere-se a políticas de roteamento.

A saída também mostra que não há regras definidas e todas as políticas definidas são aceitas.

Existem 3 tipos de políticas: ACEITAR, REJEITAR e DROP.

A política ACEITAR permite conexões; a política REJECT recusa conexões retornando um erro; a política DROP recusa conexões sem produzir erros. Ao usar DROP, os pacotes UDP são descartados e o comportamento será o mesmo que conectar a um porto sem serviço. Os pacotes TCP retornarão um ACK/RST, que é a mesma resposta com a qual uma porta aberta sem serviço responderá. Ao usar REJECT, um pacote ICMP retorna destino inacessível ao host de origem.

Ao lidar com o Iptables, você precisa primeiro definir as três políticas para cada cadeia; depois disso, você pode adicionar exceções e especificações. A adição de políticas fica assim:

sudo iptables -P INPUT         <ACCEPT/DROP/REJECT>
sudo iptables -P OUTPUT     <ACCEPT/DROP/REJECT>
sudo iptables -P FORWARD <ACCEPT/DROP/REJECT>

Políticas permissivas e restritivas do Iptables:

Você pode aplicar o Iptables com uma política permissiva aceitando todas as conexões de entrada, exceto aquelas que você descartar ou rejeitar especificamente. Nesse caso, todas as conexões são permitidas, a menos que você defina uma regra para recusá-las especificamente.

Pelo contrário, as políticas restritivas recusam todas as conexões, exceto aquelas que você aceita especificamente. Nesse caso, toda conexão é recusada, a menos que você defina uma regra para aceitá-la.

Aplicando uma política restritiva com Iptables:

O exemplo a seguir mostra como aplicar uma política restritiva com Iptables eliminando todo o tráfego de entrada, exceto o permitido.

Bloqueio de tráfego de entrada.

IMPORTANTE: aplicar as 3 regras a seguir pode deixar você sem conexão com a internet. Usando as regras mencionadas em “Regras de anexação do Iptables e estados do Iptables”, você adiciona as exceções necessárias para restaurar seu acesso à Internet. Você pode executar consistentemente sudo iptables -F para liberar regras.

Você pode bloquear todo o tráfego de entrada, permitindo apenas o tráfego de saída para navegar na web e para os aplicativos de que você precisa.

sudo iptables -P INPUT DROP

sudo iptables -P OUTPUT ACCEPT

sudo iptables -P FORWARD DROP

Onde :

-P=Política

sudo iptables -P INPUT DROP: instrui o iptables a recusar todo o tráfego de entrada sem responder à fonte.

sudo iptables -P OUTPUT ACCEPT: define uma política ACCEPT para o tráfego de saída.

sudo iptables -P FORWARD DROP: instrui o iptables a não executar tarefas de roteamento descartando todos os pacotes destinados a um host diferente (tentando passar pelo dispositivo com firewall) sem resposta.

O exemplo acima permite navegar na web e conexões iniciadas pelo dispositivo local (-P OUTPUT ACCEPT), mas impedirá conexões iniciadas por outro host (-P INPUT DROP) como ssh tentativas de acessar seu dispositivo não retornam mensagens de erro.

Ao habilitar o Iptables com uma política restritiva como no exemplo anterior, você precisa anexar regras para ajustar sua configuração. Por exemplo, se você mantiver a configuração mencionada acima sem adicionar uma exceção razoável para a interface de loopback (lo), alguns aplicativos podem não funcionar corretamente. Você também precisará permitir o tráfego de entrada pertencente ou relacionado a uma conexão iniciada por seu dispositivo.

Regras de anexação do Iptables e estados do Iptables

É essencial entender que o Iptables aplica regras por ordem. Quando você define uma regra após uma regra anterior, a segunda regra reescreverá a última se um pacote corresponder à mesma regra.

Eu gosto do exemplo anterior; você bloqueou todo o tráfego de entrada, você precisa anexar exceções para a interface de loopback; isso pode ser obtido adicionando o parâmetro -A (Anexar).

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

sudo iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

O módulo  (-m) conntrack –ctstate ESTABLISHED,RELATED instrui o Iptables a confirmar se o estado da conexão é ESTABLISHED ou RELATED a uma conexão existente antes de aplicar a política de regra definida.

Existem 4 estados possíveis que o Iptables pode verificar:

Iptables state NOVO: O pacote ou tráfego que você permite ou bloqueia tenta iniciar uma nova conexão.

Iptables state ESTABLISHED: O pacote ou tráfego que você permite ou bloqueia faz parte de uma conexão estabelecida.

Estado do Iptables RELATED: o pacote ou tráfego inicia uma nova conexão, mas está relacionado a uma conexão existente.

Iptables state INVALID: O pacote ou tráfego é desconhecido sem o estado.

A primeira linha do exemplo acima instrui o Iptables a aceitar pacotes recebidos do tráfego proveniente ou relacionado a conexões iniciadas por seu dispositivo. A segunda linha instrui o Iptables a aceitar apenas tráfego de saída de conexões já estabelecidas.

Iptables Append para aceitar o tráfego de loopback e definir interfaces:

A interface de loopback é usada por programas que precisam interagir com o localhost. Se você não permitir o tráfego de loopback, alguns aplicativos podem não funcionar.

O seguinte comando permite conexões de loopback:

sudo iptables -A INPUT -i lo -j ACCEPT

sudo iptables -A OUTPUT -o lo -j ACCEPT

Onde -i e -o são usados para especificar o dispositivo de rede para tráfego de entrada (-i) e tráfego de saída (-o).

Aplicando uma política permissiva com Iptables:

Você também pode definir uma política permissiva permitindo todo o tráfego, exceto o especificado descartado ou rejeitado. Você pode habilitar tudo, exceto um IP ou intervalo de IP específico, ou pode recusar pacotes com base em seus cabeçalhos, entre outras possibilidades.

O exemplo a seguir mostra como aplicar uma política permissiva permitindo todo o tráfego, exceto para um intervalo de IP bloqueado para o serviço ssh.

sudo iptables -P INPUT ACCEPT

sudo iptables -P OUTPUT ACCEPT

sudo iptables -P FORWARD DROP

sudo iptables -A INPUT -p tcp --dport 22 -m iprange --src-range 192.168.1.100-192.168.1.110 -j REJECT

O exemplo acima aplica uma política permissiva, mas bloqueia o acesso ssh a todos os IPs pertencentes ao intervalo 192.168.1.100 e 192.168.1.110.

Onde -p especifica o protocolo, –dport (ou  –destination-port) a porta de destino (22,ssh) e o módulo iprange com o argumento –src-range (intervalo de origem) permite definir o intervalo de IP. A opção -j (–jump) instrui o iptables sobre o que fazer com o pacote; neste caso, representamos REJECT.

Bloqueando portas com Iptables

O exemplo a seguir mostra como bloquear uma porta específica para todas as conexões, a porta ssh.

sudo iptables -A INPUT -p tcp --destination-port 22 -j DROP

Salvando alterações do Iptables

As regras do Iptables não são persistentes; após a reinicialização, as regras não serão restauradas. Para tornar suas regras persistentes, execute os seguintes comandos onde a primeira linha salva as regras no arquivo /etc/iptables.up.rules, e a segunda linha é para criar o arquivo para o iptables iniciar após a reinicialização.

sudo  iptables-save > /etc/iptables.up.rules

nano /etc/network/if-pre-up.d/iptables

Adicione o seguinte ao arquivo e feche as alterações de salvamento (CTRL+X).

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules

Por fim, dê ao arquivo permissões de execução executando:

chmod +x /etc/network/if-pre-up.d/iptables

Liberando ou removendo as regras do Iptables:

Você pode remover todas as suas regras do Iptables executando o seguinte comando:

sudo iptables -F

Para remover uma cadeia específica como INPUT, você pode executar:

sudo iptables -F

Conclusão:

O Iptables está entre os firewalls mais sofisticados e flexíveis do mercado. Apesar de ter sido substituído, continua sendo um dos softwares defensivos e de roteamento mais difundidos.

Sua implementação pode ser rapidamente aprendida por novos usuários Linux com conhecimento básico de TCP/IP. Depois que os usuários entendem a sintaxe, definir regras torna-se uma tarefa fácil.

Existem muito mais módulos e opções adicionais que não foram abordados neste tutorial introdutório. Você pode ver mais exemplos de iptables em Iptables para iniciantes.

Espero que este tutorial do Iptables tenha sido útil. Continue seguindo o Linux Hint para mais dicas e tutoriais sobre Linux.

Artigos relacionados: