ARP & Tabela ARP

Resolução de Endereços e Proxy ARP

O que é ARP?

O Address Resolution Protocol (ARP) mapeia endereços IPv4 (32 bits) para endereços MAC (48 bits) na Camada de Enlace, dentro de uma mesma sub-rede (Kurose 4.3; Tanenbaum 5.5.2). Ele é essencial para enviar pacotes Ethernet em uma LAN, como a VLAN 10 da Aula 3 (`192.168.10.0/24`).

Processo ARP:

  1. PC1 (`192.168.10.1`) quer enviar um pacote para PC2 (`192.168.10.2`), mas só conhece o IP.
  2. PC1 envia um ARP Request em broadcast (MAC destino: ff:ff:ff:ff:ff:ff): "Quem tem 192.168.10.2?"
  3. PC2 responde com um ARP Reply (unicast), informando seu MAC (e.g., 00:1A:2B:3C:4D:5E).
  4. PC1 armazena o par IP↔MAC na tabela ARP e envia o pacote Ethernet.
arp_sequence.txt
PC1 (192.168.10.1, 00:11:22:33:44:55):
ARP Request: "Quem tem 192.168.10.2?" (Broadcast)
PC2 (192.168.10.2, 00:1A:2B:3C:4D:5E):
ARP Reply: "Eu, meu MAC é 00:1A:2B:3C:4D:5E" (Unicast)

Nota: ARP opera na Camada de Enlace, mas usa IPs da Camada de Rede (Aula 4), conectando hosts na mesma sub-rede (e.g., `192.168.10.0/24`).

Estrutura do Pacote ARP

arp_packet.txt
• Hardware Type: Ethernet (1)
• Protocol Type: IPv4 (0x0800)
• Hardware Size: 6 bytes (MAC)
• Protocol Size: 4 bytes (IPv4)
• Opcode: 1 (Request) ou 2 (Reply)
• Sender MAC/IP: MAC e IP do remetente (e.g., 00:11:22:33:44:55, 192.168.10.1)
• Target MAC/IP: MAC (desconhecido no Request) e IP do destino (e.g., 192.168.10.2)

Tabela ARP

A tabela ARP (cache) armazena pares IP↔MAC para evitar ARP Requests repetitivos. Entradas expiram após 5–20 minutos, dependendo do sistema, para refletir mudanças na rede (Tanenbaum 5.5.2).

ip_neigh_show.txt
$ ip neigh show
192.168.10.1 dev eth0 lladdr 00:11:22:33:44:55 REACHABLE
192.168.10.2 dev eth0 lladdr 00:1A:2B:3C:4D:5E STALE

Campos: IP, interface (e.g., eth0), MAC, estado (REACHABLE: ativo; STALE: expirando). Use ip neigh flush all para limpar o cache.

Proxy ARP

Proxy ARP permite que um roteador responda a ARP Requests em nome de hosts em outra sub-rede, facilitando comunicação sem configurar rotas nos hosts (Kurose 4.3). Exemplo: PC1 (`192.168.10.2`) se comunica com PC2 (`192.168.20.2`).

proxy_arp_topology.txt
[PC1: 192.168.10.2/24, VLAN 10]---[G0/0: Router: G0/1]---[PC2: 192.168.20.2/24, VLAN 20]
Router G0/0: 192.168.10.1/24
Router G0/1: 192.168.20.1/24

Funcionamento: PC1 envia ARP Request para `192.168.20.2`. O roteador (com Proxy ARP ativado) responde com seu MAC (G0/0), encaminhando os pacotes para PC2.

Limitações: Proxy ARP aumenta o tráfego de broadcast e pode ser vulnerável a ataques (e.g., ARP spoofing). É menos usado hoje, substituído por roteamento explícito.

Atividade Prática

Parte 1: Packet Tracer (com VLANs da Aula 3)

  1. Configure a topologia acima: 2 PCs, 2 switches (2950), 1 roteador (2911).
  2. Configure VLANs: PC1 em VLAN 10 (`192.168.10.2/24`), PC2 em VLAN 20 (`192.168.20.2/24`).
  3. Configure IPs: Router G0/0 (`192.168.10.1/24`), G0/1 (`192.168.20.1/24`).
  4. Ative Proxy ARP no roteador (ver configuração acima).
  5. Pingue de PC1 para PC2 (`ping 192.168.20.2`). Use Wireshark para capturar o ARP Request/Reply.
  6. Verifique a tabela ARP em PC1: arp -a.

Parte 2: Linux

  1. Em duas VMs Linux na mesma sub-rede (`192.168.10.0/24`):
    • Limpe o cache: sudo ip neigh flush all
    • Pingue: ping -c 1 192.168.10.2
    • Verifique: ip neigh show
  2. Capture pacotes ARP: sudo tcpdump -i eth0 arp -n
  3. Teste com arping: sudo arping -c 3 192.168.10.1
  4. Configure entrada estática: sudo arp -s 192.168.10.20 aa:bb:cc:dd:ee:ff

Entregável: Screenshots de: topologia (Packet Tracer), captura Wireshark (ARP), saídas de ip neigh show, tcpdump, arping.

Leitura: Kurose & Ross, Capítulo 4.3, 4.4; Tanenbaum & Wetherall, Capítulo 5.5. 5.6.

ICMP & Traceroute

Mensagens de Controle e Diagnóstico

O que é ICMP?

O Internet Control Message Protocol (ICMP) é um protocolo da Camada de Rede (Aula 4) que envia mensagens de controle e erro para gerenciar e diagnosticar redes IP (Kurose 4.3; Tanenbaum 5.5.3). Ele é usado por ferramentas como ping e traceroute.

Principais Mensagens ICMP:

TipoCódigoDescrição
80Echo Request (ping)
00Echo Reply (resposta ao ping)
110Time Exceeded (TTL expirou, usado por traceroute)
30–15Destination Unreachable (e.g., rede/host/port inacessível)

Estrutura do Pacote ICMP:

icmp_packet.txt
• Type (8 bits): e.g., 8 (Echo Request), 0 (Echo Reply), 11 (Time Exceeded)
• Code (8 bits): Subtipo da mensagem (e.g., 0 para Time Exceeded)
• Checksum (16 bits): Verifica integridade
• Data: Dados específicos (e.g., identificador e sequência no ping)

Ping (Echo Request/Reply)

O ping envia um ICMP Echo Request (Type 8) para testar conectividade e medir o RTT (Round-Trip Time). O destino responde com um Echo Reply (Type 0). Exemplo na sub-rede da Aula 3 (VLAN 10, 192.168.10.0/24):

ping_example.sh
$ ping -c 4 192.168.10.2
PING 192.168.10.2 (192.168.10.2): 56 data bytes
64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=1.23 ms
64 bytes from 192.168.10.2: icmp_seq=2 ttl=64 time=1.15 ms
64 bytes from 192.168.10.2: icmp_seq=3 ttl=64 time=1.18 ms
64 bytes from 192.168.10.2: icmp_seq=4 ttl=64 time=1.20 ms
--- 192.168.10.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 1.15/1.19/1.23/0.04 ms

Interpretação: RTT médio de ~1.19 ms indica baixa latência. ttl=64 é típico em Linux (decrementado por cada roteador). Perda de 0% confirma conectividade.

Traceroute

O traceroute mapeia o caminho de pacotes até o destino, enviando pacotes (UDP em Linux, ICMP em Windows) com TTL crescente (1, 2, 3, ...). Cada roteador que zera o TTL retorna um ICMP Time Exceeded (Type 11). Exemplo na sub-rede da Aula 3:

traceroute_sequence.txt
PC1 (192.168.10.2) → Roteador (192.168.10.1):
TTL=1: Enviado, Roteador (192.168.10.1) retorna Time Exceeded
TTL=2: Enviado, destino (192.168.10.1) responde (se alcançado)
traceroute_example.sh
$ traceroute -I 192.168.10.1
traceroute to 192.168.10.1 (192.168.10.1), 30 hops max, 60 byte packets
1 192.168.10.1 1.123 ms 1.098 ms 1.087 ms

Nota: Use traceroute -I em Linux para forçar ICMP (padrão é UDP). Em Windows, tracert usa ICMP.

Atividade Prática

Parte 1: Packet Tracer (com VLANs da Aula 3)

  1. Configure a topologia: 2 PCs, 1 switch (2950), 1 roteador (2911).
  2. Configure VLAN 10: PC1 (192.168.10.2/24), PC2 (192.168.10.3/24), Roteador G0/0 (192.168.10.1/24).
  3. De PC1, pingue PC2 (ping 192.168.10.3) e capture com Wireshark (filtro: icmp).
  4. De PC1, execute tracert 192.168.10.1 (Windows) ou simule traceroute no Packet Tracer.
  5. Analise: RTT no ping, saltos no traceroute, campos ICMP no Wireshark (Type, Code, Checksum).

Parte 2: Linux

  1. Em duas VMs Linux na sub-rede 192.168.10.0/24:
    • Pingue: ping -c 4 192.168.10.2
    • Capture: sudo tcpdump -i eth0 icmp -n -c 8
  2. Execute traceroute: traceroute -I 192.168.10.1
  3. Teste com tamanho de pacote: ping -c 4 -s 100 192.168.10.2
  4. Verifique TTL: Compare ping local (TTL=64) e externo (e.g., ping 8.8.8.8).

Entregável: Screenshots de: topologia (Packet Tracer), Wireshark (ICMP), saídas de ping, tcpdump, traceroute.

Leitura: Kurose & Ross, Capítulo 4.3; Tanenbaum & Wetherall, Capítulo 5.5.

Fragmentação de Datagramas & MTU

Como IPv4 Lida com Tamanhos Variáveis

Por que Fragmentar?

Cada link de rede impõe uma MTU (Maximum Transmission Unit), o maior tamanho de pacote (incluindo cabeçalho IPv4) que pode ser transmitido sem fragmentação (Kurose 4.4.2; Tanenbaum 5.5.5). Exemplo: Ethernet tem MTU típico de 1500 bytes. Se um datagrama IPv4 excede a MTU do próximo salto, o roteador o divide em fragmentos, que são remontados apenas no destino.

Exemplo de Fragmentação:

fragmentation_example.txt
Datagrama: 2000 bytes (20 bytes cabeçalho IPv4 + 1980 bytes dados)
MTU: 1500 bytes (1480 bytes dados + 20 bytes cabeçalho)
Fragmento 1: 1500 bytes (20 bytes cabeçalho + 1480 bytes dados, Offset=0, MF=1)
Fragmento 2: 520 bytes (20 bytes cabeçalho + 500 bytes dados, Offset=185, MF=0)

Nota: Offset é medido em unidades de 8 bytes (1480 ÷ 8 = 185).

Campos de Fragmentação no Cabeçalho IPv4

  • Identification: Identificador único (16 bits) para todos os fragmentos de um datagrama (e.g., 12345).
  • Flags (3 bits):
    • DF (Don’t Fragment): Se 1, proíbe fragmentação; gera ICMP Destination Unreachable (Type 3, Code 4) se necessário.
    • MF (More Fragments): 1 em todos os fragmentos, exceto o último (0).
  • Fragment Offset: Deslocamento (13 bits) em unidades de 8 bytes, indicando a posição do fragmento (e.g., 0, 185).

Verificando a MTU

A MTU de uma interface (e.g., eth0) pode ser verificada em Linux. Para testar fragmentação, use ping com tamanhos específicos na sub-rede da Aula 3 (192.168.10.0/24):

mtu_check.sh
$ ip link show eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
$ ping -c 1 -M do -s 1472 192.168.10.2 # 1472 + 20 (IPv4) + 8 (ICMP) = 1500 bytes
64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=1.23 ms

Forçando Fragmentação

Enviar um pacote maior que a MTU (sem DF) força a fragmentação. Exemplo:

ping_fragment.sh
$ ping -c 1 -s 2000 192.168.10.2
PING 192.168.10.2 (192.168.10.2) 2000(2028) bytes of data.
1480 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=1.25 ms
520 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=1.27 ms

Atividade Prática

Parte 1: Packet Tracer (com VLANs da Aula 3)

  1. Configure a topologia: 2 PCs, 1 switch (2950), 1 roteador (2911).
  2. Configure VLAN 10: PC1 (192.168.10.2/24), PC2 (192.168.10.3/24), Roteador G0/0 (192.168.10.1/24).
  3. No roteador, ajuste a MTU: interface g0/0, mtu 1000.
  4. De PC1, pingue PC2: ping 192.168.10.3 -l 1500 (Windows) ou ping -s 1500 192.168.10.3 (Linux).
  5. Repita com -f (Windows) ou -M do (Linux) e observe o ICMP Type 3, Code 4.
  6. Capture com Wireshark (filtro: ip.flags.mf==1 || ip.flags.df==1).

Parte 2: Linux

  1. Em duas VMs Linux na sub-rede 192.168.10.0/24:
    • Verifique MTU: ip link show eth0
    • Ajuste MTU: sudo ip link set eth0 mtu 1000
    • Pingue sem fragmentação: ping -c 1 -M do -s 972 192.168.10.2
    • Pingue com fragmentação: ping -c 1 -s 1500 192.168.10.2
  2. Capture fragmentos: sudo tcpdump -i eth0 'ip[6:2] & 0x1fff != 0 || ip[6] & 0x20 != 0' -n

Entregável: Screenshots de: topologia (Packet Tracer), Wireshark (fragmentos), saídas de ip link show, ping, tcpdump.

Leitura: Kurose & Ross, Capítulo 4.4.2; Tanenbaum & Wetherall, Capítulo 5.5.

Ferramentas de Diagnóstico

Explorando Redes com ARP, Ping, Traceroute e Mais

Descoberta e Cache

  • arp / ip neigh: Exibe o cache ARP (Slide 1) com pares IP↔MAC.
    arp_cache.sh
    $ ip neigh show
    192.168.10.1 dev eth0 lladdr 00:11:22:33:44:55 REACHABLE
    192.168.10.2 dev eth0 lladdr 00:1A:2B:3C:4D:5E STALE
  • arp-scan: Escaneia a LAN via ARP Request (Slide 1).
    arp_scan.sh
    $ sudo arp-scan --localnet
    192.168.10.1 00:11:22:33:44:55 Cisco Systems, Inc
    192.168.10.2 00:1A:2B:3C:4D:5E Dell Inc.

Conectividade e Roteamento

  • ping: Testa conectividade via ICMP Echo Request/Reply (Slide 2).
    ping_test.sh
    $ ping -c 4 192.168.10.2
    PING 192.168.10.2 (192.168.10.2): 56 data bytes
    64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=1.23 ms
    ...
    rtt min/avg/max/mdev = 1.15/1.19/1.23/0.04 ms
  • traceroute / mtr: Mapeia saltos via ICMP Time Exceeded (Slide 2).
    traceroute_test.sh
    $ traceroute -I 192.168.10.1
    traceroute to 192.168.10.1 (192.168.10.1), 30 hops max, 60 byte packets
    1 192.168.10.1 1.123 ms 1.098 ms 1.087 ms

Análise de Sockets

  • ss: Lista sockets TCP/UDP com processos e PIDs.
    ss_sockets.sh
    $ ss -tulpen
    Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
    tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* uid:0 ino:12345
  • netstat: (Legado) Similar ao ss.
    netstat_sockets.sh
    $ sudo netstat -tulpen
    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
    tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1234/sshd

Captura de Pacotes

  • tcpdump: Captura pacotes em nível de enlace.
    tcpdump_capture.sh
    $ sudo tcpdump -i eth0 icmp -n
    12:34:56.789012 IP 192.168.10.2 > 192.168.10.1: ICMP echo request, id 1, seq 1, length 64
  • tshark: Versão terminal do Wireshark.
    tshark_capture.sh
    $ sudo tshark -i eth0 -f "arp or icmp"
    1 0.000000 00:1A:2B:3C:4D:5E -> ff:ff:ff:ff:ff:ff ARP Who has 192.168.10.1?

Configuração de Interfaces

  • ip: Gerencia endereços e rotas (Aula 4).
    ip_config.sh
    $ ip a show eth0
    2: eth0: mtu 1500 state UP
    inet 192.168.10.2/24 brd 192.168.10.255
    $ ip r
    default via 192.168.10.1 dev eth0
  • ethtool: Exibe estatísticas da NIC.
    ethtool_stats.sh
    $ sudo ethtool eth0
    Speed: 1000Mb/s
    Duplex: Full
    Link detected: yes
  • macchanger: Altera o endereço MAC.
    macchanger.sh
    $ sudo macchanger -r eth0
    Current MAC: 00:1A:2B:3C:4D:5E
    New MAC: 00:12:34:56:78:9A

Atividade Prática

Parte 1: Packet Tracer (com VLANs da Aula 3)

  1. Configure a topologia: 2 PCs, 1 switch (2950), 1 roteador (2911).
  2. Configure VLAN 10: PC1 (192.168.10.2/24), PC2 (192.168.10.3/24), Roteador G0/0 (192.168.10.1/24).
  3. Teste conectividade: ping 192.168.10.3 (PC1 para PC2).
  4. Mapeie saltos: tracert 192.168.10.1 (Windows) ou simule traceroute.
  5. Capture pacotes: Wireshark (filtro: arp or icmp).

Parte 2: Linux

  1. Em duas VMs Linux na sub-rede 192.168.10.0/24:
    • Mapear LAN: sudo arp-scan --localnet, nmap -sn 192.168.10.0/24
    • Limpar cache ARP: sudo ip neigh flush all
    • Testar conectividade: ping -c 4 192.168.10.2
    • Mapear rotas: traceroute -I 192.168.10.1
    • Verificar sockets: ss -tulpen
    • Capturar pacotes: sudo tcpdump -i eth0 'arp or icmp' -n -c 10
  2. Spoof de MAC: sudo macchanger -r eth0, teste com ping 192.168.10.2, verifique ip neigh show.
  3. Path MTU Discovery (Slide 3): ping -c 1 -M do -s 2000 192.168.10.2, capture sudo tcpdump -i eth0 icmp -n.

Entregável: Screenshots de: topologia (Packet Tracer), Wireshark (ARP/ICMP), saídas de arp-scan, nmap, ip neigh, ping, traceroute, ss, tcpdump, macchanger.

Leitura: Kurose & Ross, Capítulo 4.7; Tanenbaum & Wetherall, Capítulo 5.5.7.

Quiz Interativo

Teste seus Conhecimentos IPv4 Avançado

1. Qual protocolo resolve endereços IPv4 para MAC na LAN?

a) ARP
b) ICMP
c) UDP
d) DNS

Resposta: a) ARP
O ARP mapeia IP→MAC na mesma sub-rede (Kurose 4.3).

2. Qual comando exibe o cache ARP no Linux?

a) ip r
b) ip neigh show
c) ping -c
d) traceroute

Resposta: b) ip neigh show
Mostra o cache ARP (Tanenbaum 5.5.2).

3. Em IPv4, qual campo indica o deslocamento do fragmento?

a) TTL
b) Flags
c) Fragment Offset
d) Protocol

Resposta: c) Fragment Offset
Define a posição do fragmento dentro do datagrama (Kurose 4.4).

4. Qual tipo ICMP corresponde a “Echo Request”?

a) 8
b) 0
c) 3
d) 11

Resposta: a) 8
Tipo 8 é Echo Request; tipo 0 é Echo Reply (Kurose 4.6).

5. Qual o MTU padrão da Ethernet?

a) 1500 bytes
b) 576 bytes
c) 68 bytes
d) 65535 bytes

Resposta: a) 1500 bytes
MTU padrão para quadros Ethernet (IEEE 802.3).

6. Qual ferramenta altera endereço MAC da interface?

a) macchanger
b) ethtool
c) ip addr
d) ifconfig

Resposta: a) macchanger
Utilitário dedicado para mascarar MAC (Packet Tracer / Linux).

7. Qual comando captura pacotes ICMP no terminal?

a) tcpdump -i eth0 icmp
b) traceroute -n
c) arp -n
d) netstat -r

Resposta: a) tcpdump -i eth0 icmp
Filtra apenas pacotes ICMP na interface.

8. Qual ferramenta combina traceroute + ping em tempo real?

a) mtr
b) nmap
c) ss
d) arp-scan

Resposta: a) mtr
mtr faz traceroute contínuo e estatísticas de RTT.

9. Qual o valor padrão do TTL no Linux?

a) 128
b) 255
c) 64
d) 32

Resposta: c) 64
Linux usa TTL 64 por padrão.

10. Qual comando lista sockets TCP/UDP, processos e PIDs?

a) ss -tulpen
b) ip a
c) arp -a
d) netstat -an

Resposta: a) ss -tulpen
ss substitui netstat para visualizar sockets e PIDs.

Atividade Prática

  1. Limpe o cache ARP e singele um ping:
    $ sudo ip neigh flush all && ping -c1 192.168.10.1
  2. Traceie até google.com e capture ICMP:
    $ traceroute google.com && sudo tcpdump -i eth0 icmp
  3. Force fragmentação e observe:
    $ ping -M do -s 2000 8.8.8.8
  4. Altere seu MAC e valide no ARP:
    $ sudo macchanger -r eth0 && arp -n

Leitura complementar: Kurose & Ross Cap. 4.6–4.7; Tanenbaum & Wetherall 5.5–5.5.7.