Author: Anonymous
Category: education
Date: 2021-05-08 05:00
Slug: como-agregar-o-eliminar-una-entrada-arp-estatica-en-gnu-linux
Image: 2021/05/arp.jpg
Tags: arp, arp estática, arp quitar
Title: 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

    :::console
    $ 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

    :::console
    $ arp -a -n

salida:

    :::bash
    ? (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

    :::console
    $ doas arp -d 10.0.0.2

Verificar:

    :::console
    $ arp -a -n

salida:

    :::bash
    ? (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.

    :::console
    $ doas nano -w /etc/ethers

Entrada de ejemplo:

    :::bash
    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`.

    :::console
    $ 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`:

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

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

    :::console
    $ doas nano -w /sbin/ifup-local

Entrada:

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

Asignamos persmisos de ejecución:

    :::console
    $ 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

    :::console
    $ 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:

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

Con el contenido:

    :::bash
    #!/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:

    :::console
    $ 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.
