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
:
- 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:
- 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
:
- 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
:
- sudo iptables -L INPUT
OutputChain 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 regrasprot
: O protocolo, comotcp
,udp
,icmp
ouall
opt
: Raramente usado, esta coluna indica opções de IPsource
: O endereço IP de origem ou sub-rede do tráfego, ouqualquer lugar
destination
: O endereço IP de destino ou sub-rede do tráfego, ouqualquer 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
:
- sudo iptables -L INPUT -v
OutputChain 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:
- 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:
- 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:
- 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 (
- 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
:
- sudo iptables -L --line-numbers
OutputChain 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:
- 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:
- 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
:
- 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:
- sudo iptables -P INPUT ACCEPT
- sudo iptables -P FORWARD ACCEPT
- 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
):
- sudo iptables -t nat -F
- sudo iptables -t mangle -F
- sudo iptables -F
- 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.