05 - Flags e Fragmentação
video: https://youtu.be/... no frontmatter da nota.Flags e Fragmentação
1. Definição do Campo Flags
O campo Flags é um conjunto de 3 bits localizado no cabeçalho do datagrama IPv4, logo após o campo de Identification e antes do Fragment Offset. Sua função exclusiva é controlar o comportamento da fragmentação e auxiliar na reordenação e remontagem dos pacotes no destino final.
A fragmentação é um processo necessário quando um datagrama IP é maior que a unidade máxima de transferência (MTU) de uma rede física pela qual ele precisa passar. O campo Flags, em conjunto com o Identification e o Fragment Offset, fornece as instruções críticas para que os roteadores saibam se podem partir o pacote e para que o host de destino saiba como juntar as peças novamente.
Os três bits são numerados de 0 a 2 (da esquerda para a direita, dentro do byte), mas apenas os dois últimos têm funções ativas definidas no protocolo atual. Juntos com o campo Fragment Offset (13 bits), eles ocupam 32 bits (4 bytes) do cabeçalho IPv4 base.
2. Bit 0: Reservado (Reserved Bit)
- Posição: Bit mais significativo do campo de 3 bits.
- Valor: Deve ser 0.
- Função: Este bit não possui utilidade atual no protocolo IPv4 padrão. Ele foi originalmente reservado para uso futuro, mas a convenção padrão exige que seja definido como zero na transmissão e ignorado na recepção.
- Implicação: Roteadores e hosts descartam ou tratam como inválidos pacotes que tenham este bit definido como 1, a menos que estejam usando implementações proprietárias ou experimentais específicas (o que é raro e incompatível com a Internet pública).
3. Bit 1: DF (Don't Fragment - Não Fragmentar)
Este é o bit de controle de permissão. Ele dá poder ao remetente para proibir a fragmentação do datagrama.
- Valor 0 (Fragmentação Permitida): Se este bit estiver desligado (0), o roteador tem permissão para fragmentar o datagrama caso ele seja maior que a MTU do próximo enlace. É o comportamento padrão para tráfego comum.
- Valor 1 (Não Fragmentar): Se este bit estiver ligado (1), o roteador não pode fragmentar o pacote sob nenhuma circunstância.
- Consequência da Violação: Se um roteador precisa encaminhar um datagrama com o bit DF=1, mas o tamanho do pacote excede a MTU do enlace de saída, o roteador descarta o pacote.
- Notificação (ICMP): Ao descartar o pacote, o roteador deve enviar uma mensagem de erro ICMP de volta ao remetente (Tipo 3, Código 4: Destination Unreachable / Fragmentation Needed and DF Set). O pacote ICMP carrega o valor da MTU do próximo salto, permitindo que o emissor ajuste o tamanho do próximo pacote (mecanismo definido na RFC 1191).
- Aplicação Prática (PMTUD): Este mecanismo é a base da Descoberta do MTU do Caminho (Path MTU Discovery - PMTUD). Um host envia pacotes com DF=1. Se o pacote chegar, o MTU é adequado. Se receber um erro ICMP, o host reduz o tamanho do pacote e tenta novamente. Isso evita a ineficiência da fragmentação no meio do caminho, delegando o trabalho de ajuste de tamanho para as pontas.
PMTUD e Black Holes
Quando o ICMP Type 3 Code 4 é bloqueado por um firewall, o host nunca descobre que deve reduzir o tamanho do pacote, criando um "buraco negro" PMTUD: conexões TCP grandes (ex.: downloads HTTPS) travam misteriosamente enquanto pacotes pequenos (SYN, ACK) funcionam. Solução: habilitar TCP MSS Clamping no roteador (ajusta o Maximum Segment Size na negociação TCP) ou liberar ICMP Fragmentation Needed.
4. Bit 2: MF (More Fragments - Mais Fragmentos)
Este é o bit de sequência e terminação. Ele informa ao receptor se o fragmento atual é o último pedaço do datagrama original.
- Valor 0 (Último Fragmento ou Sem Fragmentação):
- Se o pacote não foi fragmentado, o MF será 0 e o Fragment Offset também será 0.
- Se o pacote foi fragmentado, o valor 0 indica que este é o último fragmento do datagrama original. Isso avisa ao receptor que ele já possui todas as peças necessárias para começar a remontagem completa do datagrama.
- Valor 1 (Mais Fragmentos Pendentes): Indica que este fragmento não é o último. Existem mais fragmentos deste mesmo datagrama chegando subsequentemente. O receptor deve manter este fragmento em buffer e aguardar os próximos antes de tentar processar os dados.
5. Lógica Funcional dos Flags em Cenários Reais
Para entender a interação desses flags, considere o fluxo de dados de um arquivo grande que atravessa uma rede com MTU pequena:
- Envio Original: O host cria um datagrama com 5000 bytes. O bit DF está em 0 (permite fragmentação).
- No Roteador: O roteador vê que o enlace seguinte suporta apenas 1500 bytes. Ele divide o datagrama original em 4 fragmentos.
- Configuração dos Fragmentos:
- Fragmento 1: Contém os primeiros 1480 bytes de dados. MF = 1 (há mais). Offset = 0.
- Fragmento 2: Contém os próximos 1480 bytes. MF = 1. Offset = 185 (1480 / 8).
- Fragmento 3: Contém os próximos 1480 bytes. MF = 1. Offset = 370.
- Fragmento 4: Contém o restante dos bytes. MF = 0 (é o último). Offset = 555.
- Recebimento: O host de destino vê o bit MF=1 nos três primeiros pacotes e os bufferiza. Ao receber o quarto pacote com MF=0, ele sabe que o conjunto está completo e pode remontar o arquivo original.
Note que o Fragment Offset é sempre expresso em blocos de 8 bytes — por isso, todos os fragmentos (exceto o último) devem ter tamanho múltiplo de 8. Isso permite representar offsets de até 65536 bytes (213 × 8) num campo de 13 bits.
6. Tabela de MTU por Tecnologia
A fragmentação ocorre quando o tamanho do pacote excede a MTU do enlace. Conhecer as MTUs típicas ajuda a prever onde a fragmentação pode acontecer:
| Tecnologia | MTU (bytes) | Observação |
|---|---|---|
| Ethernet | 1500 | Padrão LAN; base da internet |
| IEEE 802.11 (Wi-Fi) | 2304 | Inclui overhead de cripto |
| PPPoE (ADSL) | 1492 | Overhead de 8 bytes |
| GRE sobre IP | 1476 | Overhead de 24 bytes |
| IPsec ESP (AES) | 1450-1472 | Varia com algoritmo |
| MPLS (1 label) | 1504 | Overhead de 4 bytes/label |
| IPv4 mínimo | 68 | RFC 791 |
| IPv6 mínimo | 1280 | RFC 8200 |
| Jumbo Frames | 9000 | Datacenter/IS-IS |
7. Resumo Binário
Visualmente, em um byte que compartilha espaço com o início do Fragment Offset, a configuração dos 3 bits de Flags seria representada assim (Bit 7..5 = Flags, Bit 4..0 = Início do Offset):
- Normal:
000(Reservado=0, DF=0, MF=0) - Último Fragmento:
000 - Fragmento Intermediário:
001 - Proibir Fragmentação:
010(DF=1, MF=0)
8. Remontagem (Reassembly) no Destino
A remontagem só ocorre no host de destino final, nunca em roteadores intermediários. O processo:
- Os fragmentos chegam possivelmente fora de ordem (rede IP não garante ordem).
- O host identifica fragmentos do mesmo datagrama pelo campo Identification + IP origem + IP destino + protocolo.
- Cada fragmento é armazenado em um buffer de remontagem (tamanho máximo: 64 KB no IPv4, RFC 791).
- Quando o fragmento com MF=0 chega, o host calcula o tamanho total esperado.
- Com todos os fragmentos em mãos, o datagrama original é reconstruído e passado para a camada superior.
Fragmentos que não completam o datagrama dentro de um timeout (tipicamente 30-60s) são descartados, gerando perda silenciosa.
9. Fragmentação em IPv6
No IPv6 (RFC 8200), a fragmentação intermediária foi abolida: roteadores não fragmentam mais pacotes em trânsito. A fragmentação só ocorre na origem, usando Extension Headers (Fragment Header, NH=44). Benefícios:
- Roteadores IPv6 processam pacotes mais rápido (sem lógica de fragmentação).
- Elimina o problema de overlapping fragment attacks em roteadores.
- O PMTUD (RFC 8201) torna-se obrigatório na origem.
10. Ataques Relacionados à Fragmentação
| Ataque | Descrição | Mitigação |
|---|---|---|
| Tiny Fragment Attack | Atacante fragmenta TCP para que a porta de destino fique isolada em fragmento de 8 bytes, driblando ACLs que inspecionam só o 1º fragmento | Inspecionar todos os fragmentos ou bloquear fragmentos não iniciais (Offset=0 sem MF=1) |
| Overlapping Fragment Attack | Fragmentos sobrepostos sobrescrevem partes, driblando filtros L7 | Drop de fragmentos sobrepostos (RFC 815) |
| Teardrop (CVE-1999-0015) | Offset malicioso causa overflow no kernel durante remontagem | Patch de kernel / firewall drop de offsets inválidos |
| Fragment Flood | Saturar buffer de remontagem do destino | Rate-limit ICMP + drop de fragmentos incompletos |
| Rose Attack | Combinação de fragmentos inválidos para DoS | IDS/IPS com assinaturas |
11. Configuração e Inspeção Prática
Linux — Desabilitar fragmentação (PMTUD agressivo)
# Forçar DF em sockets (default já é 1)
sysctl net.ipv4.ip_no_pmtu_disc=0
# Limpar cache PMTU (em caso de buraco negro)
ip route flush cache
Cisco IOS — TCP MSS Clamping (evita fragmentação em túneis)
interface Tunnel0
ip tcp adjust-mss 1436
iptables — Bloquear fragmentos suspeitos
# Bloquear fragmento não-inicial isolado (offset > 0 sem predecessor)
iptables -A INPUT -f -j DROP
# Bloquear fragmentos extremamente pequenos (tiny fragment attack)
iptables -A INPUT -p tcp -f -m length --length 0:39 -j DROP
tcpdump — Capturar fragmentos
tcpdump -n -i eth0 'ip[6:2] & 0x1fff != 0' # pacotes fragmentados
tcpdump -n -i eth0 'ip[6] & 0x20 != 0' # MF=1 (more fragments)
12. Conclusão
Os 3 bits de Flags — aparentemente triviais — controlam um dos mecanismos mais sensíveis do IPv4. A fragmentação aumenta a latência, consome buffer e abre vetores de ataque, por isso a arquitetura moderna evita-a via PMTUD e TCP MSS Clamping, e o IPv6 a elimina do caminho de dados. Compreender o comportamento dos bits DF e MF, junto do Fragment Offset, é essencial para diagnosticar problemas de conectividade misteriosos (buracos negros de MTU, perda de pacotes grandes) e para configurar firewalls e roteadores de forma segura contra ataques baseados em fragmentação.