ARP(7) | Руководство программиста Linux | ARP(7) |
arp - модуль ядра Linux для ARP
Этот модуль ядра реализует Address Resolution Protocol (протокол разрешения адресов), определённый в RFC 826. Протокол предназначен для преобразования аппаратных адресов второго уровня (Layer2) в адреса протокола IPv4 в соединённых напрямую сетях. Как правило, пользователю не приходится работать с этим модулем непосредственно, исключая случаи его настройки — модуль используется другими протоколами ядра.
Процесс пользователя может получать пакеты ARP через сокеты packet(7). Кроме того, существует механизм управления кэшем ARP из пространства пользователя с помощью сокетов netlink(7). Таблицей ARP также можно управлять с помощью ioctl (2) из произвольного сокета AF_INET.
Модуль ARP поддерживает кэш отображения аппаратных адресов в протокольные адреса. Размер кэша ограничен, поэтому старые и мало используемые записи удаляются. Записи, помеченные как постоянные, не удаляются никогда. Кэшем можно управлять непосредственно, с помощью ioctl-вызовов. Работа кэша может быть настроена с помощью интерфейсов /proc, описанных ниже.
Если в течение некоторого времени (см. /proc интерфейсы ниже) не подтверждается корректность (positive feedback) существующей записи кэша, то она считается устаревшей. Подтверждение может быть получено от более высокого уровня, например, при получении TCP ACK. Другие протоколы могут выполнить подтверждение, используя флаг MSG_CONFIRM при вызове sendmsg(2). Если подтверждения нет, то ARP пытается повторить запрос. Сначала он пытается запросить обновлённый MAC-адрес у локальной службы arp app_solicit раз. Если получить адрес не удалось, а старый MAC-адрес известен, то посылается адресный запрос ucast_solicit раз. Если и после этого адрес определить не удалось, то по сети посылается новый широковещательный ARP-запрос. Запросы посылаются только при наличии данных в очереди для отправки.
Linux автоматически добавляет динамическую запись proxy arp, когда система получает запрос адреса, для которого она производит пересылку и если proxy arp включён на принимающем интерфейсе. При наличии маршрута отказа (reject route) добавление proxy arp не производится.
Для всех сокетов AF_INET доступно три ioctl-вызова. В качестве параметра ожидается указатель на структуру struct arpreq.
struct arpreq { struct sockaddr arp_pa; /* адрес протокола */ struct sockaddr arp_ha; /* аппаратный адрес */ int arp_flags; /* флаги */ struct sockaddr arp_netmask; /* сетевая маска адреса протокола */ char arp_dev[16]; };
Вызовы SIOCSARP, SIOCDARP и SIOCGARP соответственно устанавливают, удаляют и считывают отображение ARP. Для установки или удаления отображений ARP процесс должен иметь мандат CAP_NET_ADMIN или эффективный UID, равный 0.
Поле arp_pa должно быть сокетом AF_INET, а arp_ha должно иметь тот же тип, что и тип устройства, указанный в arp_dev. Поле arp_dev — строка с именем устройства, оканчивающаяся нулем.
arp_flags | |
флаг | значение |
ATF_COM | Поиск окончен |
ATF_PERM | Постоянная запись |
ATF_PUBL | Анонсировать запись |
ATF_USETRAILERS | Требуются концевики |
ATF_NETMASK | Использовать маску сети |
ATF_DONTPUB | Не отвечать |
Если установлен флаг ATF_NETMASK, то должно быть указано корректное значение arp_netmask. Linux 2.2 не поддерживает сетевые записи proxy ARP, поэтому для удаления существующих записей proxy arp это значение должно быть равно 0xffffffff или 0. Флаг ATF_USETRAILERS считается устаревшим и не должен использоваться.
ARP поддерживает /proc интерфейсы для настройки общих параметров или параметров конкретного сетевого интерфейса. Настройка осуществляется путём чтения или записи файлов /proc/sys/net/ipv4/neigh/*/*. Для каждого сетевого интерфейса в системе существует соответствующий каталог в /proc/sys/net/ipv4/neigh/. Настройки в каталоге «default» используются для всех новых создаваемых устройств. Если не определено явно, то считается, что время указывается в секундах.
В Linux 2.0 в структуру struct arpreq было включено поле arp_dev и изменены номера ioctl. Старые ioctl были удалены в Linux 2.2.
Поддержка записей proxy arp для сетей (маска сети не равна 0xffffffff) удалена в Linux 2.2. Вместо этого было реализовано автоматическое определение ядром всех доступных узлов через другие интерфейсы (если на интерфейсе включена пересылка и proxy arp).
Интерфейсы neigh/* не существовали до версии Linux 2.2.
Значения некоторых настроек указаны в тиках, длительность которых зависит от архитектуры компьютера и версии ядра; смотрите time(7).
Не существует способа отправить подтверждение из пользовательского пространства. Это означает, что протоколы, ориентированные на соединения и реализованные в пользовательском пространстве, будут создавать избыточный ARP-трафик, так как ndisc будет вновь и вновь запрашивать MAC-адрес. То же относится и к некоторым протоколам ядра (например, NFS через UDP).
В этой странице дано описание возможностей IPv4, а также общих возможностей IPv4 и IPv6.
capabilities(7), ip(7), arpd(8)
Описание ARP приведено в RFC 826. Определение соседних машин согласно IPv6 и основные используемые алгоритмы приведены в RFC 2461. В Linux 2.2+ IPv4 ARP используются алгоритмы IPv6 (если это возможно).
2017-09-15 | Linux |