arp --delete não está excluindo uma entrada; apenas marca a entrada como "incompleta"

10
$ sudo arp -avn
? (10.10.7.30) at 00:cc:cc:bb:dd:86 [ether] on eth0
...

$ sudo arp --delete 10.10.7.30

$ sudo arp -avn
? (10.10.7.30) at <incomplete> [ether] on eth0

Depois --deletenão esperava entrada para 10.10.7.30. Inesperadamente, a entrada permanece e está marcada <incomplete>.

Usando o Ubuntu 10.04 .

JamesThomasMoon1979
fonte

Respostas:

10

A entrada será removida, apenas seja paciente.

(Se você deseja a resposta mais curta possível: incompleto == excluído)

Digamos que "excluir" é a palavra errada para a ação. O que realmente está acontecendo aqui é que a entrada é configurada manualmente para o estado "solicitação enviada, sem resposta" (portanto, processo ARP "incompleto") como se a máquina estivesse realmente inacessível.

Agora, a entrada será completamente removida em breve, a menos que obtenha uma nova resposta válida do ARP nesse meio tempo. Nesse caso, a entrada seria adicionada novamente mesmo que fosse removida em vez de ser marcada como incompleta. Portanto, não há nenhum benefício ou vantagem real nesse comportamento.

Mas lembre-se de que estamos falando de um cache. Excluir coisas de caches é difícil e caro. É muito mais eficiente invalidar uma entrada e aguardar se ela for substituída antes de finalmente ser removida. Mas, para o sistema, não há diferença se a entrada sair da lista ou apenas marcada como incompleta.

Karma Fusebox
fonte
E não há como realmente excluí-lo, para que uma necessidade subsequente de saber o destino desencadeie uma "nova" consulta ARP?
7133 Skaperen
1
Mas exatamente esse é o caso aqui. Se algo procurar uma entrada marcada como "incompleta", uma nova solicitação ARP será enviada. Se for respondida, a entrada é atualizada e não é mais "incompleta". Se nenhuma resposta retornar, a entrada será removida da lista após algum tempo. (É por isso que eu acho que é bastante inútil "--delete" uma entrada manualmente Se a vida da máquina, a entrada será atualizada se ele é realmente ido embora, então por "--delete" a entrada de qualquer forma manualmente..?)
Karma Fusebox
... me vem à mente que você pode querer "alterar" o endereço ARP para um endereço IP. Nesse caso especial, você pode "- excluir" manualmente e a próxima solicitação ARP retornará o novo endereço. Mas para esse cenário, não importa se a entrada é visivelmente removida da lista ou marcada como "incompleta". Para a tecnologia envolvida, é a mesma coisa.
Karma Fusebox
@KarmaFusebox você sabe onde esse cache existe? Está na memória do processo? Em caso afirmativo, qual processo? ou é mantido pelo kernel? Em um arquivo em disco? em outro lugar?
JamesThomasMoon1979 06/06
@KarmaFusebox Excluindo uma entrada faz sentido se as entradas também foram adicionados manualmente (e, portanto, tem um sinalizador permanente)
cha5on
7

Apenas para complementar todas as outras respostas, achei este link muito útil .

Em alguns casos, usar ipé mais apropriado, como o comando:

# ip -s -s neigh flush all

Os resultados podem depender do seu kernel Linux.

Saulo Gomes
fonte
Isso funcionou perfeitamente para mim. Qualquer pessoa que esteja tendo problemas com outras respostas deve tentar.
jackgu1988
3

Além das outras boas respostas, vale ressaltar que é possível eredicar completamente o cache do arp removendo-o. Uma das maneiras menos dolorosas é:

ip link set arp off dev eth0 ; ip link set arp on dev eth0

Isso deve remover todas as entradas, estejam elas em qualquer estado.

Os métodos alternativos incluem baixar e atualizar a interface e maneiras semelhantes de tornar o cache do arp completamente removido e recriado.

sorrir
fonte
1
Essa é a resposta correta. Eu precisava exatamente disso. Não apenas marcar uma entrada como "incompleta" ou "não foi alcançada por um tempo". Obrigado.
John Hamilton
0

Eu sei que isso pode parecer óbvio, mas, para aqueles que não costumavam trabalhar com o shell, esta é minha sugestão:

A partir da resposta da @KarmaFusebox, por que não simplesmente saudar os resultados ...? :

arp -a | grep "incomplet" -i -v

Ele mostrará apenas as entradas de cache existentes / ativas.
Eu acho que continua sendo um comando compatível com POSIX . E é um método programável , se é isso que você precisa.

Sopalajo de Arrierez
fonte
Estou procurando uma explicação razoável de por que arpse comporta dessa maneira. Parece peculiar. Tangencialmente, poderia arpser forçado a remover as <incomplete>entradas?
JamesThomasMoon1979
Bem, @ JamesThomasMoon1979, eu prefiro dizer que, em sistemas que parecem não se comportar dessa maneira (ou seja: console do Windows), eles realmente são. A única diferença é que eles não mostrar incompleteentradas sobre o comando lista de cache arp.
Sopalajo de Arrierez