Ambos:
sudo ip -s -s neigh flush all
E:
sudo arp -d 192.168.0.102
Em vez de limpar o cache arp, eles parecem apenas invalidar as entradas (aparecerão como incomplete
). Mesmo depois de alguns minutos, o cache ARP se parece com:
$ arp -n Address HWtype HWaddress Flags Mask Iface 192.168.0.103 (incomplete) eth0 192.168.0.1 ether DE:AD:BE:EF:DE:AD C eth0
(O MAC do gateway foi atualizado – está tudo bem)
Como posso realmente limpar o cache ARP, como em “excluir todas as entradas da tabela”? Eu não quero manter as entradas incompletas, quero que sejam removidas. Isso é possível?
EDITAR
Este é o meu sistema:
» arp --version net-tools 1.60 arp 1.88 (2001-04-04) +I18N AF: (inet) +UNIX +INET +INET6 +IPX +AX25 +NETROM +X25 +ATALK +ECONET +ROSE HW: (ether) +ETHER +ARC +SLIP +PPP +TUNNEL -TR +AX25 +NETROM +X25 +FR +ROSE +ASH +SIT +FDDI +HIPPI +HDLC/LAPB +EUI64 » lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.2 LTS Release: 14.04 Codename: trusty » uname -a Linux polyphemus.xxx-net 3.13.0-46-generic #77-Ubuntu SMP Mon Mar 2 18:23:39 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
Comentários
Resposta
Oneliner original
ip link set arp off dev eth0 ; ip link set arp on dev eth0
Certifique-se de fazer tudo de uma vez, para não interromper a conectividade da rede antes de poder reativar o ARP.
Interface descobrindo o comando copiar e colar
interfaces=$( arp -n | awk " NR == 1 {next} {interfaces[$5]+=1} END {for (interface in interfaces){print(interface)}} " ); for interface in $interfaces; do echo "Clearing ARP cache for $interface"; sudo ip link set arp off dev $interface; sudo ip link set arp on dev $interface; done
Nota: Os pontos-e-vírgulas permitem que você condense este comando em um oneliner, mas parece terrível em um bloco de código no SO .
Exemplo de saída em Raspbian
pi@raspberrypi:~ $ arp -n Address HWtype HWaddress Flags Mask Iface 10.0.0.1 ether 58:19:f8:0d:57:aa C wlan0 10.0.0.159 ether 88:e9:fe:84:82:c8 C wlan0 pi@raspberrypi:~ $ interfaces=$( arp -n | awk " NR == 1 {next} {interfaces[$5]+=1} END {for (interface in interfaces){print(interface)}} "); for interface in $interfaces; do echo "Clearing ARP cache for $interface"; sudo ip link set arp off dev $interface; sudo ip link set arp on dev $interface; done Clearing ARP cache for wlan0 pi@raspberrypi:~ $ arp -n Address HWtype HWaddress Flags Mask Iface 10.0.0.159 ether 88:e9:fe:84:82:c8 C wlan0
Comentários
- Deve-se faça em um script de shell ou na máquina, pois parece interromper a conectividade após o primeiro comando.
- Fiz em uma linha e funcionou:
dev=eth2; ip link set arp off dev $dev; sleep 1; ip link set arp on dev $dev
. Asleep
pode não ser necessária.
Resposta
Seu a primeira solução funciona, só leva um pouco de tempo (5-10 segundos no meu teste em Kali) para ir de “(incompleto)” para nenhuma entrada.
Presumivelmente, está em algum tipo de estado de transição em sua maneira de ser excluído.
Comentários
- Para mim (Ubuntu 14.04) este não foi o caso: as entradas são mantidas por um longo tempo ( para sempre?) no estado incompleto. Vou verificar novamente hoje.
- Verificado: mesmo depois de alguns minutos, as entradas ainda estão lá, no estado incompleto (arp 1.88, net-tools 1.60)
- Bem então o seu problema é certamente um comportamento fora do padrão, talvez específico do Ubuntu 14.04. A maneira correta de fazer isso no Linux simplesmente não está funcionando para você. Espero que você encontre sua resposta em breve. Pode excluir este se você ‘ desejar.
- Não, deixe, fornece informações para os outros. Mas eu acho que o comportamento mais ” padrão ” pode ser encontrado no Ubuntu, não em Kali, que é uma distro para teste de penetração e tem valores padrão ajustados especificamente para esse caso de uso.
Resposta
Sua solução mencionada é a correta e segura abordagem para liberar a tabela ARP:
ip neigh flush all [dev <device>]
Se certas entradas forem alteradas para inválidas, isso é temporário e faz parte do ARP protocolo. O aspecto importante é que o mapeamento foi eliminado, uma entrada ARP sinalizada como incompleta não é uma entrada IP-MAC na tabela.
Acabei de tentar isso e, no meu caso, limpou imediatamente o tabela e não deixou entradas incompletas.
Comentários
- Em alguns casos (pouco claros), ip neigh flush all não é suficiente. No meu caso, não apagou as entradas adicionadas com arp -s.
- Prefiro muito mais isso do que a minha própria resposta acima, com a advertência adicionada a respeito das entradas ARP estáticas, dependendo do comportamento desejado.
Resposta
Em certos sistemas, o comando ip
não está disponível.
user@linux:~$ ip -bash: ip: command not found user@linux:~$
Portanto, esta é a alternativa do comando ip link set arp off dev eth0; ip link set arp on dev eth0
.
Se você quiser exclua todas as entradas da tabela em um único comando, use for loop
como no exemplo a seguir.
ANTES
user@linux:~$ arp ? (10.0.0.1) at 00:00:00:aa:aa:12 [ether] on eth1 ? (172.168.0.3) at 00:00:00:aa:aa:11 [ether] on eth2 user@linux:~$
REMOVENDO ARP COM O COMANDO ARP -D
user@linux:~$ for i in 10.0.0.1 172.168.0.3; do sudo arp -d $i; done user@linux:~$
APÓS: ENDEREÇO MAC REMOVIDO DAS ENTRADAS COM MENSAGEM INCOMPLETA
user@linux:~$ arp ? (10.0.0.1) at <incomplete> on eth1 ? (172.168.0.3) at <incomplete> on eth2 user@linux:~$
Isso “é verdade, ao excluir arp com o comando arp -d
, as entradas arp ainda estão lá com a mensagem incomplete
.
Para resolver este problema, use ifconfig ethx up/down
como este
ANTES
user@linux:~$ arp ? (10.0.0.1) at <incomplete> on eth1 ? (172.168.0.3) at <incomplete> on eth2 user@linux:~$
DESATIVAR & ATIVA AS INTERFACES ETH1 & ETH2 EM UM ÚNICO COMANDO
user@linux:~$ for i in 1 2; do sudo ifconfig eth$i down; sudo ifconfig eth$i up; done user@linux:~$
TADAAA … PROBLEMA RESOLVIDO:)
user@linux:~$ arp user@linux:~$
wireshark
outcpdump
.