arp --delete no está eliminando una entrada; simplemente marca la 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

Después --deleteno esperaba entrada para 10.10.7.30. Inesperadamente, la entrada permanece y está marcada <incomplete>.

Usando Ubuntu 10.04 .

JamesThomasMoon1979
fuente

Respuestas:

10

La entrada será eliminada, solo sea paciente.

(Si desea la respuesta más corta posible: incompleta == eliminada)

Digamos que "eliminar" es la palabra incorrecta para la acción. Lo que realmente sucede aquí es que la entrada se establece manualmente en el estado "solicitud enviada, sin respuesta" (por lo tanto, proceso ARP "incompleto") como si la máquina fuera realmente inalcanzable.

Ahora, la entrada se eliminará por completo pronto a menos que obtenga una nueva respuesta ARP válida mientras tanto. En ese caso, la entrada se volvería a agregar de todos modos, incluso si se eliminara en lugar de marcarse como incompleta. Por lo tanto, no hay ventajas o desventajas reales de este comportamiento.

Pero tenga en cuenta que estamos hablando de un caché. Eliminar cosas de cachés es difícil y costoso. Es mucho más eficiente invalidar una entrada y esperar si se reemplaza antes de que finalmente se elimine. Pero para el sistema no hay ninguna diferencia si la entrada ha desaparecido de la lista o simplemente está marcada como incompleta.

Karma Fusebox
fuente
¿Y no hay forma de eliminarlo realmente para que una necesidad posterior de conocer el destino desencadene una "nueva" consulta ARP?
Skaperen
1
Pero exactamente ese es el caso aquí. Si algo busca una entrada que está marcada como "incompleta", se envía una nueva solicitud ARP. Si se responde, la entrada se actualiza y ya no está "incompleta". Si no se devuelve ninguna respuesta, la entrada se elimina de la lista después de un tiempo. (Es por eso que creo que es bastante inútil "- borrar" una entrada manualmente. Si la máquina vive, la entrada se actualizará. Si realmente se ha ido, ¿por qué "- borrar" la entrada de todos modos?)
Karma Fusebox
... se me ocurre que es posible que desee "cambiar" la dirección ARP por una dirección IP. En este caso especial, puede "--eliminar" manualmente y hacer que la siguiente solicitud ARP devuelva la nueva dirección. Pero para este escenario, no importa en absoluto si la entrada se elimina visiblemente de la lista o se marca como "incompleta". Para la tecnología involucrada, es lo mismo.
Karma Fusebox
@KarmaFusebox, ¿sabes dónde existe este caché? ¿Está en la memoria del proceso? Si es así, ¿qué proceso? o es mantenido por el núcleo? En un archivo en el disco? ¿en otra parte?
JamesThomasMoon1979
@KarmaFusebox Eliminar una entrada tiene sentido si las entradas también se agregaron manualmente (y por lo tanto tienen el
marcador
7

Solo para complementar todas las otras respuestas, este enlace me pareció muy útil .

En algunos casos, usar ipes más apropiado, como el comando:

# ip -s -s neigh flush all

Los resultados pueden depender de su kernel de Linux.

Saulo Gomes
fuente
Esto funcionó perfectamente para mí. Cualquiera que tenga problemas con otras respuestas debería intentarlo.
jackgu1988
3

Además de las otras buenas respuestas, vale la pena mencionar que es posible eliminar completamente la caché de arp eliminándola. Una de las formas menos dolorosas es:

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

Esto debería eliminar todas las entradas, ya sea en cualquier estado.

Los métodos alternativos incluyen bajar y subir la interfaz y formas similares para hacer que el caché de arp sea completamente eliminado y recreado.

mueca
fuente
1
Esta es la respuesta correcta. Necesitaba exactamente esto. No solo marcando alguna entrada para "incompleto" o "no se ha alcanzado por un tiempo". Gracias.
John Hamilton
0

Sé que esto puede sonar obvio, pero, para aquellos que no están acostumbrados a trabajar con el shell, esta es mi sugerencia:

A partir de la respuesta de @KarmaFusebox, ¿por qué no simplemente obtener los resultados ...? :

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

Le mostrará solo las entradas de caché existentes / activas.
Creo que sigue siendo un comando compatible con POSIX . Y es un método programable , si eso es lo que necesita.

Sopalajo de Arrierez
fuente
Estoy buscando una explicación razonable de por qué se arpcomporta de esta manera. Parece peculiar Tangencialmente, ¿podría arpverse obligado a eliminar las <incomplete>entradas?
JamesThomasMoon1979
Bueno, @ JamesThomasMoon1979, preferiría decir que, en los sistemas que parecen no comportarse de esta manera (es decir, la consola de Windows), realmente lo son. La única diferencia es que no muestran incompleteentradas en el comando arp cache list.
Sopalajo de Arrierez