ICMP — что это, типы сообщений и команды настройки | Глоссарий FREEHOSTING

ICMP

Internet Control Message Protocol
ICMP — Служебный протокол сетевого уровня IP-стека. Используется для передачи диагностических и управляющих сообщений: недостижимость хоста, превышение TTL, эхо-запросы. На ICMP построены утилиты ping и traceroute, а также механизмы Path MTU Discovery.

Определение простыми словами

ICMP — это «голос» IP-стека. Сам IP пересылает пакеты, но ничего не говорит о том, дошли они или нет. ICMP заполняет этот пробел: возвращает сообщения о недоступности хоста, истечении времени жизни (TTL), необходимости фрагментации, переадресации маршрута. Прикладные программы ICMP не используют для данных — он нужен ядру и сетевому оборудованию для отладки и обратной связи.

Существует две версии: ICMP для IPv4 и ICMPv6 для IPv6. В IPv6 на ICMP завязано даже автообнаружение соседей (Neighbor Discovery), поэтому полностью блокировать его в IPv6-сетях нельзя — сеть просто перестанет работать.

Сравнение

Тип сообщения Код Назначение
Echo Request / Reply 8 / 0 Базовая утилита ping
Destination Unreachable 3 Хост, сеть или порт недостижимы
Time Exceeded 11 TTL пакета закончился (используется в traceroute)
Redirect 5 Маршрутизатор предлагает лучший шлюз
Fragmentation Needed 3 / 4 Path MTU Discovery

Кейсы использования

  • Диагностика связности — ping показывает, доходят ли пакеты до удалённого хоста и каков RTT.
  • Анализ маршрута — traceroute и mtr опираются на ICMP Time Exceeded для построения цепочки хопов.
  • Path MTU Discovery — отправитель узнаёт максимальный размер пакета без фрагментации.
  • Контроль работоспособности в системах мониторинга (Zabbix, Prometheus blackbox-exporter).
  • Негатив: тотальный блок ICMP «для безопасности» ломает PMTUD, traceroute и IPv6 Neighbor Discovery. Нужно ограничивать rate-limit, а не запрещать целиком.

Технические детали

Минимальный набор команд для проверки и фильтрации ICMP в Linux.

# Эхо-запрос — 4 пакета, таймаут 2 сек, размер 1472 байт
ping -c 4 -W 2 -s 1472 1.1.1.1

# Трассировка маршрута через ICMP (по умолчанию UDP)
traceroute -I example.com

# Разрешить только эхо-запрос/ответ и ограничить 5 пакетами в секунду
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 5/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p icmp -j DROP

# В IPv6 правильнее разрешить весь служебный ICMPv6
ip6tables -A INPUT -p ipv6-icmp -j ACCEPT

Полностью отключать ICMP на хосте через ядро (net.ipv4.icmp_echo_ignore_all=1) допустимо только если вы понимаете, что теряете возможность диагностики.

Частые вопросы

Почему ping работает, а сайт не открывается?

ICMP проходит на уровне IP, но веб работает по TCP/443. Если порт закрыт фаерволом или nginx не слушает, сайт не откроется. Ping подтверждает только связность IP, не сервиса.

Безопасно ли блокировать ICMP полностью?

Нет. Это ломает PMTUD (вы получите проблемы с большими пакетами), traceroute и в IPv6 — Neighbor Discovery. Лучше оставлять echo и time-exceeded с rate-limit.

Чем ICMP отличается от ICMPv6?

ICMPv6 шире по функциям: помимо диагностики он отвечает за обнаружение соседей и автоконфигурацию IPv6-адресов. У него отдельный номер протокола 58 и другой набор типов.