Bloquear Tráfego ICMP no Linux usando iptables

CompTIABeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá a utilizar o iptables, um poderoso utilitário de firewall via linha de comando no Linux, para bloquear o tráfego ICMP de entrada. Você configurará uma regra de firewall para descartar (drop) pacotes do protocolo ICMP, que é frequentemente utilizado pelo comando ping para testar a conectividade de rede. Esta é uma habilidade fundamental para proteger um sistema Linux, controlando o acesso à rede em nível de protocolo.

Você começará realizando uma varredura de rede preliminar com o nmap para avaliar as portas abertas do sistema. Em seguida, estabelecerá uma base de comparação usando o ping para verificar se o tráfego ICMP está inicialmente permitido. O núcleo do laboratório envolve a criação e aplicação de uma regra específica do iptables para descartar todos os pacotes ICMP de entrada. Por fim, você verificará se a regra está ativa e testará sua eficácia tentando realizar um ping na sua máquina novamente, confirmando que as requisições agora são bloqueadas com sucesso.

Este é um Laboratório Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para concluir cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 99%. Ele recebeu uma taxa de avaliação positiva de 98% dos alunos.

Escanear Portas TCP e UDP Abertas com nmap

Nesta etapa, você aprenderá a usar a ferramenta nmap para escanear seu próprio sistema em busca de portas de rede abertas. As portas de rede são os pontos finais de comunicação em um sistema operacional. Quando um programa deseja receber informações da rede, ele "escuta" em uma porta específica. Escanear portas abertas é um primeiro passo fundamental na avaliação da segurança de uma máquina, pois cada porta aberta representa um ponto de entrada potencial para um invasor.

Primeiro, você precisa instalar o nmap, pois ele não está incluído no ambiente base. É uma boa prática atualizar sua lista de pacotes antes de instalar novos softwares.

Execute o seguinte comando para atualizar a lista de pacotes:

sudo apt-get update

Agora, instale o nmap executando:

sudo apt-get install -y nmap

Você verá uma saída indicando que o nmap e suas dependências estão sendo instalados.

Em seguida, você precisa encontrar o endereço IP da sua máquina para informar ao nmap o que escanear. Você pode encontrar isso usando o comando ip.

ip addr show

Procure por uma entrada como eth0 ou ens33. Seu endereço IP estará listado ao lado de inet. Ele será algo parecido com 172.16.50.13/24.

Como identificar seu endereço IP a partir da saída:

  1. Procure pela interface que possui o estado state UP (geralmente eth0).
  2. Encontre a linha que começa com inet (não inet6).
  3. Pegue apenas a parte do endereço IP antes da barra / (ex: se você vir inet 172.16.50.13/24, seu endereço IP é 172.16.50.13).
  4. Ignore a interface de loopback (lo) com o IP 127.0.0.1.

Para o restante deste laboratório, usaremos <your_IP_address> como um marcador para o seu endereço IP real.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:04:c3:1d brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.13/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159940sec preferred_lft 1892159940sec
    inet6 fe80::216:3eff:fe04:c31d/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:1d:45:49:f8 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

Agora você está pronto para realizar sua primeira varredura. Vamos começar escaneando portas TCP (Transmission Control Protocol) abertas. O TCP é um protocolo orientado à conexão usado para muitos serviços comuns, como SSH (porta 22) e HTTP (porta 80). A opção -sT no nmap realiza uma varredura de conexão TCP.

Importante: Substitua <your_IP_address> pelo IP real que você encontrou na etapa anterior. Por exemplo, se o seu IP for 172.16.50.13, o comando seria nmap -sT 172.16.50.13.

Substitua <your_IP_address> pelo seu IP e execute o comando:

nmap -sT <your_IP_address>

A saída listará as portas que estão no estado "open" (aberta). Seu sistema provavelmente terá a porta SSH (22) aberta por padrão e pode ter serviços adicionais rodando em outras portas.

Starting Nmap 7.80 ( https://nmap.org ) at 2025-07-01 14:08 CST
Nmap scan report for iZrj93qpoj98oqswu96cqfZ (172.16.50.13)
Host is up (0.00013s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
3000/tcp open  ppp
3001/tcp open  nessus

Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds

Em seguida, vamos escanear portas UDP (User Datagram Protocol). O UDP é um protocolo sem conexão usado para serviços como DNS (porta 53) e DHCP (porta 67/68). Varreduras UDP podem ser mais lentas e menos confiáveis que as TCP. Usar sudo fornece melhores resultados para varreduras UDP. A opção -sU instrui o nmap a realizar uma varredura UDP.

Lembre-se: Substitua <your_IP_address> pelo seu endereço IP real.

Substitua <your_IP_address> pelo seu IP e execute o comando:

sudo nmap -sU <your_IP_address>

A saída pode mostrar portas como open|filtered. Isso significa que o nmap não consegue determinar se a porta está aberta ou se um firewall está bloqueando a varredura. Este é um resultado comum para varreduras UDP.

Starting Nmap 7.80 ( https://nmap.org ) at 2025-07-01 14:09 CST
Nmap scan report for iZrj93qpoj98oqswu96cqfZ (172.16.50.13)
Host is up (0.0000060s latency).
Not shown: 998 closed ports
PORT     STATE         SERVICE
68/udp   open|filtered dhcpc
5353/udp open|filtered zeroconf

Nmap done: 1 IP address (1 host up) scanned in 1.29 seconds

Ao concluir essas varreduras, você identificou com sucesso os serviços que estão aguardando conexões de rede em sua máquina.

Verificar a Conectividade de Rede Inicial com ping

Nesta etapa, você usará o comando ping para verificar se o seu sistema está respondendo a requisições de rede antes de implementar qualquer regra de firewall. O comando ping envia pacotes de "echo request" (solicitação de eco) do protocolo ICMP (Internet Control Message Protocol) para um host de destino. Se o host estiver acessível e configurado para responder, ele enviará de volta um pacote de "echo reply" (resposta de eco). Esta é uma forma fundamental de testar a conectividade básica de rede.

Antes de criarmos uma regra de firewall para bloquear esse tipo de tráfego, devemos primeiro confirmar que o tráfego está sendo permitido no momento. Isso garante que, quando testarmos nossa regra mais tarde, teremos certeza de que a regra é a causa do bloqueio, e não algum outro problema de rede pré-existente.

Faremos o ping para o endereço de "loopback", 127.0.0.1. Este endereço IP especial sempre aponta para a sua própria máquina, permitindo testar a pilha de rede local sem a necessidade de uma conexão externa ou mesmo de saber o endereço IP atribuído à sua máquina.

Para enviar apenas quatro pacotes e depois parar, usaremos a opção -c 4. Isso é importante porque, sem ela, o ping rodaria continuamente até que você o interrompesse manualmente com Ctrl+C.

Abra seu terminal e execute o seguinte comando:

ping -c 4 127.0.0.1

Você deve ver uma saída mostrando que quatro pacotes foram enviados e quatro foram recebidos, indicando que seu sistema está respondendo corretamente às solicitações ICMP.

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.055 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.052 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.053 ms

--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3070ms
rtt min/avg/max/mdev = 0.045/0.051/0.055/0.003 ms

A linha 0% packet loss confirma que a conexão está funcionando perfeitamente. Agora que você estabeleceu uma base de comparação, está pronto para configurar uma regra de firewall para bloquear exatamente esse tipo de comunicação.

Criar uma Regra de iptables para Descartar Pacotes ICMP

Nesta etapa, você configurará uma regra de firewall simples usando o iptables, o utilitário de linha de comando padrão para gerenciar regras de filtragem de pacotes de rede no kernel do Linux. Criaremos uma regra para bloquear o tráfego ICMP que você testou anteriormente com o comando ping.

O iptables funciona com um sistema de tabelas, cadeias (chains) e regras.

  • Tabelas: São coleções de cadeias para um propósito específico. A tabela mais comum é a filter, que é a padrão e usada para filtragem de pacotes.
  • Cadeias (Chains): São listas de regras que são verificadas em ordem. Para tráfego de entrada, a cadeia INPUT é utilizada.
  • Regras: Uma regra especifica critérios para um pacote (como seu protocolo ou endereço de origem) e um alvo (o que fazer com o pacote, ex: ACCEPT para aceitar ou DROP para descartar).

Primeiro, vamos examinar o conjunto atual de regras. Como o iptables modifica as configurações do kernel, você deve usar sudo. A opção -L lista as regras na tabela filter padrão.

sudo iptables -L

Você verá as três cadeias padrão: INPUT, FORWARD e OUTPUT. Neste ambiente, você pode notar que o Docker já criou algumas regras na cadeia FORWARD e adicionou cadeias personalizadas para a rede de containers. As cadeias INPUT e OUTPUT ainda estão usando a política padrão ACCEPT para o tráfego regular.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  anywhere             anywhere
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (1 references)
target     prot opt source               destination

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Agora, vamos adicionar uma regra para bloquear pacotes ICMP de entrada. Vamos anexar (-A) uma nova regra à cadeia INPUT.

O comando é construído da seguinte forma:

  • sudo iptables: O comando para gerenciar o firewall.
  • -A INPUT: Anexa uma regra à cadeia INPUT.
  • -p icmp: Esta regra se aplica a pacotes que usam o protocolo icmp.
  • -j DROP: Se um pacote corresponder, pula para o alvo DROP, que descarta silenciosamente o pacote sem enviar uma resposta.

Execute o seguinte comando para criar a regra:

sudo iptables -A INPUT -p icmp -j DROP

Este comando não produzirá nenhuma saída se for bem-sucedido. Você agora instruiu o firewall do kernel a descartar todos os pacotes ICMP de entrada de qualquer origem.

Verificar a Regra de Firewall e Testar o Bloqueio

Nesta etapa final, você confirmará que sua nova regra de firewall foi adicionada com sucesso e testará seu efeito tentando dar um ping no seu sistema novamente. Este processo de verificação é crítico na administração de redes para garantir que as políticas de segurança sejam implementadas corretamente.

Primeiro, vamos visualizar a lista de regras novamente para ver sua nova adição. Ao executar o mesmo comando de antes, você poderá ver o estado atual do firewall.

sudo iptables -L

Você deve agora ver sua nova regra listada sob a cadeia INPUT. A saída mostra claramente que pacotes correspondentes ao protocolo icmp serão enviados para o alvo DROP.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       icmp --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Agora que você confirmou que a regra está em vigor, vamos testá-la. Execute o mesmo comando ping que você usou na Etapa 2.

ping -c 4 127.0.0.1

Desta vez, você não verá respostas. O comando parecerá travar por alguns segundos e depois encerrará. A saída mostrará 100% packet loss. Este é o comportamento esperado porque o firewall do kernel está agora descartando silenciosamente os pacotes ICMP de entrada, exatamente como você instruiu.

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

--- 127.0.0.1 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3055ms

Você bloqueou com sucesso o tráfego ICMP! As regras que você cria com o iptables não são persistentes e serão apagadas após a reinicialização do sistema. No entanto, é uma boa prática saber como remover uma regra manualmente. Você pode fazer isso usando a flag -D (delete), especificando exatamente a mesma regra que você adicionou.

Vamos remover a regra para restaurar a conectividade.

sudo iptables -D INPUT -p icmp -j DROP

Para confirmar que a regra foi removida e a conectividade restaurada, execute o ping uma última vez.

ping -c 2 127.0.0.1

O ping deve agora ser bem-sucedido, confirmando que você removeu com sucesso a regra do firewall.

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.058 ms

--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1024ms
rtt min/avg/max/mdev = 0.048/0.053/0.058/0.005 ms

Resumo

Neste laboratório, você aprendeu como realizar o reconhecimento inicial de rede em um sistema Linux. Você começou instalando a ferramenta nmap para escanear portas TCP e UDP abertas após identificar o endereço IP da máquina. Em seguida, estabeleceu uma base de conectividade de rede usando o comando ping, que confirmou que o sistema estava recebendo e respondendo com sucesso ao tráfego ICMP.

O núcleo do laboratório envolveu o uso do utilitário de firewall iptables para manipular o tráfego de rede. Você construiu e aplicou uma regra específica à cadeia INPUT para descartar (DROP) todos os pacotes ICMP de entrada, bloqueando efetivamente ferramentas como o ping. Para concluir o processo, você verificou que a nova regra estava ativa listando o conjunto de regras atual do iptables e testou o bloqueio tentando realizar o ping na máquina novamente, confirmando que as requisições agora expiravam conforme o esperado.