Tutorial

Como listar e excluir regras de firewall do Iptables

Published on December 1, 2020
Português
Como listar e excluir regras de firewall do Iptables

Introdução

O Iptables é um firewall que desempenha um papel essencial na segurança de rede para a maioria dos sistemas Linux. Enquanto muitos tutoriais do iptables vão lhe ensinar como criar regras de firewall para proteger seu servidor, este irá se concentrar em um aspecto diferente do gerenciamento de firewall: listar e excluir regras.

Neste tutorial, vamos mostrar como fazer as seguintes tarefas do iptables:

  • Listar regras
  • Zerar contadores de pacotes e de bytes
  • Excluir regras
  • Esvaziar cadeias (excluir todas as regras em uma cadeia)
  • Esvaziar todas as cadeias e tabelas, excluir todas as cadeias e aceitar todo o tráfego

Nota: ao trabalhar com firewalls, tome cuidado para não se bloquear no seu próprio servidor, bloqueando o tráfego de SSH (porta 22, por padrão). Se você perder o acesso devido às suas configurações de firewall, pode ser necessário se conectar através de um console auxiliar para restabelecer seu acesso.

Pré-requisitos

Este tutorial assume que você está usando um servidor Linux com o comando iptables instalado, e que seu usuário possui privilégios de sudo.

Se precisar de ajuda com essa configuração inicial, consulte nosso guia Initial Server Setup with Ubuntu 20.04. Está disponível também para o Debian e o CentOS

Vamos dar uma olhada em como listar as regras primeiro. Existem duas maneiras diferentes de visualizar as regras ativas do iptables: em uma tabela ou como uma lista de especificações de regras. Ambos os métodos fornecem aproximadamente a mesma informação em diferentes formatos.

Listando regras por especificação

Para listar todas as regras ativas do iptables por especificação, execute o comando iptables com a opção -S:

  1. sudo iptables -S
Output
-P INPUT DROP -P FORWARD DROP -P OUTPUT ACCEPT -N ICMP -N TCP -N UDP -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -m conntrack --ctstate INVALID -j DROP -A INPUT -p udp -m conntrack --ctstate NEW -j UDP -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP -A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP -A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable -A INPUT -p tcp -j REJECT --reject-with tcp-reset -A INPUT -j REJECT --reject-with icmp-proto-unreachable -A TCP -p tcp -m tcp --dport 22 -j ACCEPT

Como podemos ver, a saída se parece com os comandos que foram usados ​​para criar as regras, sem o comando iptables precedendo-as. Isso também será semelhante aos arquivos de configuração de regras de iptables, se você alguma vez usou iptables-persistent ou iptables save.

Listando uma cadeia específica

Se você quiser limitar a saída a uma cadeia específica (INPUT, OUTPUT, TCP, etc.), especifique o nome da cadeia diretamente após a opção -S. Por exemplo, para mostrar todas as especificações de regras na cadeia TCP, você executaria esse comando:

  1. sudo iptables -S TCP
Output
-N TCP -A TCP -p tcp -m tcp --dport 22 -j ACCEPT

Agora, vamos dar uma olhada na maneira alternativa de visualizar as regras ativas do iptables, como uma tabela de regras.

Listando regras como tabelas

Listar as regras do iptables na visualização de tabela pode ser útil para comparar regras diferentes entre si.

Para exibir todas as regras ativas do iptables em uma tabela, execute o comando iptables com a opção -L:

  1. sudo iptables -L

Isso irá exibir todas as regras atuais ordenadas por cadeia.

Se você quiser limitar a saída a uma cadeia específica (INPUT, OUTPUT, TCP, etc.), especifique o nome da cadeia diretamente após a opção -L.

Vamos dar uma olhada em uma cadeia INPUT de exemplo:

  1. sudo iptables -L INPUT
Output
Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED ACCEPT all -- anywhere anywhere DROP all -- anywhere anywhere ctstate INVALID UDP udp -- anywhere anywhere ctstate NEW TCP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW ICMP icmp -- anywhere anywhere ctstate NEW REJECT udp -- anywhere anywhere reject-with icmp-port-unreachable REJECT tcp -- anywhere anywhere reject-with tcp-reset REJECT all -- anywhere anywhere reject-with icmp-proto-unreachable

A primeira linha da saída indica o nome da cadeia (INPUT, neste caso), seguido de sua política padrão (DROP). A próxima linha consiste dos cabeçalhos de cada coluna na tabela, e é seguida pelas regras da cadeia. Vamos examinar o que cada cabeçalho indica:

  • target: se um pacote corresponde à regra, target especifica o que deve ser feito com ela. Por exemplo, um pacote pode ser aceito, descartado, registrado ou enviado para outra cadeia para ser comparado com mais regras
  • prot: o protocolo, tal como tcp, udp, icmp, ou all.
  • opt: raramente usada, essa coluna indica opções IP
  • source: o endereço IP de origem ou sub-rede do tráfego, ou anywhere
  • destination: o endereço IP de destino ou sub-rede do tráfego, ou anywhere

A última coluna, que não está identificada indica as opções de uma regra. Ou seja, qualquer parte da regra que não está indicada pelas colunas anteriores. Isso poderia ser qualquer coisa desde portas de origem e destino, até o estado de conexão do pacote.

Mostrando contagens de pacotes e tamanho agregado

Ao listar regras do iptables, também é possível mostrar o número de pacotes e o tamanho agregado dos pacotes em bytes, que correspondem a cada regra particular. Isso muitas vezes é útil quando se tenta obter uma ideia aproximada de quais regras estão correspondendo aos pacotes. Para fazer isso, use a opção -L e -v juntas.

Por exemplo, vamos dar uma olhada novamente na cadeia INPUT, com a opção -v:

  1. sudo iptables -L INPUT -v
Output
Chain INPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 284K 42M ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED 0 0 ACCEPT all -- lo any anywhere anywhere 0 0 DROP all -- any any anywhere anywhere ctstate INVALID 396 63275 UDP udp -- any any anywhere anywhere ctstate NEW 17067 1005K TCP tcp -- any any anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW 2410 154K ICMP icmp -- any any anywhere anywhere ctstate NEW 396 63275 REJECT udp -- any any anywhere anywhere reject-with icmp-port-unreachable 2916 179K REJECT all -- any any anywhere anywhere reject-with icmp-proto-unreachable 0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh ctstate NEW,ESTABLISHED

Observe que a listagem agora tem duas colunas adicionais, pkts e bytes.

Agora que sabemos como listar as regras ativas de firewall de várias maneiras, vamos dar uma olhada em como podemos zerar os contadores de bytes.

Zerando contagens de pacotes e tamanho agregado

Se quiser limpar ou zerar os contadores de bytes e pacotes das suas regras, use a opção -Z. Eles também são zerados se uma reinicialização ocorrer. Isso é útil se você quiser ver se o servidor está recebendo um novo tráfego que corresponda às suas regras existentes.

Para limpar os contadores de todas as cadeias e regras, use a opção -Z por si só:

  1. sudo iptables -Z

Para limpar os contadores de todas as regras em uma cadeia específica, use a opção -Z e especifique a cadeia. Por exemplo, para limpar os contadores da cadeia INPUT execute este comando:

  1. sudo iptables -Z INPUT

Se você quiser limpar os contadores para uma regra específica, especifique o nome da cadeia e o número da regra. Por exemplo, para zerar os contadores da primeira regra na cadeia INPUT, execute isto:

  1. sudo iptables -Z INPUT 1

Agora que você sabe como zerar os contadores de bytes e de pacotes, vamos dar uma olhada nos dois métodos que podem ser usados para excluí-los.

Excluindo regras por especificação

Uma das maneiras de excluir regras do iptables é por especificação da regra. Para fazer isso, execute o comando iptables com a opção -D seguida da especificação da regra. Se você quiser excluir regras usando esse método, use a saída da lista de regras, iptables -S, para alguma ajuda.

Por exemplo, se você quiser excluir a regra que descarta pacotes de entrada inválidos (-A INPUT -m conntrack --ctstate INVALID -j DROP), execute este comando:

  1. sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP

Observe que a opção -A, que é usada para indicar a posição da regra no momento da criação, deve ser excluída aqui.

Excluindo regras por cadeia e número

A outra maneira de excluir regras do iptables é por sua cadeia e por número de linha. Para determinar o número de linha de uma regra, liste as regras em formato de tabela e adicione a opção --line-numbers:

  1. sudo iptables -L --line-numbers
[secondary_output Output]
Chain INPUT (policy DROP)
num  target     prot opt source               destination
1    ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
2    ACCEPT     all  --  anywhere             anywhere
3    DROP       all  --  anywhere             anywhere             ctstate INVALID
4    UDP        udp  --  anywhere             anywhere             ctstate NEW
5    TCP        tcp  --  anywhere             anywhere             tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
6    ICMP       icmp --  anywhere             anywhere             ctstate NEW
7    REJECT     udp  --  anywhere             anywhere             reject-with icmp-port-unreachable
8    REJECT     tcp  --  anywhere             anywhere             reject-with tcp-reset
9    REJECT     all  --  anywhere             anywhere             reject-with icmp-proto-unreachable
10   ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:ssh ctstate NEW,ESTABLISHED
...

Isso adiciona o número de linha a cada linha de regra, indicado pelo cabeçalho num.

Depois de saber qual regra você deseja excluir, observe a cadeia e o número de linha da regra. Em seguida, execute o comando iptables -D seguido pela cadeia e pelo número da regra.

Por exemplo, se quisermos excluir a regra de entrada que descarta pacotes inválidos, veremos que ela é a regra 3 da cadeia INPUT. Então devemos executar este comando:

  1. sudo iptables -D INPUT 3

Agora que sabemos como excluir regras individuais de firewall, vamos ver como é possível esvaziar cadeias de regras.

Esvaziando cadeias

O Iptables oferece uma maneira de excluir todas as regras em uma cadeia ou fazer um flush em uma cadeia. Esta seção cobrirá uma variedade de maneiras de fazer isso.

Nota: tenha cuidado para não se bloquear no servidor, via SSH, ao esvaziar uma cadeia com uma política padrão drop ou deny. Se fizer isso, será necessário se conectar a ele através do console para restabelecer seu acesso.

Esvaziando uma única cadeia

Para esvaziar uma cadeia específica, o que irá excluir todas as regras na cadeia, use a opção -F, ou a opção ---flush equivalente, e o nome da cadeia a ser esvaziada.

Por exemplo, para excluir todas as regras na cadeia INPUT, execute este comando:

  1. sudo iptables -F INPUT

Esvaziando todas as cadeias

Para esvaziar todas as cadeias, o que irá excluir todas as regras de firewall, use a opção -F, ou a opção ---flush equivalente, por si só:

  1. sudo iptables -F

Esvaziando todas as regras, excluindo todas as cadeias e aceitando tudo

Esta seção mostrará a você como esvaziar todas as suas regras de firewall, tabelas e cadeias, além de permitir todo o tráfego de rede.

Nota: isso desativará efetivamente o seu firewall. Você só deve seguir esta seção se quiser reiniciar a configuração do seu firewall.

Primeiro, defina as políticas padrão para cada uma das cadeias integradas como ACCEPT. A principal razão de se fazer isso é garantir que você não será bloqueado no servidor via SSH:

  1. sudo iptables -P INPUT ACCEPT
  2. sudo iptables -P FORWARD ACCEPT
  3. sudo iptables -P OUTPUT ACCEPT

Em seguida, esvazie as tabelas nat e mangle, esvazie todas as cadeias (-F) e exclua todas as cadeias não padrão (-X):

  1. sudo iptables -t nat -F
  2. sudo iptables -t mangle -F
  3. sudo iptables -F
  4. sudo iptables -X

Agora o firewall permitirá todo o tráfego de rede. Se você listar suas regras agora, verá que não existe nenhuma, e apenas as três cadeias padrão (INPUT, FORWARD e OUTPUT) permaneceram.

Conclusão

Depois de passar por este tutorial, você deve estar familiarizado em como listar e excluir suas regras de firewall do iptables.

Lembre-se de que quaisquer alterações do iptables através do comando iptables são efêmeras e precisam ser salvas para persistir após reinicializações do servidor. Isso é abordado na seção Regras de salvamento do tutorial de regras e comandos comuns de firewall.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


About the authors

Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


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!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel