Informática Numaboa - Linux
Bloqueando o PING
Qui 26 Fev 2009 13:11 |
- Detalhes
- Categoria: Como fazer segurança
- Atualização: Quinta, 26 Fevereiro 2009 17:05
- Autor: vovó Vicki
- Acessos: 24108
O PING é um programa que testa se um nó de rede está respondendo, ou seja, se a máquina chamada está "viva". Excelente ferramenta para os administradores de rede, mas um perigo potencial quando fica disponível para todos. Neste pequeno tutorial vou mostrar como lidar com o PING.
O que é o PING
O PING é um programa que envia uma série de pacotes para uma rede ou para a Internet procurando uma máquina específica com o propósito de gerar uma resposta da máquina visada. O computador alvo deve responder com um acknowledgment (confirmação de recebimento) para cada pacote recebido. Este programa foi criado para verificar se um computador específico existe e está conectado a uma rede.
Corre a história de que o nome ping foi inspirado no som emitido por sonares de submarino; outros afirmam que o emissor lança um ping e que o alvo responde com um pong, lembrando o jogo de pingue-pongue e ainda tem quem jura que vem de Packet Internet Groper. Fábulas da turma da rede?
O PING usa pacotes ICMP (Internet Control Message Protocol). O pacote do computador de origem é chamado de ICMP_echo_request - solicitação de eco ICMP - e a resposta do computador alvo é chamada de ICMP_echo_reply - resposta de eco ICMP. Por padrão, cada pacote contém 32 ou 64 bits de dados e 8 bytes de informação de leitura de protocolo. Acontece que o PING pode ser configurado para usar pacotes de tamanhos diferentes... e aí é que está um dos perigos!
Como usar o PING
Na linha de comando, digite ping seguido de um endereço IP qualquer. Para parar o ping, digite [Crtl + C]:
# ping 189.19.3.112 PING 189.19.3.112 (189.19.3.112) 56(84) bytes of data. 64 bytes from 189.19.3.112: icmp_seq=1 ttl=48 time=32.9 ms 64 bytes from 189.19.3.112: icmp_seq=2 ttl=48 time=33.9 ms 64 bytes from 189.19.3.112: icmp_seq=3 ttl=48 time=72.6 ms 64 bytes from 189.19.3.112: icmp_seq=4 ttl=48 time=34.0 ms 64 bytes from 189.19.3.112: icmp_seq=5 ttl=48 time=41.7 ms 64 bytes from 189.19.3.112: icmp_seq=6 ttl=48 time=52.2 ms 64 bytes from 189.19.3.112: icmp_seq=7 ttl=48 time=34.6 ms --- 189.19.3.112 ping statistics --- 7 packets transmitted, 7 received, 0% packet loss, time 6060ms rtt min/avg/max/mdev = 32.937/43.161/72.650/13.629 ms
Observe que o PING vai mostrando cada pacote recebido de volta indicando a sequência de recebimento (no exemplo as respostas foram recebidas na sequência certa, de icmp_seq=1 até icmp_seq=7), o ttl (time to live = tempo de vida do pacote) e o tempo que levou para a resposta chegar. No final, vem a estatística que mostra que 7 pacotes foram transmitidos, 7 foram recebidos, houve 0% de perda de pacotes e o tempo total foi de 6060 milisegundos. Mostra também a resposta mais rápida (32.937 ms), a média (43.161 ms), a resposta mais demorada (72.650 ms) e o desvio padrão (13.629 ms).
Uma porção de informações sobre o comportamento da máquina alvo e sobre as rotas que os pacotes percorreram - algumas melhores e outras não tão boas.
Os perigos do PING
Imagine que você aponte o ping para um servidor e deixa o barco correr. Enquanto você não interromper o programa, sua máquina pode gerar milhares (e até milhões) de pacotes que vão ficar bombardeando o alvo.
Vamos piorar um pouco o cenário brincando com o tamanho dos pacotes enviados. Deliberadamente vamos criar pacotes com mais de 65.536 bytes, o tamanho limite antes do pacote ser fragmentado. Para cada pacote deste tipo, o alvo vai receber no mínimo dois fragmentos do pacote, terá que recompor o pacote original e tentar dar a confirmação de recebimento. Este é o chamado Ping da morte (ping of death).
Até o final de 1997, o ping da morte pegava os sistemas operacionais de calças curtas. A máquina não sabia o que fazer com estes pacotes enormes e acabava pendurando, caindo ou rebootando. Este ataque DoS (Denial of Service - Negação de Serviço) ficou famoso pelo enorme estrago que causou antes que os sistemas operacionais pudessem ser melhorados para enfrentar este tipo de ameaça. Hoje em dia este ataque, também conhecido como long ICMP, é uma raridade (se é que ainda funciona). Então, por que se preocupar?
Por dois motivos:
- porque não tem sentido deixar uma máquina minha responder para qualquer outra pessoa a não ser eu
- e porque as criaturas das trevas podem descobrir mais alguma brecha de segurança e a coisa ficar preta novamente :fear:
Para mim, isto basta. É por este motivo que todos os meus servidores NÃO respondem a um PING. Só "ligo" o PING quando estou testando uma máquina; depois de pronta, "desligo" rapidinho. Veja como é fácil fazer isto.
Bloqueando/Desbloqueando o PING
Usando o sysctl
Existe um arquivo chamado sysctl.conf que geralmente está no diretório /etc (/etc/sysctl.conf). Para bloquear o PING, adicione neste arquivo estas duas linhas:
net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_echo_ignore_all = 1
Para ativar a nova configuração, chame o sysctl com a opção -p:
# sysctl -p ... net.ipv4.icmp_echo_ignore_broadcasts = 1 net.ipv4.icmp_echo_ignore_all = 1
Confira se realmente o PING está bloqueado. Aqui vou dar uma dica esquisita: vamos dar um ping no localhost! Parece bobeira, mas não é. Como qualquer outra máquina da rede, se o PING estiver ativo, o localhost responde para ele mesmo; se não, ele não responde.
# ping -c 5 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data. --- 127.0.0.1 ping statistics --- 5 packets transmitted, 0 received, 100% packet loss, time 4017ms
-c 5 diz ao ping para enviar apenas 5 pacotes.
Se a máquina for reinicializada, estas informações não são perdidas.
Para desbloquear o PING, basta trocar o valor de net.ipv4.icmp_echo_ignore_broadcasts e de net.ipv4.icmp_echo_ignore_al de 1 para 0 e ativar a nova configuração com um sysctl -p. Não gosto de simplesmente eliminar as linhas porque mais tarde, quando quiser bloquear novamente o PING, não vou conseguir lembrar das diretivas... coisas de vó esquecida :blush:
Usando o iptables
Outra forma de bloquear pacotes do PING é colocando regras no iptables específicas para este protocolo. Podemos bloquear qualquer pacote ICMP para todas as requisições, bloquear pacotes específicos para todas as requisições ou até abrir o PING para determinadas máquinas e fechar para todas as outras.
Exemplo 1: bloquear totalmente o ICMP.
# iptables -A INPUT -p icmp -j DROP
Neste caso, nenhum pacote ICMP é aceito pelo computador chamado. Nem o ping 127.0.0.1 será respondido, pois o localhost também entra nesta regra do iptables.
Exemplo 2: bloquear apenas os pacotes ICMP do tipo echo-request.
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
Exemplo 3: liberar para uma máquina e bloquear para todas as outras.
# iptables -A INPUT -s 10.20.30.40 -p icmp -j ACCEPT # iptables -A INPUT -p icmp -j DROP
A permissão para a máquina cujo endereço IP é 10.20.30.40 precisa vir antes da regra que bloqueia todas as outras solicitações via ICMP.
Lembre-se de que as regras do iptables não sobrevivem a um reboot. Se você quiser torná-las "permanentes" é preciso criar um shell script que insere as regras desejadas no iptables e chamar este script no boot.
Para descobrir quais são os tipos de pacotes ICMP chame iptables -p icmp -h
É isso aí, pessoal. Abraço da vó Vicki