Определение простыми словами
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 и другой набор типов.