Команда arp

Команда arp предназначена для задействования одноименной утилиты, осуществляющей манипуляции с ARP-кэшем сетевого стека Linux. ARP (Address Resolution Protocol или протокол разрешения адресов) является протоколом компьютерных сетей, предназначенным для определения MAC-адресов удаленных узлов на основе их известных IP-адресов. Данный протокол реализуется лишь в сетях с IPv4 (в случае IPv6 аналогичный функционал реализован в рамках протокола ICMP) и был стандартизирован в рамках рабочего предложения RFC 826 от ноября 1982 года. Кэш ARP в Linux создается для каждого из сетевых интерфейсов и по сути является ничем иным, как набором пар IP-адрес — MAC-адрес. Утилита arp позволяет просматривать список этих пар, добавлять новые и удалять существующие.

Базовый синтаксис команды выглядит следующим образом:

# arp [параметры] [IP-адрес] [MAC-адрес]

Хотя утилита и может использоваться от лица обычного пользователя для чтения ARP-кэша, любое изменение содержимого этого кэша требует прав суперпользователя. Утилита поддерживает ряд параметров, причем при ее использовании без параметров выводится содержимое ARP-кэша. Параметр -a позволяет вывести содержимое кэша в компактном формате, параметр -n — всегда выводить IP-адреса узлов, даже если известны их имена, параметр -s — добавлять элементы в кэш, параметр -d — удалять элементы из кэша, а параметр -f — добавлять элементы в кэш из файла. Отдельно следует упомянуть о параметре -i, позволяющем указать интересующий сетевой интерфейс. Утилита поддерживает некоторые другие специфические параметры, которые вряд ли понадобятся рядовому пользователю.

Вывод содержимого ARP-кэша реализован в формате таблицы со следующими столбцами:

  • Адрес: IP-адрес узла или его имя, если оно известно.
  • HW-тип: тип аппаратного устройства. Чаще всего это ether (Ethernet), хотя допустимы и такие типы, как ash (Ash), ax25 (AMPR AX.25), netrom (AMPR NET/ROM), rose (AMPR ROSE), arcnet (ARCnet), dlci (Frame Relay DLCI), fddi (Fiber Distributed Data Interface), hippi (HIPPI), irda (IrLAP), x25 (X.25) и eui64 (EUI-64).
  • HW-адрес: MAC-адрес узла (аппаратный адрес).
  • Флаги: флаги записей (C-завершенная, M-добавленная вручную, P-опубликованная).
  • Маска: маска подсети.
  • Интерфейс: сетевой интерфейс, к которому относится запись.

Установка утилиты

В первую очередь вам придется установить рассматриваемую утилиту; проще всего это сделать с помощью терминала путем исполнения соответствующей вашему дистрибутиву команды.

Команда для Linux Mint, Ubuntu, Debian:

# apt-get install net-tools

Команда для Fedora Workstation:

# dnf install net-tools

Примеры использования

Вывод содержимого ARP-кэша

Для вывода содержимого ARP-кэша достаточно использовать утилиту без каких-либо параметров:

$ arp
Адрес                    HW-тип  HW-адрес             Флаги Маска        Интерфейс
192.168.1.250            ether   00:12:34:56:78:c9    C                     enp6s0
_gateway                 ether   00:27:34:56:78:e8    C                     enp6s0
192.168.1.249            ether   00:12:34:56:78:16    C                     enp6s0
192.168.1.251            ether   00:12:34:56:78:cd    C                     enp6s0
192.168.1.252            ether   00:12:34:56:78:fd    C                     enp6s0

Как видно, во второй строке выводится имя узла вместо IP-адреса. Если вам нужны лишь IP-адреса, вы можете воспользоваться параметром -n:

$ arp -n
Адрес                    HW-тип  HW-адрес             Флаги Маска        Интерфейс
192.168.1.250            ether   00:12:34:56:78:c9    C                     enp6s0
192.168.1.1              ether   00:27:34:56:78:e8    C                     enp6s0
192.168.1.249            ether   00:12:34:56:78:16    C                     enp6s0
192.168.1.251            ether   00:12:34:56:78:cd    C                     enp6s0
192.168.1.252            ether   00:12:34:56:78:fd    C                     enp6s0

Если же вас интересует краткий вывод, вы можете использовать параметр -a:

$ arp -a
? (192.168.1.250) в 00:12:34:56:78:c9 [ether] на enp6s0
_gateway (192.168.1.1) в 00:27:34:56:78:e8 [ether] на enp6s0
? (192.168.1.249) в 00:12:34:56:78:16 [ether] на enp6s0
? (192.168.1.251) в 00:12:34:56:78:cd [ether] на enp6s0
? (192.168.1.252) в 00:12:34:56:78:fd [ether] на enp6s0

Очевидно, что во всех случаях выводится аналогичная информация. Основными столбцами являются первый, в котором выводится IP-адрес, третий, в котором выводится MAC-адрес и шестой, в котором выводится имя сетевого интерфейса.

Добавление записей в ARP-кэш

Для добавления записи в ARP-кэш следует использовать параметр -s, указать IP- и MAC-адреса узла. Кроме того, неплохо бы было использовать параметр -i и передать имя сетевого интерфейса. Разумеется, вам потребуются права суперпользователя.

# arp -s 192.168.1.253 00:12:34:56:78:6D -i enp6s0

В случае успешного добавления записи утилита не выведет каких-либо сообщений. Впрочем, факт добавления записи достаточно просто проверить также с помощью рассматриваемой утилиты.

$ arp
Адрес                    HW-тип   HW-адрес            Флаги Маска        Интерфейс
192.168.1.250            ether    00:12:34:56:78:c9   C                     enp6s0
_gateway                 ether    00:27:34:56:78:e8   C                     enp6s0
192.168.1.249            ether    00:12:34:56:78:16   C                     enp6s0
192.168.1.251            ether    00:12:34:56:78:cd   C                     enp6s0
192.168.1.252            ether    00:12:34:56:78:fd   C                     enp6s0
192.168.1.253            ether    00:12:34:56:78:6d   CM                    enp6s0

Обратите внимание на то, что последняя добавленная нами запись содержит флаг M, то есть, отмечена как добавленная вручную.

Удаление записей из ARP-кэша

Для удаления записи из ARP-кэша достаточно использовать параметр -d и указать IP-адрес интересующего узла. Как и раньше, следует добавлять параметр -i и имя сетевого интерфейса, а также обладать правами суперпользователя.

Для начала ознакомимся с содержимым ARP-кэша:

$ arp
Адрес                    HW-тип   HW-адрес             Флаги Маска       Интерфейс
192.168.1.250            ether    00:12:34:56:78:c9    C                    enp6s0
_gateway                 ether    00:27:34:56:78:e8    C                    enp6s0
192.168.1.249            ether    00:12:34:56:78:16    C                    enp6s0
192.168.1.251            ether    00:12:34:56:78:cd    C                    enp6s0
192.168.1.252            ether    00:12:34:56:78:fd    C                    enp6s0
192.168.1.253            ether    00:12:34:56:78:6d    CM                   enp6s0

Попробуем удалить последнюю добавленную нами запись:

# arp -d 192.168.1.253 -i enp6s0

Утилита также не выведет каких-либо сообщений в случае корректной работы. В результате запись будет удалена:

$ arp
Адрес                    HW-тип   HW-адрес             Флаги Маска        Интерфейс
192.168.1.250            ether    00:12:34:56:78:c9    C                     enp6s0
_gateway                 ether    00:27:34:56:78:e8    C                     enp6s0
192.168.1.249            ether    00:12:34:56:78:16    C                     enp6s0
192.168.1.251            ether    00:12:34:56:78:cd    C                     enp6s0
192.168.1.252            ether    00:12:34:56:78:fd    C                     enp6s0

Очевидно, что запись пропала из ARP-кэша.

Добавление записей из файла

Для того, чтобы добавить несколько записей в ARP-кэш, следует подготовить текстовый файл с парами IP-адрес — MAC-адрес и использовать параметр -f утилиты с передачей пути к этому файлу. Разумеется, права суперпользователя также необходимы.

Создадим файл arp.txt со следующим содержимым:

192.168.1.253 00:12:34:56:78:6D
192.168.1.4   CC:73:34:56:78:24

Для добавления записей достаточно использовать параметр -f утилиты:

# arp -f ./arp.txt

Утилита ничего не выводит, что говорит о ее корректной работе. Для проверки также достаточно использовать утилиту arp без параметров:

$ arp
Адрес                     HW-тип  HW-адрес             Флаги Маска        Интерфейс
192.168.1.250             ether   00:12:34:56:78:c9    C                     enp6s0
_gateway                  ether   00:27:34:56:78:e8    C                     enp6s0
192.168.1.249             ether   00:12:34:56:78:16    C                     enp6s0
192.168.1.4               ether   cc:73:34:56:78:24    CM                    enp6s0
192.168.1.251             ether   00:12:34:56:78:cd    C                     enp6s0
192.168.1.252             ether   00:12:34:56:78:fd    C                     enp6s0
192.168.1.253             ether   00:12:34:56:78:6d    CM                    enp6s0

Две новых записи появились в таблице.