lunes, enero 22, 2007

Configuración avanzada de TCP/IP en Linux (III): Configuración y manejo de las tablas arp y ndisc de las tablas arp a través de ip neigh

Cuando existen varios ordenadores conectados al mismo medio compartido - como puede ser una ethernet - es necesario encontrar que direcciones MAC de cada uno de ellos para poder comunicarse entre los mismos, así como la dirección MAC de los routers que enviarán los paquetes. El protocolo que se usa en TCP/IP para este trabajo recibe el nombre de ARP, y la información que se obtiene se almacena en las tablas ARP del sistema. Además, se esta utilidad maneja las tablas para el uso de proxy arp y ndisc (el protocolo para descubrir máquinas vecinas en la misma red en IPv6). En la terminología de Linux, esta tabla se denomina la tabla de vecinos.

Las tablas de vecinos (o tablas arp)

La manera más sencilla de ver esta tabla es usar el comando ip neigh ls (puede sustituirse ls por show):

terron@menzoberrazan:~$ ip neigh ls
192.168.1.5 dev ath0 lladdr yy:yy:yy:yy:yy:yy nud reachable
192.168.1.1 dev ath0 lladdr xx:xx:xx:xx:xx:xx nud stale

El formato de la tabla es sencillo. En primer lugar está la dirección IP (192.168.1.5 o 192.168.1.1), el dispositivo a través del cual se ha resuelto (en este caso la eth0), la direción de MAC (lladdr significa link layer address), el estado de alcance (nud es neighbourd unrechability deteccion). En este caso la primera entrada está reachable y la segunda stale. Este estado de alcance da información sobre la validez de la entrada en la tabla. Puede ser cualquiera de estos valores:

  • none: El estado de la entrada es vacío.
  • incomplete: Se ha producido una petición y el sistema está intentando averiguar la dirección mac asociada.
  • reachable: La entrada de la tabla es válida y alcanzable.
  • stale: La entrada de la tabla es válida pero no se sabe si es alcanzable. En caso de usarse la entrada el núcleo intentará comprobar su validez.
  • delay: Se ha lanzado un paquete usando una entrada de la tabla cuyo estado es delay. Se está esperando confirmación.
  • probe: El contador de tiempo asociado al estado delay ha terminado. El kernel está usando pruebas ARP o NDISC para verificar si el vecino al cual hace referencia la tabla es alcanzable.
  • failed: La resolución ha fallado.
  • noarp: La entrada es válida sin necesidad de usar protocolos arp o ndisc.
  • permanent: Entrada creada por el administrador. Es de tipo noarp.
  • router: Se trata de una entrada asociada a NDISC - IPv6 - que indica que el vecino es un router.

Para facilitar la extración de información de la tabla siempre podemos especificar filtros que nos faciten la información que queremos obtener. La sintaxís en este caso es:

ip neigh show [ to PREFIX ] [ dev DEV ] [ nud STATE ]

Podemos elegir que direcciones queremos ver con to, donde PREFIX no es más que una combinación de red o un host, podemos ver las entradas asociadas a un dispositivo usando dev o las entradas según el estado usando nud. Por ejemplo para ver todas las entradas asociadas al dispositivo eth0 se usaría:

ip neigh show dev eth0

Estas tablas llevan asociados contadores que manejan su tiempo de vida. Una vez que expira alguno de los contadores se produciran las acciones que llevan asociadas (por ejemplo sacar de la tabla una entrada no usada durante cierto tiempo). Los contadores puede accederse con la opción -s del comando ip.

Si estamos realizando pruebas de red, y tenemos problemas, podemos usar este comando para poder en primer lugar, ver si existe resolucion ARP. Un simple ping a una máquina y que no responda, podemos verificar la tabla de vecinos, y si no la entrada correspondiente está en failed es que no tenemos resolución arp.

En los Unix tradicionales está el comando arp para obtener esta información. Por ejemplo arp -na nos mostraría toda la tabla de vecinos del kernel.

Podemos manejar administrativamente la tabla con las órdenes add,del,change o replace, o bien borrarla complega con flush. El estado de detección puede fijarse a permanent,noarp,stale o reachable.

La sintáxis completa del comando es:

ip neigh { add | del | change | replace } { ADDR [ lladdr LLADDR ]
         [ nud { permanent | noarp | stale | reachable } ]

De esta manera podemos añadir entradas permanentes a la tablas de vecinos. Por ejemplo si quisieramos que en la interfaz eth0 la máquina 192.168.5.1 tuviese siempre la mac 11:22:33:44:55:66

ip neigh add 192.168.5.1 lladdr 11:22:33:44:55 dev eth0 nud permanent
Así se consigue que cualquier resolución MAC por eth0 hacía esa dirección utilice la dirección MAC que hemos configurado.

Si queremos borrar toda la resolución usamos ip neigh del. En este caso debemos especificar la dirección IP que queramos borrar, así como la interfaz por donde se ha producido la resolución:

ip neigh del 192.168.1.1 dev eth0
No deben de modificarse aquellas entradas NOARP añadidas por el kernel.

Para borrar toda la tabla, usamos un simple ip neigh flush. Por último comentar en la posibilidad de modificar un parámetro de una resolución con un ip neigh change

Proxy ARP

Existen circunstancias donde puede ser necesario el uso de un proxy ARP, es decir, que nuestra máquina responsa a peticiones ARP o NDISC en lugar del ordenador real (por ejemplo, por la existencia de un NAT). Para ello usamos la opción proxy que tiene el comando:
ip neigh proxy DIR [dev NAME]
De esta manera el sistema responderá con su dirección MAC a cualquier solicitud que busque la dirección MAC asociada con la dirección IP DIR. Si no se añade el nombre de la interfaz, responderá por todas las interfaces. En caso contrario,sólo con la señalada.

Technorati Tags: ,

2 comentarios:

edidanilo dijo...

amigo te felicito por este aporte pero necesito autenticar con el comando asi: ip neig replace 192.168.0.3 lladdr 00:08:02:90:9D:04 dev eth0 nud perm.

y no se ni como hacer el escript ni donde ubicarlo , me podrias ayudar con esa informacion ya que tengo una red de 100 pcs y necesito autenticar con la ip y la mac ya que existe gente mal intensionada que esta conectando router inalambricos y conectandose a la red.

gracias por tus comentarios

Anónimo dijo...

excelente