Resumo rápido (nível DevData): quando um equipamento está em outra sub-rede/VLAN ou com IP de fábrica, arping e ping falham. A forma confiável é capturar o tráfego Ethernet do MAC do dispositivo com tcpdump e extrair o IP que ele anuncia (ou o IP de origem nos pacotes). Este post mostra passo a passo, comandos prontos e um script único que devolve o IP automaticamente.
Pré-requisitos
- Acesso root ou
sudona máquina que fará a captura. - A interface física ligada ao mesmo segmento que o equipamento (ou acesso a SPAN/mirror do switch).
- Conhecer o MAC do equipamento (ex.:
80:8F:E8:C2:04:D1).
Comando básico
sudo tcpdump -i enp3s0 -n -e ether host 80:8F:E8:C2:04:D1
O que cada opção faz:
-i enp3s0→ interface a escutar. (altere para a sua interface)-n→ não resolve nomes (mantém IPs numéricos).-e→ mostra cabeçalho Ethernet (MACs).ether host <MAC>→ filtra pacotes cujo src ou dst corresponda ao MAC.
Este comando mostra TODO o tráfego de/para o MAC especificado — ARP, IP, DHCP, etc. O objetivo é observar o IP de origem que o equipamento anuncia.
Exemplo prático (ARP)
Saída típica para ARP (exemplo real):
80:8f:e8:c2:04:d1 > ff:ff:ff:ff:ff:ff, ethertype ARP (0x0806), length 60: Request who-has 10.189.94.1 tell 10.189.94.71, length 46
Interpretação direta:
80:8f:e8:c2:04:d1→ MAC de origem (seu equipamento)who-has 10.189.94.1→ IP que o equipamento está buscando (gateway/host)tell 10.189.94.71→ IP da câmera (origem)
Logo: o IP da câmera é 10.189.94.71.
Extraindo automaticamente o IP (ARP + IP)
Dependendo do tráfego que o dispositivo gera, você pode ver linhas ARP ou pacotes IP. Aqui vão dois snippets úteis.
1) Extrair IP a partir de linhas ARP “tell”
sudo tcpdump -i enp3s0 -n -e ether host 80:8F:E8:C2:04:D1 2>/dev/null \
| sed -n 's/.*tell \([0-9]\+\.[0-9]\+\.[0-9]\+\.[0-9]\+\).*/\1/p' -m 1
Explicação: sed captura a primeira ocorrência do padrão tell <IP> e imprime apenas o IP.
2) Extrair IP a partir de pacotes IP (caso o dispositivo abra conexões TCP/UDP)
sudo tcpdump -i enp3s0 -n -e ether host 80:8F:E8:C2:04:D1 and ip 2>/dev/null \
| awk '/IP/ { print $2 }' | sed 's/>.*//' -m 1
awk pega o segundo campo em linhas que contêm IP e sed limpa >dest: deixando só o IP de origem.
Script único — captura e retorna IP (bash)
Salve como detect_mac_ip.sh e rode com sudo.
#!/usr/bin/env bash
# detect_mac_ip.sh <INTERFACE> <MAC> <TIMEOUT>
IF=$1; MAC=$2; TIMEOUT=${3:-15}
timeout $TIMEOUT sudo tcpdump -i "$IF" -n -e ether host "$MAC" 2>/dev/null \
| awk '
/who-has/ { for(i=1;i<=NF;i++) if($i=="tell") print $(i+1) }
/IP/ && !/ARP/ { print $2 }
' \
| sed 's/>.*//' \
| awk 'NF{print; exit}'
# exit code: 0 if found (and printed), 124 if timeout
Uso:
sudo ./detect_mac_ip.sh enp3s0 80:8F:E8:C2:04:D1 20
- O script tenta capturar por
TIMEOUTsegundos e imprime o primeiro IP detectado (ARPtellou origem IP). - Se nada for encontrado, o comando termina com código 124 (timeout).
Pontos de contingência (quando não aparece nada)
- Dispositivo em outra VLAN/subnet → tcpdump na porta errada não verá tráfego. Solução: usar porta mirror/SPAN ou conectar direto.
- Dispositivo silencioso até configuração → reinicie a câmera para forçar tráfego (DHCP/ARP).
- Switch com isolamento/port-security → habilite monitoramento ou trabalhe localmente na porta física.
- DHCP em equipamentos gerenciados → se você tem acesso ao equipamento que faz DHCP (router, switch), consulte a tabela de leases.
Boas práticas e segurança
- Rode captura apenas em redes que você administra ou com autorização explícita. Sniffing sem permissão é ilegal.
- Use
-coutimeoutpara evitar capturas infinitas. - Preserve logs de captura com
tcpdump -wse precisar auditar depois.
Conclusão
Capturar tráfego pelo MAC é a forma mais robusta de descobrir IPs de equipamentos “fora de rede” (ou seja, fora da sua sub-rede ativa). Com tcpdump e um pequeno script você obtém o IP rapidamente, sem depender de arping, nmap ou ferramentas proprietárias. Esse é o método “na unha” — direto, determinístico e confiável.
