Protocolo Neighbor Discovery (NDP) do IPv6: Como Dispositivos se Encontram
Mergulho profundo no NDP, o protocolo que substitui o ARP no IPv6. Aprenda sobre Router Solicitation, Neighbor Solicitation e como funciona a resolução de endereços.
NDP Substitui Mais Que Apenas ARP#
No IPv4, resolução de endereços usa ARP — um protocolo separado de camada 2. Router discovery usa ICMP Router Discovery ou DHCP. Mensagens redirect usam ICMP. Detecção de endereço duplicado não existe de forma alguma.
O IPv6 consolida todas essas funções no Neighbor Discovery Protocol. NDP manipula:
- Resolução de endereços (trabalho do ARP)
- Router discovery (encontrar gateways padrão)
- Prefix discovery (aprender prefixos de rede para autoconfiguração)
- Parameter discovery (MTU, hop limit)
- Autoconfiguração de endereços (SLAAC)
- Duplicate Address Detection (prevenir conflitos)
- Neighbor reachability (meu vizinho ainda está lá?)
- Next-hop determination (qual roteador devo usar?)
- Mensagens redirect (rotas melhores existem)
NDP roda inteiramente sobre ICMPv6, usando cinco tipos de mensagens (133-137). Não é opcional. Bloqueie NDP e o IPv6 para de funcionar.
TL;DR - Resumo rápido
Pontos-chave:
- NDP consolida ARP, router discovery e autoconfiguração num protocolo rodando sobre ICMPv6
- Cinco tipos de mensagens (133-137) lidam com tudo desde resolução de endereços a anúncios de router
- Segurança: Todas mensagens NDP requerem Hop Limit 255 para prevenir ataques off-link
Ir para: Router Advertisement para detalhes SLAAC, Resolução de Endereços em Ação para exemplos práticos, ou Troubleshooting para problemas comuns.
Os Cinco Tipos de Mensagens NDP#
Todas mensagens NDP são pacotes ICMPv6 com números de tipo específicos. Entender essas cinco mensagens significa entender como redes IPv6 operam no nível fundamental.
| Tipo | Nome | Enviado Por | Propósito | Destino |
|---|---|---|---|---|
| 133 | Router Solicitation (RS) | Hosts | Solicitar informação do roteador | ff02::2 (all-routers) |
| 134 | Router Advertisement (RA) | Roteadores | Anunciar presença e config | ff02::1 (all-nodes) ou unicast |
| 135 | Neighbor Solicitation (NS) | Qualquer nó | Resolução de endereços, alcançabilidade | Multicast solicited-node ou unicast |
| 136 | Neighbor Advertisement (NA) | Qualquer nó | Resposta a NS | Unicast ou ff02::1 |
| 137 | Redirect | Roteadores | Next-hop melhor existe | Unicast (remetente original) |
Toda mensagem NDP tem um requisito comum de segurança: Hop Limit deve ser 255. Isso previne ataques off-link porque roteadores decrementam hop limit. Pacotes de atacantes remotos chegam com hop limit < 255 e são descartados.
Router Solicitation (Type 133)#
Hosts enviam Router Solicitations quando querem que roteadores se anunciem imediatamente em vez de esperar pelo próximo Router Advertisement agendado.
Estrutura ICMPv6:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (133) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Campos:
- Type: 133
- Code: 0
- Reserved: 32 bits, deve ser zero
- Options: Source Link-Layer Address (opcional, incluir se endereço de origem não for ::)
Quando enviado:
- Interface sobe
- Host inicializa
- Stack IPv6 inicializa
- Host precisa de configuração rapidamente
Endereço de origem:
- Endereço link-local (se configurado)
- :: (não especificado, se sem endereço ainda)
Destino: ff02::2 (endereço multicast all-routers)
Hop Limit: 255 (obrigatório)
Pacote exemplo:
Cabeçalho IPv6:
Origem: fe80::a4b2:c3d4:e5f6:7890
Destino: ff02::2
Next Header: 58 (ICMPv6)
Hop Limit: 255
ICMPv6:
Type: 133 (Router Solicitation)
Code: 0
Options:
Source Link-Layer Address: 00:1a:2b:3c:4d:5eLimitação de taxa:
Hosts não devem enviar Router Solicitations muito frequentemente. RFC 4861 recomenda máximo um por 3 segundos. Isso previne flooding de roteadores durante instabilidade de rede.
Por que importa:
Sem RS, hosts esperariam por Router Advertisements periódicos (enviados a cada poucos minutos). RS permite que hosts obtenham configuração em segundos em vez de minutos, acelerando inicialização de rede.
Router Advertisement (Type 134)#
Roteadores enviam Router Advertisements para anunciar sua presença, anunciar prefixos de rede e fornecer parâmetros de configuração. Esta é a fundação do Stateless Address Autoconfiguration (SLAAC).
Estrutura ICMPv6:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (134) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Cur Hop Limit |M|O|H|Prf|Resvd| Router Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reachable Time |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Retrans Timer |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Campos:
Cur Hop Limit (8 bits): Valor recomendado para campo Hop Limit em pacotes de saída. Tipicamente 64. Hosts copiam isso em seu campo Hop Limit do cabeçalho IPv6.
Flags (8 bits):
- M (Managed Address Configuration): Use DHCPv6 para endereços
- O (Other Configuration): Use DHCPv6 para outra configuração (DNS, NTP, etc.)
- H (Home Agent): Roteador é um mobile IPv6 home agent (raramente usado)
- Prf (Router Preference): Preferência de 2 bits (00=médio, 01=alto, 11=baixo)
- Reserved: 3 bits
Router Lifetime (16 bits): Quanto tempo (em segundos) usar este roteador como gateway padrão. 0 significa «não é um roteador padrão». Máximo 9000 segundos (2,5 horas).
Reachable Time (32 bits): Quanto tempo (em milissegundos) considerar um vizinho alcançável após receber uma confirmação de alcançabilidade. 0 significa não especificado (use padrão ou valor recebido anteriormente).
Retrans Timer (32 bits): Tempo entre retransmissões de Neighbor Solicitations (em milissegundos). Usado para resolução de endereços e Neighbor Unreachability Detection.
Opções comuns:
Source Link-Layer Address (Type 1): Endereço MAC do roteador. Permite que hosts pulem Neighbor Solicitation para o roteador.
MTU (Type 5): MTU recomendado para o link. Tipicamente 1500.
Prefix Information (Type 3): Prefixos de rede para autoconfiguração de endereços. Esta é a opção crítica para SLAAC.
RDNSS (Type 25): Endereços de servidor DNS recursivo. RFC 8106.
DNSSL (Type 31): Lista de busca DNS. RFC 8106.
Quando enviado:
- Periodicamente (a cada 200-600 segundos, tipicamente 200)
- Em resposta a Router Solicitation
- Quando configuração do roteador muda
Origem: Endereço link-local do roteador (fe80::/10)
Destino:
- ff02::1 (multicast all-nodes) para anúncios periódicos
- Unicast para host solicitante quando respondendo a RS
Hop Limit: 255 (obrigatório)
Pacote exemplo:
Cabeçalho IPv6:
Origem: fe80::1
Destino: ff02::1
Next Header: 58 (ICMPv6)
Hop Limit: 255
ICMPv6:
Type: 134 (Router Advertisement)
Code: 0
Cur Hop Limit: 64
Flags: M=0, O=0 (apenas SLAAC)
Router Lifetime: 1800 segundos (30 minutos)
Reachable Time: 30000 ms
Retrans Timer: 1000 ms
Options:
Source Link-Layer Address: 00:11:22:33:44:55
MTU: 1500
Prefix Information:
Prefix: 2001:db8:1234:5678::/64
Valid Lifetime: 86400 (24 horas)
Preferred Lifetime: 14400 (4 horas)
Flags: L=1 (on-link), A=1 (autonomous/SLAAC)
RDNSS:
Lifetime: 3600
Addresses: 2001:4860:4860::8888, 2001:4860:4860::8844Combinações de flags:
| M | O | Comportamento |
|---|---|---|
| 0 | 0 | Apenas SLAAC, sem DHCPv6 (mais comum) |
| 0 | 1 | SLAAC para endereços, DHCPv6 para DNS/NTP/etc. |
| 1 | 0 | DHCPv6 para endereços (incomum, raramente usado) |
| 1 | 1 | DHCPv6 para tudo (redes enterprise) |
Opção Prefix Information:
Esta opção é o que torna SLAAC possível. Diz aos hosts qual prefixo de rede usar ao autoconfigurar endereços.
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Length | Prefix Length |L|A|R|Reserved1|
| (3) | (4) | | | | | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Valid Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Preferred Lifetime |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved2 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Prefix +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Campos:
- Prefix Length: Geralmente 64 para SLAAC
- L flag: On-link (prefixo está no link local)
- A flag: Autonomous (usar para SLAAC)
- R flag: Router Address (prefixo contém ID de interface do roteador)
- Valid Lifetime: Quanto tempo endereços são válidos (tipicamente 86400 = 24 horas)
- Preferred Lifetime: Quanto tempo usar endereços para novas conexões (tipicamente 14400 = 4 horas)
- Prefix: O prefixo de rede real (ex.: 2001:db8:1234:5678::)
Quando A=1, hosts geram endereços combinando o prefixo com um identificador de interface:
Prefixo do RA: 2001:db8:1234:5678::/64
ID de Interface: a4b2:c3d4:e5f6:7890 (derivado de MAC ou aleatório)
Endereço resultante: 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890Router Advertisements São Críticos
Bloqueie ICMPv6 type 134 e SLAAC para de funcionar. Hosts terão apenas endereços link-local (fe80::/10) sem conectividade global. Esta é uma das configurações erradas mais comuns do IPv6 — firewalls que bloqueiam todo ICMPv6 sem entender quais tipos são essenciais.
Neighbor Solicitation (Type 135)#
Neighbor Solicitation é o substituto do IPv6 para ARP. Resolve endereços IPv6 para endereços link-layer (MAC) e verifica se vizinhos ainda estão alcançáveis.
Estrutura ICMPv6:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (135) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Target Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Campos:
- Type: 135
- Code: 0
- Reserved: 32 bits, deve ser zero
- Target Address: Endereço IPv6 sendo consultado
- Options: Source Link-Layer Address (incluído a menos que origem seja ::)
Três casos de uso:
1. Resolução de Endereços (Substituto ARP)#
Host A precisa enviar um pacote para host B no mesmo link mas não conhece o endereço MAC de B.
Processo:
- A verifica seu cache de vizinho — sem entrada para B
- A envia NS para endereço multicast solicited-node de B
- B recebe NS e responde com NA contendo seu MAC
- A armazena o mapeamento em cache e envia o pacote original
Exemplo:
# Host A quer enviar para 2001:db8::10
Cabeçalho IPv6:
Origem: 2001:db8::1
Destino: ff02::1:ff00:10 (multicast solicited-node)
Hop Limit: 255
ICMPv6:
Type: 135 (Neighbor Solicitation)
Target Address: 2001:db8::10
Options:
Source Link-Layer Address: 00:1a:2b:3c:4d:5eCálculo de endereço multicast solicited-node:
IPv6 usa multicast solicited-node em vez de broadcast para eficiência. Apenas hosts com endereços similares escutam cada grupo solicited-node.
Fórmula: ff02::1:ff + últimos 24 bits do endereço alvo
Exemplos:
2001:db8::10 -> ff02::1:ff00:10
2001:db8::a4b2:c3d4:e5f6:7890 -> ff02::1:ff:f6:7890
fe80::1 -> ff02::1:ff00:1Isso reduz processamento desnecessário. No IPv4, broadcasts ARP alcançam todos hosts na rede. No IPv6, apenas hosts cujos endereços terminam com os mesmos 24 bits entram no grupo multicast e recebem o NS.
2. Neighbor Unreachability Detection (NUD)#
Verificar se um vizinho anteriormente alcançável ainda está alcançável.
Processo:
- Host não recebeu tráfego do vizinho recentemente
- Host envia NS (unicast) ao vizinho
- Se NA recebido, vizinho está alcançável
- Se sem resposta após tentativas, vizinho é considerado inalcançável
Exemplo:
Cabeçalho IPv6:
Origem: 2001:db8::1
Destino: 2001:db8::10 (unicast ao vizinho)
Hop Limit: 255
ICMPv6:
Type: 135 (Neighbor Solicitation)
Target Address: 2001:db8::10
Options:
Source Link-Layer Address: 00:1a:2b:3c:4d:5eNUD roda automaticamente em segundo plano. Quando hosts enviam tráfego, rastreiam se vizinhos respondem. Se um vizinho fica silencioso, NUD verifica alcançabilidade antes de declará-lo morto.
3. Duplicate Address Detection (DAD)#
Antes de usar um endereço IPv6, hosts executam DAD para garantir que nenhum outro nó está usando-o. Isso previne conflitos de endereços em SLAAC.
Processo:
- Host gera endereço tentativo (via SLAAC, DHCPv6 ou config manual)
- Host envia NS com origem :: e alvo = endereço tentativo
- Se alguém responde com NA, endereço já está em uso (conflito)
- Se sem resposta após timeout, endereço é único e pode ser usado
Exemplo:
# Host quer usar 2001:db8::a4b2:c3d4:e5f6:7890
# Envia NS DAD primeiro
Cabeçalho IPv6:
Origem: :: (endereço não especificado — host não tem endereço ainda)
Destino: ff02::1:ff:f6:7890 (multicast solicited-node)
Hop Limit: 255
ICMPv6:
Type: 135 (Neighbor Solicitation)
Target Address: 2001:db8::a4b2:c3d4:e5f6:7890
Options: (nenhuma — origem é ::)Se outro host está usando aquele endereço, ele envia um Neighbor Advertisement. O host solicitante detecta o conflito e deve escolher um endereço diferente.
Timeout DAD: Tipicamente 1 segundo. Host espera esse tempo por uma resposta. Se silencioso, o endereço é assumido único.
Problema de segurança: DAD não tem autenticação. Um atacante pode responder a toda solicitação DAD, prevenindo hosts de configurar endereços. Isso é chamado ataque DAD DoS. Soluções incluem SEND (Secure Neighbor Discovery) ou RA Guard, mas adoção é limitada.
Neighbor Advertisement (Type 136)#
Enviado em resposta a Neighbor Solicitation ou não solicitado para anunciar mudanças de endereço/link-layer.
Estrutura ICMPv6:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (136) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|R|S|O| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Target Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Campos:
Flags:
- R (Router): Remetente é um roteador
- S (Solicited): Anúncio é uma resposta a NS
- O (Override): Sobrescrever entrada existente em cache
Target Address: Endereço para o qual este anúncio é enviado
Options: Target Link-Layer Address (endereço MAC)
Quando enviado:
- Resposta a Neighbor Solicitation (S=1)
- Anúncio não solicitado de mudança de endereço (S=0)
- NA gratuito para atualizar vizinhos após mudança de endereço link-layer
Destino:
- Unicast ao nó solicitante (ao responder a NS)
- ff02::1 (all-nodes) para anúncios não solicitados
Hop Limit: 255 (obrigatório)
Exemplo de resposta a NS:
Cabeçalho IPv6:
Origem: 2001:db8::10
Destino: 2001:db8::1 (unicast ao solicitante)
Hop Limit: 255
ICMPv6:
Type: 136 (Neighbor Advertisement)
Flags: R=0, S=1 (resposta solicitada), O=1 (override)
Target Address: 2001:db8::10
Options:
Target Link-Layer Address: 00:aa:bb:cc:dd:eeSignificados de flags:
S=1: Esta é uma resposta ao seu NS. Atualize seu cache.
S=0: Anúncio não solicitado. Mudei algo.
O=1: Sobrescreva sua entrada existente em cache com esta info.
O=0: Apenas atualize cache se não existir entrada.
Exemplo NA não solicitado:
Host muda seu endereço MAC (raro, mas acontece com máquinas virtuais ou reconfiguração de interface). Ele envia NA não solicitado para atualizar vizinhos:
Cabeçalho IPv6:
Origem: 2001:db8::10
Destino: ff02::1 (all-nodes)
Hop Limit: 255
ICMPv6:
Type: 136 (Neighbor Advertisement)
Flags: R=0, S=0 (não solicitado), O=1 (override)
Target Address: 2001:db8::10
Options:
Target Link-Layer Address: 00:ff:ee:dd:cc:bb (novo MAC)Todos vizinhos recebem isso e atualizam seus caches.
Redirect (Type 137)#
Roteadores enviam mensagens Redirect para informar hosts que um roteador de primeiro hop melhor existe para um destino específico.
Estrutura ICMPv6:
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Type | Code | Checksum |
| (137) | (0) | |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Reserved |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Target Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| |
+ +
| |
+ Destination Address +
| |
+ +
| |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options ...
+-+-+-+-+-+-+-+-+-+-+-+-Campos:
- Type: 137
- Code: 0
- Target Address: Roteador next-hop melhor (ou destino se on-link)
- Destination Address: Destino que deve usar a rota melhor
- Options: Target Link-Layer Address, Redirected Header (porção do pacote original)
Quando enviado:
Roteador R1 recebe um pacote do Host A destinado ao Host B. R1 sabe que Roteador R2 (no mesmo link que A) é um next-hop melhor para B. R1 encaminha o pacote para R2 E envia um Redirect para A dizendo-lhe para usar R2 diretamente no futuro.
Cenário exemplo:
Topologia de rede:
Host A: 2001:db8:1::10
Roteador R1: 2001:db8:1::1 (gateway padrão para A)
Roteador R2: 2001:db8:1::2 (rota melhor para 2001:db8:2::/64)
Destino B: 2001:db8:2::20
Fluxo:
1. A envia pacote para B via R1 (gateway padrão)
2. R1 vê que R2 é um next-hop melhor para 2001:db8:2::/64
3. R1 encaminha pacote para R2
4. R1 envia Redirect para A:
Target Address: 2001:db8:1::2 (R2)
Destination Address: 2001:db8:2::20 (B)
5. A atualiza tabela de roteamento: use R2 para 2001:db8:2::/64
6. Pacotes futuros de A para B vão diretamente para R2Mensagem Redirect de R1 para A:
Cabeçalho IPv6:
Origem: fe80::1 (link-local de R1)
Destino: 2001:db8:1::10 (Host A)
Hop Limit: 255
ICMPv6:
Type: 137 (Redirect)
Target Address: fe80::2 (R2 — next-hop melhor)
Destination Address: 2001:db8:2::20 (B — destino para alcançar via R2)
Options:
Target Link-Layer Address: 00:11:22:33:44:55 (MAC de R2)
Redirected Header: (cabeçalho do pacote original que acionou redirect)Considerações de segurança:
Mensagens Redirect podem ser abusadas. Um atacante no link local poderia enviar Redirects maliciosos para:
- Rotear tráfego através da máquina do atacante (man-in-the-middle)
- Fazer blackhole de tráfego redirecionando para roteador inexistente
- Criar loops de roteamento
Proteções:
- SEND (Secure Neighbor Discovery) autentica mensagens Redirect
- Muitos hosts ignoram Redirects de roteadores não-default-gateway
- Algumas redes conscientes de segurança desabilitam processamento de Redirect inteiramente
- Redirects devem vir do roteador de primeiro hop atual (verificado por hosts)
Você deve permitir Redirects?
Redes domésticas/pequenas: Seguro. Otimiza roteamento quando múltiplos roteadores existem.
Redes enterprise: Frequentemente desabilitado. Tabelas de roteamento controladas e riscos potenciais de segurança superam benefícios.
Data centers: Geralmente desabilitado. Roteamento estático ou protocolos dinâmicos (BGP, OSPF) gerenciam rotas.
Resolução de Endereços em Ação#
Vamos rastrear o processo completo do Host A enviando um pacote para Host B no mesmo link.
Estado inicial:
- Host A: 2001:db8::1 (MAC: aa:aa:aa:aa:aa:aa)
- Host B: 2001:db8::10 (MAC: bb:bb:bb:bb:bb:bb)
- Cache de vizinho de A está vazio
Passo 1: Aplicação inicia conexão
# No Host A
ping6 2001:db8::10Passo 2: Verificar cache de vizinho
# A verifica cache de vizinho
ip -6 neigh show 2001:db8::10
# (vazio — sem entrada)Passo 3: Enviar Neighbor Solicitation
A envia NS para endereço multicast solicited-node:
Cabeçalho IPv6:
Origem: 2001:db8::1
Destino: ff02::1:ff00:10 (solicited-node para 2001:db8::10)
Hop Limit: 255
Cabeçalho Ethernet:
MAC Origem: aa:aa:aa:aa:aa:aa
MAC Destino: 33:33:ff:00:00:10 (MAC multicast para ff02::1:ff00:10)
ICMPv6:
Type: 135 (Neighbor Solicitation)
Target Address: 2001:db8::10
Options:
Source Link-Layer Address: aa:aa:aa:aa:aa:aaPasso 4: B recebe NS
Host B está escutando ff02::1:ff00:10 (porque seu endereço termina com :10). Ele recebe o NS e processa.
Passo 5: B envia Neighbor Advertisement
Cabeçalho IPv6:
Origem: 2001:db8::10
Destino: 2001:db8::1 (unicast para A)
Hop Limit: 255
Cabeçalho Ethernet:
MAC Origem: bb:bb:bb:bb:bb:bb
MAC Destino: aa:aa:aa:aa:aa:aa
ICMPv6:
Type: 136 (Neighbor Advertisement)
Flags: R=0, S=1 (solicitado), O=1 (override)
Target Address: 2001:db8::10
Options:
Target Link-Layer Address: bb:bb:bb:bb:bb:bbPasso 6: A atualiza cache de vizinho
# Cache de vizinho de A agora tem entrada
ip -6 neigh show 2001:db8::10
# 2001:db8::10 dev eth0 lladdr bb:bb:bb:bb:bb:bb REACHABLEPasso 7: A envia pacote original
Agora que A conhece o MAC de B, envia o pacote ping:
Cabeçalho IPv6:
Origem: 2001:db8::1
Destino: 2001:db8::10
Cabeçalho Ethernet:
MAC Origem: aa:aa:aa:aa:aa:aa
MAC Destino: bb:bb:bb:bb:bb:bb (aprendido de NA)
ICMPv6:
Type: 128 (Echo Request)Tempo total: Milissegundos. O processo é invisível para aplicações.
Estados de Cache de Vizinho#
Entradas de cache de vizinho passam por vários estados conforme NUD rastreia alcançabilidade.
| Estado | Significado | Próxima Ação |
|---|---|---|
| INCOMPLETE | NS enviado, esperando NA | Timeout ou receber NA |
| REACHABLE | NA recebido recentemente, confirmado alcançável | Enviar tráfego ou timeout |
| STALE | Entrada antiga, não confirmada recentemente | Enviar tráfego (aciona probe) |
| DELAY | Tráfego enviado para entrada stale, esperando | Timeout aciona probe |
| PROBE | Enviando NS para verificar alcançabilidade | Receber NA ou timeout |
| FAILED | Sem resposta a probes | Remover entrada |
Transições de estado:
INCOMPLETE --NA recebido--> REACHABLE
REACHABLE --timeout--> STALE
STALE --tráfego enviado--> DELAY
DELAY --timeout--> PROBE
PROBE --NA recebido--> REACHABLE
PROBE --timeout--> FAILEDVerificar cache de vizinho (Linux):
ip -6 neigh show
# Exemplo de saída:
# 2001:db8::1 dev eth0 lladdr aa:aa:aa:aa:aa:aa REACHABLE
# 2001:db8::10 dev eth0 lladdr bb:bb:bb:bb:bb:bb STALE
# fe80::1 dev eth0 lladdr cc:cc:cc:cc:cc:cc DELAYTimers:
- Timeout REACHABLE: 30 segundos (configurável, do RA Reachable Time)
- Timeout DELAY: 5 segundos antes de transicionar para PROBE
- Intervalo de retransmissão: 1 segundo (configurável, do RA Retrans Timer)
- MAX_MULTICAST_SOLICIT: 3 tentativas antes de declarar FAILED
Estes garantem que vizinhos mortos são detectados rapidamente enquanto minimizam tráfego NUD desnecessário.
SLAAC: Autoconfiguração de Endereços#
Combinando Router Advertisements com Duplicate Address Detection cria Stateless Address Autoconfiguration. Hosts se configuram sem servidores DHCP.
Processo SLAAC completo:
Passo 1: Interface sobe
Host habilita IPv6 na interface eth0.
Passo 2: Gerar endereço link-local
fe80:: + identificador de interface
fe80::a4b2:c3d4:e5f6:7890 (se usando IID derivado de MAC)
fe80::1234:5678:9abc:def0 (se usando IID aleatório)Passo 3: Executar DAD em link-local
Envia NS com origem :: para verificar se endereço fe80:: é único.
Passo 4: Enviar Router Solicitation
Cabeçalho IPv6:
Origem: fe80::a4b2:c3d4:e5f6:7890
Destino: ff02::2
Hop Limit: 255
ICMPv6:
Type: 133 (Router Solicitation)Passo 5: Receber Router Advertisement
ICMPv6:
Type: 134 (Router Advertisement)
Flags: M=0, O=0 (SLAAC)
Prefix Information:
Prefix: 2001:db8:1234:5678::/64
Flags: A=1 (autonomous)
Valid Lifetime: 86400
Preferred Lifetime: 14400Passo 6: Gerar endereço global
Prefixo: 2001:db8:1234:5678::/64
IID: a4b2:c3d4:e5f6:7890
Resultado: 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890Passo 7: Executar DAD em endereço global
Envia NS para verificar se 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890 é único.
Passo 8: Configurar endereço
ip -6 addr show eth0
# Saída:
# inet6 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890/64 scope global dynamic
# inet6 fe80::a4b2:c3d4:e5f6:7890/64 scope linkPasso 9: Definir rota padrão
Usa endereço link-local do roteador como gateway padrão:
ip -6 route show
# Saída:
# default via fe80::1 dev eth0 metric 1024
# 2001:db8:1234:5678::/64 dev eth0 proto kernel metric 256Tempo total: Alguns segundos.
Extensões de Privacidade (RFC 4941):
IDs de interface derivados de MAC são rastreáveis através de redes. Extensões de Privacidade geram IIDs aleatórios que mudam periodicamente.
Original: 2001:db8:1234:5678:a4b2:c3d4:e5f6:7890 (estático)
Privacidade: 2001:db8:1234:5678:1a2b:3c4d:5e6f:7a8b (muda diariamente)A maioria dos OSes modernos habilita extensões de privacidade por padrão para conexões de saída enquanto mantém o endereço estável para conexões de entrada.
Considerações de Segurança#
NDP tem vulnerabilidades porque foi projetado assumindo redes locais confiáveis. Atacantes no mesmo link podem:
Router Advertisements Desonestos#
Atacante envia RAs falsos com:
- Gateway padrão diferente (man-in-the-middle)
- Lifetimes mais curtos (DoS forçando reconfiguração constante)
- Servidores DNS maliciosos
- Prefixos inválidos
- RAs excessivos inundando a rede
Impacto: clientes reconfiguram automaticamente, enviando tráfego através do sistema do atacante ou perdendo conectividade inteiramente.
Mitigação:
- RA Guard: Característica de switch que bloqueia RAs de portas não-roteador
- SEND (Secure Neighbor Discovery): Autenticação criptográfica (complexo, raramente implantado)
- Preferência de roteador: Use valores de alta preferência em roteadores legítimos
Poisoning de Cache de Vizinho#
Atacantes enviam Neighbor Advertisements falsificados reivindicando propriedade do endereço IPv6 de outro dispositivo. A rede atualiza seu cache de vizinho com o endereço MAC do atacante.
Legítimo: 2001:db8::100 → MAC aa:bb:cc:dd:ee:ff
Ataque: 2001:db8::100 → MAC 11:22:33:44:55:66 (atacante)Resultado: tráfego destinado ao host legítimo vai para o atacante.
Esta é a versão IPv6 do poisoning ARP. Mesmo conceito de ataque, protocolo diferente.
Ataques DAD#
Quando um nó configura um endereço IPv6 via SLAAC, executa DAD — enviando Neighbor Solicitations para verificar que nenhum outro dispositivo usa aquele endereço. Se recebe um Neighbor Advertisement reivindicando aquele endereço, o nó recusa configurá-lo.
Atacantes respondem a toda tentativa DAD, prevenindo nós legítimos de obter endereços. Sua rede se enche de logs «IPv6: DAD failed» e dispositivos não conseguem endereços.
Mitigação:
- SEND: Autentica mensagens DAD
- Limitação de taxa: Limitar NAs de fonte única
- Endereços estáticos: Ignorar SLAAC inteiramente (não escalável)
Ataques Redirect#
Atacante envia Redirects falsos roteando fluxos de tráfego através do atacante.
Impacto: Man-in-the-middle, intercepção de tráfego.
Mitigação:
- Desabilitar Redirects: Muitos OSes permitem desabilitar processamento de Redirect
- SEND: Autentica Redirects
- Verificar origem: Hosts devem verificar que Redirects vêm do roteador de primeiro hop atual
Realidade: A maioria das redes não usa SEND devido à complexidade. RA Guard em switches é a defesa prática para redes enterprise.
Troubleshooting de Problemas NDP#
Host não tem endereço global#
Sintomas:
- Apenas endereços fe80::
- Pode fazer ping link-local, não global
- Sem rota padrão
Diagnóstico:
# Verifique Router Advertisements
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] == 134'
# Verifique aceitação RA
sysctl net.ipv6.conf.eth0.accept_ra
# Deve ser 1 ou 2 para hosts
# Envie RS manualmente
rdisc6 eth0Causas comuns:
- Sem roteador no link
- Firewall bloqueando type 134
- accept_ra desabilitado
- Encaminhamento IPv6 habilitado (desabilita processamento RA)
Correção: Habilite roteador, permita ICMPv6 type 134, defina accept_ra=1.
Cache de vizinho sempre FAILED#
Sintomas:
- Não consegue alcançar vizinhos
- NS enviado mas nenhum NA recebido
- Cache de vizinho mostra FAILED
Diagnóstico:
# Assista troca NS/NA
sudo tcpdump -i eth0 -vv 'icmp6 && (ip6[40] == 135 || ip6[40] == 136)'
# Verifique cache de vizinho
ip -6 neigh show
# NS manual (ferramenta ndisc6 Linux)
ndisc6 2001:db8::10 eth0Causas comuns:
- Firewall bloqueando types 135/136
- IPv6 desabilitado no host alvo
- Switch filtrando multicast
- Link errado (alvo em subnet diferente)
Correção: Permita NDP através de firewalls, verifique IPv6 habilitado no alvo.
Falhas DAD#
Sintomas:
- Endereço mostra «dadfailed»
- Interface não consegue configurar endereço
- Logs do kernel mostram conflitos DAD
Diagnóstico:
# Verifique status do endereço
ip -6 addr show eth0
# Exemplo de saída com falha DAD:
# inet6 2001:db8::10/64 scope global tentative dadfailed
# Verifique duplicata
ping6 -c 1 2001:db8::10Causas comuns:
- Outro host usando o mesmo endereço
- Atacante falsificando NA (DAD DoS)
- Máquinas virtuais com endereços MAC clonados
Correção: Mude endereço, investigue hosts duplicados, verifique configuração VM.
Exemplos Práticos com Ferramentas#
Monitorando NDP com tcpdump#
# Todo tráfego NDP
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] >= 133 && ip6[40] <= 137'
# Apenas Router Advertisements
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] == 134'
# Resolução de endereços (NS/NA)
sudo tcpdump -i eth0 -vv 'icmp6 && (ip6[40] == 135 || ip6[40] == 136)'
# Filtre por endereço alvo
sudo tcpdump -i eth0 -vv 'icmp6 && ip6[40] == 135' | grep '2001:db8::10'Gerenciamento manual de cache de vizinho#
# Mostre todos vizinhos
ip -6 neigh show
# Mostre vizinho específico
ip -6 neigh show 2001:db8::10
# Delete entrada (forçar re-resolução)
sudo ip -6 neigh del 2001:db8::10 dev eth0
# Adicione entrada estática
sudo ip -6 neigh add 2001:db8::10 lladdr aa:bb:cc:dd:ee:ff dev eth0Testando SLAAC#
# Limpe endereços
sudo ip -6 addr flush dev eth0
# Re-habilite IPv6
sudo sysctl -w net.ipv6.conf.eth0.disable_ipv6=0
# Assista autoconfiguração
ip -6 addr show eth0
ip -6 route showArtigos Relacionados#
- ICMPv6 Explicado - NDP roda sobre ICMPv6. Entenda o protocolo subjacente.
- Tipos de Endereços IPv6 - Aprenda sobre link-local, multicast solicited-node e outros tipos de endereços usados por NDP.
- Segurança IPv6 - Proteja NDP contra ataques permitindo funcionalidade essencial.
Teste NDP em Ação
Use nossa ferramenta Ping para acionar resolução de endereços e Traceroute para ver como hosts descobrem roteadores next-hop.
Perguntas Frequentes#
Por que NDP usa multicast em vez de broadcast como ARP?
Multicast é mais eficiente. Broadcasts ARP atingem todos hosts na rede — todos devem processar o frame mesmo se não forem o alvo. NDP usa endereços multicast solicited-node computados do endereço IPv6 do alvo. Apenas hosts com endereços correspondentes entram naquele grupo multicast e recebem o pacote. Hosts filtram multicasts não correspondentes em hardware (NIC), reduzindo carga de CPU. Em redes grandes com milhares de hosts, isso faz uma diferença significativa de desempenho.
Posso desabilitar NDP como posso desabilitar ARP?
Não. NDP é obrigatório para operação IPv6. Manipula resolução de endereços, router discovery e autoconfiguração. Desabilite NDP e IPv6 para de funcionar inteiramente. Diferente do IPv4 onde você pode usar entradas ARP estáticas, IPv6 requer NDP para Router Advertisements (que fornecem gateways padrão e prefixos). Mesmo com vizinhos estáticos, você não teria forma de aprender roteadores ou autoconfigurar endereços.
Como Duplicate Address Detection previne conflitos?
Antes de usar qualquer endereço, hosts enviam um Neighbor Solicitation com endereço de origem :: (não especificado) e alvo definido para o endereço que querem usar. Se outro host já está usando aquele endereço, ele responde com um Neighbor Advertisement. O host solicitante vê a resposta, detecta o conflito e deve escolher um endereço diferente. Se não chega resposta dentro de ~1 segundo, o endereço é assumido único. DAD roda para endereços tanto link-local quanto globais.
O que são endereços multicast solicited-node?
Endereços multicast solicited-node são derivados dos últimos 24 bits de um endereço IPv6 usando a fórmula ff02::1:ff:XX:XXXX. Todo endereço IPv6 automaticamente entra em seu grupo multicast solicited-node correspondente. Ao realizar resolução de endereços, o remetente envia NS para o endereço solicited-node em vez de broadcast. Apenas hosts com endereços terminando nos mesmos 24 bits recebem. Isso reduz processamento desnecessário comparado ao ARP baseado em broadcast.
Por que pacotes NDP devem ter Hop Limit 255?
Segurança. NDP legítimo sempre origina no link local e define Hop Limit como 255. Roteadores decrementam Hop Limit ao encaminhar, então pacotes de atacantes remotos chegam com Hop Limit < 255. Ao rejeitar pacotes NDP com Hop Limit != 255, hosts protegem contra atacantes off-link enviando Router Advertisements, Neighbor Advertisements ou Redirects falsificados. Esta verificação simples previne muitos ataques remotos sem requerer autenticação complexa.
Devo fazer deploy de SEND (Secure Neighbor Discovery)?
Provavelmente não. SEND fornece autenticação criptográfica para NDP usando criptografia de chave pública, prevenindo ataques de spoofing. Em teoria é ótimo. Na prática é complexo, requer infraestrutura PKI, tem suporte pobre em OS e adiciona latência para operações sensíveis a tempo como resolução de endereços. A maioria das redes usa mitigações mais simples: RA Guard em switches (bloqueia RAs de portas não-roteador), monitoramento para RAs desonestos e segurança física/link-layer. SEND é adequado para ambientes de alta segurança dispostos a investir na infraestrutura e complexidade.