Cómo agregar o eliminar una entrada ARP estática en GNU+Linux

ARP (abreviatura de "Protocolo de resolución de direcciones") es un protocolo de red que se utiliza para asignar una dirección de red IP a una dirección MAC de hardware correspondiente.

Cuando el host X quiere comunicarse con el host Y, X primero transmite una solicitud ARP en su red local para obtener la dirección MAC de Y.

Una vez que X recibe la respuesta ARP que contiene la dirección MAC de Y, X usa la información para construir tramas Ethernet destinadas a Y.

La información de mapeo de direcciones IP/MAC así obtenida se almacena en caché en la tabla ARP local, de modo que el proceso de consulta ARP se puede omitir posteriormente.

Pueden surgir problemas cuando, por cualquier motivo, el host X no recibe respuestas ARP para un host de destino Y con el que desea comunicarse. En otros casos, las respuestas ARP entran, pero contienen una dirección MAC asociada con un host Z incorrecto.

Tales respuestas ARP corruptas resultarán en secuestro de tráfico, donde el tráfico que debería haber sido enviado a Y termina llegando al host Z.

Al tratar con este tipo de situaciones anormales inducidas por ARP, es útil poder agregar entradas ARP estáticas manualmente en la tabla ARP almacenada en caché local. Cuando se encuentra una dirección MAC de un host de destino Y en la tabla ARP local, no es necesario enviar solicitudes ARP.

Agregar una entrada ARP estática a la tabla ARP local

$ doas arp -s 10.0.0.2 00:0c:29:c0:94:bf

Este comando le dice a la tabla ARP local que el host con la dirección IP 10.0.0.2 tiene la dirección MAC 00:0c:29:c0:94:bf. Una vez que haya configurado una entrada ARP estática, puede verificar que

$ arp -a -n

salida:

? (192.168.10.47) at e0:db:55:ce:13:f1 [ether] on eth0
? (192.168.10.1) at 00:e0:b1:cb:07:30 [ether] on eth0
? (10.0.0.2) at 00: 0c: 29: c0: 94: bf [ether] PERM on eth1

Como puede ver arriba, la entrada ARP configurada estáticamente aparece correctamente, marcada como "PERM" en la tabla ARP.

Eliminar una entrada ARP estática de la tabla ARP local

$ doas arp -d 10.0.0.2

Verificar:

$ arp -a -n

salida:

? (135.112.29.47) at e0:db:55:ce:13:f1 [ether] on eth0
? (135.112.29.1) at 00:e0:b1:cb:07:30 [ether] on eth0
? (10.0.0.2) at <incomplete> on eth1

Tenga en cuenta que cualquier entrada de ARP agregada por el comando arp en tiempo de ejecución como el anterior no permanece de manera persistente entre los reinicios. Para agregar una entrada ARP estática de forma permanente, lo que puede hacer es cargar entradas ARP desde un archivo externo automáticamente cuando una interfaz de red está activa. Para eso, primero cree un archivo que contenga entradas ARP estáticas.

$ doas nano -w /etc/ethers

Entrada de ejemplo:

00:0c:29:c0:94:bf 10.0.0.2
00:0c:59:44:f0:a0 10.0.0.5
. . . .

El comando arp le permite cargar cualquier archivo externo usando la opción -f.

$ doas arp -f /etc/ethers

Ahora debe configurar el comando anterior para que se ejecute automáticamente cuando una interfaz de red determinada (por ejemplo, eth0) esté activa. Hay formas específicas de distribución para ejecutar un comando de inicio para interfaces de red. A continuación se muestran ejemplos específicos de la distribución.

Aquí supongo que no está utilizando NetworkManager en su sistema GNU con Linux. Entonces, si está utilizando NetworkManager, primero tendrá que deshabilitarlo.

En Trisquel o Debian, agregue la siguiente entrada en /etc/network/interfaces:

iface wlan0 inet dhcp
. . .
post-up arp -f /etc/ethers

En CentOS, RHEL o Fedora, escriba el siguiente script ejecutable:

$ doas nano -w /sbin/ifup-local

Entrada:

#!/bin/sh
if [[ "$1" == "eth0" ]]
then
arp -f /etc/ethers
else
#DO_NOTHING
fi

Asignamos persmisos de ejecución:

$ doas chmod +x /sbin/ifup-local

Tengo algunos dispositivos IP bastante tontos en una subred con un servidor Trisquel, y el servidor recibe datos de transmisión de cada dispositivo. Me he encontrado con un problema en el sentido de que cuando se emite una solicitud ARP al dispositivo mientras está transmitiendo datos al servidor, la solicitud se ignora, la entrada de caché se agota y el servidor deja de recibir la transmisión.

Entonces, para evitar que el servidor envíe solicitudes ARP a estos dispositivos por completo, me gustaría agregar una entrada ARP estática para cada uno, algo como

$ doas arp -i eth2 -s ip.of.the.device mac:of:the:device

Pero estas entradas ARP "estáticas" se pierden si la red está deshabilitada/habilitada o si se reinicia el servidor.

¿Cuál es el mejor lugar para agregar automáticamente estas entradas, preferiblemente en algún lugar que las vuelva a agregar cada vez que se abra la interfaz eth2?

Realmente no quiero tener que escribir un script que monitoree la salida de arp y vuelva a agregar las entradas de caché si faltan.

Edite para agregar cuál fue mi script final:

Escribí este archivo:

$ doas nano -w /etc/network/if-up.d/add-my-static-arp

Con el contenido:

#!/bin/sh
arp -i eth0 -s 192.168.0.4 00:50:cc:44:55:55
arp -i eth0 -s 192.168.0.5 00:50:cc:44:55:56
arp -i eth0 -s 192.168.0.6 00:50:cc:44:55:57

Y luego, obviamente, agregue el permiso para permitir que se ejecute:

$ doas chmod +x /etc/network/if-up.d/add-my-static-arp

Y estas entradas arp se agregarán o volverán a agregar manualmente cada vez que se abra cualquier interfaz de red.

Publicar un comentario en "Cómo agregar o eliminar una entrada ARP estática en GNU+Linux"

Puede formatear su comentario con Markdown. Avatar desde Libravatar