Pesquisa de site

Como listar e excluir regras de firewall do Iptables


Introdução

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

Neste tutorial, abordaremos como executar as seguintes tarefas do iptables:

  • Regras de lista
  • Limpar os contadores de pacotes e bytes
  • Excluir regras
  • Flush chains (excluir todas as regras em uma chain)
  • Limpe todas as chains e tabelas, exclua todas as chains e aceite todo o tráfego

Nota: Ao trabalhar com firewalls, tome cuidado para não bloquear seu próprio servidor bloqueando o tráfego SSH (porta :22, por padrão). Se você perder o acesso devido às configurações do firewall, pode ser necessário conectar-se a ele por meio de um console fora de banda para corrigir o acesso.

Pré-requisitos

Este tutorial pressupõe que você esteja usando um servidor Linux com o comando iptables instalado e que seu usuário tenha privilégios sudo.

Se precisar de ajuda com esta configuração inicial, consulte nosso CentOS.

Listagem de Regras por Especificação

Vejamos como listar as regras primeiro. Existem duas maneiras diferentes de visualizar suas regras ativas do iptables: em uma tabela ou como uma lista de especificações de regras. Ambos os métodos fornecem aproximadamente as mesmas informações em formatos diferentes.

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 você pode ver, a saída se parece com os comandos que foram usados para criá-los, sem o comando iptables anterior. Isso também será semelhante aos arquivos de configuração de regras do iptables, se você já usou iptables-persistent ou iptables save.

Listando uma Cadeia Específica

Se você deseja limitar a saída a uma cadeia específica (INPUT, OUTPUT, TCP, etc.), você pode especificar o nome da cadeia diretamente após a opção -S. Por exemplo, para mostrar todas as especificações de regras na cadeia TCP, execute este 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 forma alternativa de visualizar as regras ativas do iptables: como uma tabela de regras.

Listando Regras como Tabelas

Listar as regras do iptables na exibição de tabela pode ser útil para comparar regras diferentes entre si. Para gerar todas as regras ativas do iptables em uma tabela, execute o comando iptables com a opção -L:

  1. sudo iptables -L

Isso produzirá todas as regras atuais classificadas por cadeia.

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

Vamos dar uma olhada em um exemplo de cadeia INPUT:

  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 de saída indica o nome da cadeia (INPUT, neste caso), seguido por sua política padrão (DROP). A próxima linha consiste nos cabeçalhos de cada coluna da tabela e é seguida pelas regras da cadeia. Vamos ver o que cada cabeçalho indica:

  • destino: Se um pacote corresponder à regra, o destino especifica o que deve ser feito com ele. Por exemplo, um pacote pode ser aceito, descartado, registrado ou enviado para outra cadeia para ser comparado com mais regras
  • prot: O protocolo, como tcp, udp, icmp ou all
  • opt: Raramente usado, esta coluna indica opções de IP
  • source: O endereço IP de origem ou sub-rede do tráfego, ou qualquer lugar
  • destination: O endereço IP de destino ou sub-rede do tráfego, ou qualquer lugar

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

Mostrando contagens de pacotes e tamanho agregado

Ao listar as 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 específica. Isso geralmente é útil ao tentar obter uma ideia aproximada de quais regras estão correspondendo aos pacotes. Para fazer isso, use as opções -L e -v juntas.

Por exemplo, vejamos a cadeia INPUT novamente, 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 você sabe como listar as regras de firewall ativas de várias maneiras, vamos ver como você pode redefinir os contadores de pacotes e bytes.

Redefinindo Contagens de Pacotes e Tamanho Agregado

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

Para limpar os contadores de todas as chains e regras, use a opção -Z sozinha:

  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 desejar limpar os contadores de 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 o seguinte:

  1. sudo iptables -Z INPUT 1

Agora que você sabe como redefinir o pacote iptables e os contadores de bytes, vamos ver os dois métodos que podem ser usados para excluí-los.

Excluindo Regras por Especificação

Uma das maneiras de excluir as regras do iptables é pela especificação da regra. Para fazer isso, você pode executar o comando iptables com a opção -D seguida da especificação da regra. Se você deseja excluir regras usando este método, você pode usar a saída da lista de regras, iptables -S, para obter ajuda.

Por exemplo, se você deseja excluir a regra que descarta pacotes de entrada inválidos (-A INPUT -m conntrack --ctstate INVALID -j DROP), você pode executar 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.

Exclusão de regras por cadeia e número

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

  1. sudo iptables -L --line-numbers
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 da linha a cada linha da regra, indicado pelo cabeçalho num.

Depois de saber qual regra deseja excluir, anote a cadeia e o número da linha da regra. Em seguida, execute o comando iptables -D seguido da cadeia e do número da regra.

Por exemplo, se quisermos excluir a regra de entrada que descarta pacotes inválidos, podemos ver que é a regra 3 da cadeia INPUT. Portanto, devemos executar este comando:

  1. sudo iptables -D INPUT 3

Agora que você sabe como excluir regras de firewall individuais, vamos ver como você pode descarregar cadeias de regras.

Correntes de Descarga

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

Aviso: Tenha cuidado para não bloquear seu servidor via SSH liberando uma cadeia com uma política padrão de drop ou deny. Se o fizer, pode ser necessário conectar-se a ele por meio do console para corrigir seu acesso.

Descarga de uma única corrente

Para liberar uma cadeia específica, que excluirá todas as regras da cadeia, você pode usar a opção -F ou a opção --flush equivalente e o nome de a corrente para lavar.

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

  1. sudo iptables -F INPUT

Liberando todas as cadeias

Para liberar todas as cadeias, o que excluirá todas as regras do firewall, você pode usar a opção -F ou a opção equivalente --flush:

  1. sudo iptables -F

Liberando todas as regras, excluindo todas as cadeias e aceitando todas

Esta seção mostrará como liberar todas as regras, tabelas e cadeias de firewall e permitir todo o tráfego de rede.

Aviso: Isso desativará efetivamente seu firewall. Você só deve seguir esta seção se quiser recomeçar a configuração do seu firewall.

Primeiro, defina as políticas padrão para cada uma das cadeias integradas como ACCEPT. O principal motivo para fazer isso é garantir que você não seja bloqueado do seu servidor via SSH:

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

Em seguida, limpe as tabelas nat e mangle, limpe todas as chains (-F) e exclua todas as chains 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

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

Conclusão

Depois de passar por este tutorial, você viu como listar e excluir suas regras de firewall iptables.

Lembre-se de que quaisquer alterações no iptables por meio do comando iptables são efêmeras e precisam ser salvas para persistir durante as reinicializações do servidor. Isso é abordado na seção Saving Rules do tutorial Common Firewall Rules and Commands.