icmp(7) модуль ядра Linux, реализующий протокол IPv4 ICMP

ОПИСАНИЕ

Этот модуль ядра реализует Internet Control Message Protocol, описанный в RFC 792. Он используется для извещения об ошибках и для диагностики. Пользователь не взаимодействует напрямую с этим модулем; вместо этого он работает с другими протоколами в ядре, а они при помощи протокола ICMP передают ошибки на уровень приложения. Кроме того, этот модуль отвечает на ICMP-запросы.

Пользовательский протокол может получать ICMP-пакеты для всех локальных сокетов, если откроет неструктурированный (raw) сокет, используя протокол IPPROTO_ICMP. Более подробную информацию смотрите в raw(7). Типы ICMP-пакетов, передаваемые в сокет, могут быть отфильтрованы с помощью параметра сокета ICMP_FILTER. Пакеты ICMP всегда обрабатываются ядром, даже когда передаются в пользовательский сокет.

Linux ограничивает для каждого получателя поток ICMP-пакетов с сообщениями об ошибках. Количество ICMP_REDIRECT и ICMP_DEST_UNREACH также ограничивается для каждого отправителя приходящих пакетов.

Интерфейсы в /proc

Для настройки некоторых глобальных параметров IP ICMP поддерживает набор интерфейсов в /proc. Эти параметры доступны на чтение и запись через файлы в каталоге /proc/sys/net/ipv4/. Большинство параметров служит для управления ограничением потока пакетов ICMP определённых типов. В Linux 2.2 для ограничения ICMP используется фильтр «протекающего ведра» (token bucket). Значение — задержка в jiffy, отведённая на очистку фильтра после всплеска. Величина jiffy зависит от архитектуры машины, обычно, это 10мс на i386 и около 1мс на alpha и ia64.
icmp_destunreach_rate (в Linux с 2.2 по 2.4.9)
Максимальная частота посылки ICMP-пакетов с типом Destination Unreachable по каждому конкретному маршруту или получателю. Ограничение не влияет на посылку пакетов ICMP_FRAG_NEEDED, необходимых для определения MTU для маршрута.
icmp_echo_ignore_all (начиная с Linux 2.2)
Если значение больше нуля, то Linux будет игнорировать все запросы ICMP_ECHO.
icmp_echo_ignore_broadcasts (начиная с Linux 2.2)
Если значение больше нуля, то Linux будет игнорировать все пакеты ICMP_ECHO, посланные по широковещательным адресам.
icmp_echoreply_rate (в Linux с 2.2 по 2.4.9)
Максимальная частота посылки пакетов ICMP_ECHOREPLY в ответ на запросы ICMP_ECHOREQUEST.
icmp_errors_use_inbound_ifaddr (логический; по умолчанию: выключено; начиная с Linux 2.6.12)
Если выключено, то сообщения ICMP об ошибках посылаются с первичным адресом существующего интерфейса.

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

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

icmp_ignore_bogus_error_responses (логический; по умолчанию: выключено; начиная с Linux 2.2)
Некоторые маршрутизаторы нарушают RFC1122, отправляя фиктивные ответы на широковещательные пакеты. Эти нарушения, обычно, протоколируются предупреждением ядра. Если этот параметр включён, то ядро не будет выдавать такие предупреждения, что позволяет не засорять файл журнала.
icmp_paramprob_rate (в Linux с 2.2 по 2.4.9)
Максимальная частота посылки пакетов ICMP_PARAMETERPROB. Эти пакеты посылаются, когда приходит пакет с ошибочным заголовком IP.
icmp_ratelimit (целое; по умолчанию: 1000; начиная с Linux 2.4.10)
Ограничивает скорость отправки пакетов ICMP для определённого получателя, чьи типы совпадают с icmp_ratemask (смотрите далее). Значение 0 отключает ограничение, иначе указывается минимальная задержка между ответами в миллисекундах.
icmp_ratemask (целое; по умолчанию: смотрите далее; начиная с Linux 2.4.10)
Маска типов ICMP, для которых накладывается ограничение.

Расстановка битов: IHGFEDCBA9876543210
Маска по умолчанию: 0000001100000011000 (0x1818)

Описание битов (смотрите файл include/linux/icmp.h из исходного кода ядра Linux):

0 Ответное эхо
3 Назначение недостижимо *
4 Погасить источник *
5 Перенаправление
8 Запрос эхо
B Время вышло *
C Проблема с параметром *
D Запрос метки времени
E Ответ меткой времени
F Запрос информации
G Ответ информацией
H Запрос маски адреса
I Ответ маской адреса

Для битов, помеченных звёздочкой, ограничение включено по умолчанию (смотрите маску по умолчанию, приведённую ранее).

icmp_timeexceed_rate (в Linux с 2.2 по 2.4.9)
Максимальная частота посылки пакетов ICMP_TIME_EXCEEDED. Эти пакеты посылаются для предотвращения зацикливания, когда пакет прошёл слишком большое количество транзитных участков (hops).
ping_group_range (два целых числа; значение по умолчанию смотрите далее; начиная с Linux 2.6.39)
Диапазон ID групп (минимальный и максимальный ID группы, включительно), которым разрешено создавать сокеты ICMP Echo. По умолчанию «1 0», что означает, что всем группам запрещено создавать сокеты ICMP Echo.

ВЕРСИИ

Поддержка запроса ICMP_ADDRESS была удалена из 2.2.

Поддержка ICMP_SOURCE_QUENCH была удалена из Linux 2.2.

ЗАМЕЧАНИЯ

Так как многие реализации не поддерживают неструктурированные сокеты IPPROTO_ICMP, то использование этой возможности нежелательно при написании переносимых программ.

Пакеты ICMP_REDIRECT не посылаются, если Linux не работает как маршрутизатор. Также, они принимаются только от старых шлюзов, определённых в таблице маршрутизации, причем информация о перенаправлении маршрутов устаревает через некоторое время.

Значения 64-битных временных меток, возвращаемых по ICMP_TIMESTAMP, отсчитываются в миллисекундах с начала Эпохи, 1970-01-01 00:00:00 +0000 (UTC).

В Linux-реализации ICMP для посылки ICMP-пакетов используются неструктурированные сокеты. Такие сокеты могут показываться программой netstat(8), при этом их inode будет равен 0.