NOMBRE¶
arp - Módulo ARP del núcleo de Linux.
DESCRIPCIÓN¶
Este módulo de protocolo del núcleo implementa el protocolo de
resolución de direcciones (Address Resolution Protocol, ARP) definido en
RFC 826. Se usa para convertir direcciones hardware de la Capa 2 a direcciones
del protocolo IPv4 y viceversa, en redes conectadas directamente. El usuario
normalmente no interactúa directamente con este módulo salvo para
configurarlo. En cambio, proporciona un servicio para otros protocolos dentro
del núcleo.
Un proceso de usuario puede recibir paquetes ARP usando conectores
packet(7). También existe un mecanismo para gestionar la cache ARP
en el espacio de usuario usando conectores
netlink(7). La tabla ARP
también se puede controlar aplicando la llamada
ioctl (2) a
cualquier conector
PF_INET.
El módulo ARP mantiene una cache de asociaciones entre direcciones hardware
y direcciones de protocolo. La cache tiene un tamaño limitado por lo que
las entradas antiguas y menos frecuentemente usadas son elminadas por un
recolector de basura. Las entradas marcadas como permanentes nunca son
eliminadas por el recolector de basura. La caché se puede manipular
directamente mediante ioctls y su comportamiento se puede ajustar mediante las
sysctls definidas más abajo.
Una entrada de la cache de vecinos se considerará caduca cuando no exista
una retroalimentación positiva después de algún tiempo para una
asociación existente (vea las sysctls más abajo). La
retroalimentación positiva puede ser obtenida de una capa superior; por
ejemplo de una confirmación positiva (ACK) de TCP. Otros protocolos
pueden señalizar la progresión del reenvío usando la
opción
MSG_CONFIRM en
sendmsg(2). Cuando no hay
progresión de reenvío ARP vuelve a intentarlo. Primero intenta
consultar a un demonio arp local
app_solicit veces. Si esto falla y se
conoce la antigua dirección MAC, se envía un sondeo unidestino
durante
ucast_solicit veces. Si esto también falla, se
realizará la difusión de una nueva petición ARP a la red. Las
peticiones sólo se envían cuando hay datos encolados para ser
enviados.
Linux automáticamente añadirá una entrada proxy arp no permanente
cuando reciba una petición de una dirección a la que él
reenvía y cuando el proxy arp esté activo en la interfaz receptora.
Cuando existe una ruta de rechazo para un destino, no se añade ninguna
entrada arp.
IOCTLS¶
Existen tres ioctls disponibles en todos los conectores
PF_INET. Toman un
puntero a una estructura
struct arpreq como argumento.
struct arpreq
{
struct sockaddr arp_pa; /* dirección del protocolo */
struct sockaddr arp_ha; /* dirección hardware */
int arp_flags; /* opciones */
struct sockaddr arp_netmask; /* máscara de red de la dirección
de protocolo */
char arp_dev[16];
};
SIOCSARP,
SIOCDARP y
SIOCGARP establecen, borran u obtienen
una asociación ARP, respectivamente. Establecer y borrar asociaciones ARP
son operaciones privilegiadas y sólo pueden ser realizadas por un proceso
con la capacidad
CAP_NET_ADMIN o con un UID efectivo 0.
arp_pa debe ser un conector
AF_INET y
arp_ha debe tener el
mismo tipo que el dispositivo que se especifica en
arp_dev.
arp_dev es una cadena terminada en cero que da el nombre de un
dispositivo.
arp_flags |
|
Bandera |
Significado |
ATF_COM |
Búsqueda completa |
ATF_PERM |
Entrada permanente |
ATF_PUBL |
Publicar entrada |
ATF_USETRAILERS |
Son necesarios terminadores |
ATF_NETMASK |
Usar una máscara de red |
ATF_DONTPUB |
No responder |
Si se activa la bandera
ATF_NETMASK,
arp_netmask debe ser
válida. La versión 2.2 de Linux no soporta entradas de proxy arp de
red, por lo que debería asignar a
arp_netmask el valor 0xffffffff
o 0 para eliminar una entrada proxy arp existente. La opción
ATF_USETRAILERS está obsoleta y no debería usarse.
SYSCTLS¶
El módulo ARP soporta una interfaz sysctl para configurar parámetros
globales o específicos de una interfaz. Se puede acceder a las sysctls
leyendo o escribiendo los ficheros
/proc/sys/net/ipv4/neigh/*/* o con
la interfaz
sysctl(2). Cada interfaz del sistema tiene su propio
directorio en /proc/sys/net/ipv4/neigh/. La configuración del directorio
`por defecto' se usa para todos los dispositivos recién creados. A menos
que se indique otra cosa, las sysctls relacionadas con el tiempo se
especifican en segundos.
- anycast_delay
- Número máximo de unidades de tiempo (jiffies) a
esperar antes de contestar a un mensaje IPv6 de solicitud de vecinos. El
soporte "cualquier dirección" (anycast) todavía no
está implementado. El valor por defecto es de 1 segundo.
- app_solicit
- El número máximo de sondeos a enviar a un demonio
ARP en el espacio de usuario mediante netlink antes de recurrir a sondeos
multidestino (vea mcast_solicit). Por defecto es 0.
- base_reachable_time
- Una vez que se ha encontrado un vecino, la entrada se
considera válida durante, al menos, un valor aleatorio entre
base_reachable_time/2 y 3*base_reachable_time/2. La validez
de una entrada se ampliará si recibe retroalimentación positiva
desde los protocolos de los niveles más altos. El valor por defecto
es de 30 segundos.
- delay_first_probe_time
- Tiempo de espera antes del primer sondeo después de
que se haya decidido que un vecino está caduco. Por defecto es 5
segundos.
- gc_interval
- Periodo con el que el recolector de basura para las
entradas de vecinos debería intentar ejecutarse. Por defecto es de 30
segundos.
- gc_stale_time
- Determina la frecuencia con la que se comprueban las
entradas en busca de vecinos caducos. Cuando la entrada de un vecino se
considera caduca, se resuelve de nuevo antes de enviarle datos. El valor
por defecto es de 60 segundos.
- gc_thresh1
- Número mínimo de entradas a guardar en la cache
ARP. El recolector de basura no se ejecutará si hay menos entradas en
la cache que el número indicado. Por defecto vale 128.
- gc_thresh2
- Número máximo flexible de entradas a guardar en
la cache ARP. El recolector de basura permitirá que el número de
entradas exceda éste límite durante 5 segundos antes de realizar
una recolección. El valor por defecto es de 512 entradas.
- gc_thresh3
- Número máximo estricto de entradas a guardar en
la cache ARP. El recolector de basura se ejecutará siempre si hay
más entradas en la caché que el número indicado. Por
defecto vale 1024.
- locktime
- Número mínimo de unidades de tiempo que debe
permanecer una entrada ARP en la cache. Esto evita la modificación
continua de la cache ARP si hay más de una asociación potencial
(debido, generalmente, a una mala configuración de la red). Por
defecto es 1 segundo.
- mcast_solicit
- Número máximo de intentos para resolver una
dirección mediante multidestino/difusión antes de marcar la
entrada como inalcanzable. El valor por defecto es 3.
- proxy_delay
- Cuando se recibe una solicitud ARP para una dirección
proxy-ARP conocida, esperar hasta proxy_delay unidades de tiempo
antes de responder. Esto se utiliza para evitar inundar la red en algunos
casos. Por defecto vale 0,8 segundos.
- proxy_qlen
- Número máximo de paquetes que se pueden encolar
para direcciones proxy-ARP. Por defecto vale 64.
- retrans_time
- Número de unidades de tiempo a esperar antes de
retransmitir una petición. El valor por defecto es 1 segundo.
- ucast_solicit
- Número máximo de intentos para enviar sondeos
unidestino antes de preguntar al demonio ARP (vea app_solicit). Por
defecto es 3.
- unres_qlen
- Número máximo de paquetes que otras capas de red
pueden encolar para cada dirección sin resolver. Por defecto vale 3.
FALLOS¶
Algunos valores del cronómetro se especifican en unidades de tiempo
(jiffies), cuyo valor dependen de la arquitectura. En los Alpha una unidad de
tiempo es 1/1024 segundos y en la mayoría de arquitecturas es 1/100
segundos.
No hay forma de indicar una retroalimentación positiva desde el espacio de
usuario. Esto significa que los protocolos orientados a conexión
implementados en el espacio de usuario generarán un tráfico ARP
excesivo, debido a que
ndisc volverá regularmente a sondear las
direcciones MAC. El mismo problema es aplicable a algunos protocolos del
núcleo (p.e. NFS sobre UDP).
Esta página de manual mezcla funcionalidad específica de IPv4 y
comportida entre IPv4 e IPv6.
VERSIONES¶
La estructura
struct arpreq cambió en la versión 2.0 de Linux
para incluir el miembro
arp_dev y los números de las ioctls
cambiaron a la misma vez. El soporte para las antiguas ioctls se eliminó
en la versión 2.2 de Linux.
El soporte para entradas proxy arp de red (máscara de red distinta de
0xffffffff) se eliminó en la versión 2.2 de Linux. Se reemplazó
por una configuración proxy arp automática realizada por el
núcleo para todos los anfitriones (hosts) alcanzables a través de
otras interfaces (cuando están activos el reenvío y el proxy arp en
la interfaz).
Los sysctls del tipo neigh/* no existían en versiones de Linux anteriores a
la 2.2.
VÉASE TAMBIÉN¶
ip(7)
RFC826 para una descripción de ARP.
RFC2461 para una descripción del descubrimiento de vecinos de IPv6 y los
algoritmos base utilizados.
La implementación IPv4 ARP de Linux 2.2+ usa los algoritmos IPv6 cuando
éstos son aplicables.