Home Comunidade Eventos YouTube Networks Desafios // produtos Academy News CTI | CVE Contato

05 - Flags e Fragmentação

video explicativo
Video explicativoEspaco reservado para o video desta anotação — adicione 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:

  1. Envio Original: O host cria um datagrama com 5000 bytes. O bit DF está em 0 (permite fragmentação).
  2. No Roteador: O roteador vê que o enlace seguinte suporta apenas 1500 bytes. Ele divide o datagrama original em 4 fragmentos.
  3. 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.
  4. 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:

  1. Os fragmentos chegam possivelmente fora de ordem (rede IP não garante ordem).
  2. O host identifica fragmentos do mesmo datagrama pelo campo Identification + IP origem + IP destino + protocolo.
  3. Cada fragmento é armazenado em um buffer de remontagem (tamanho máximo: 64 KB no IPv4, RFC 791).
  4. Quando o fragmento com MF=0 chega, o host calcula o tamanho total esperado.
  5. 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.