ICMP: ping, traceroute и служебные сообщения
Что возит ICMP, как устроены ping и traceroute, почему блокировать ICMP целиком вредно.
Служебный протокол, а не транспорт
ICMP (Internet Control Message Protocol) не переносит данные приложений. У него нет портов, и сокет под него не открывают. Его работа — служебные сообщения о судьбе IP-пакетов: «адресат недостижим», «время жизни истекло», «я живой».
Главные типы сообщений:
- echo request / echo reply — «ты живой?» и ответ, на них построен ping;
- destination unreachable — пакет не доехал: нет маршрута, порт закрыт, запрещено файрволом;
- time exceeded — у пакета кончился TTL, на этом построен traceroute.
ping
ping шлёт echo request и меряет время до echo reply:
$ ping -c 3 10.0.0.5
64 bytes from 10.0.0.5: icmp_seq=1 ttl=63 time=0.41 ms
64 bytes from 10.0.0.5: icmp_seq=2 ttl=63 time=0.38 ms
64 bytes from 10.0.0.5: icmp_seq=3 ttl=63 time=0.40 ms
Ping отвечает на вопрос «жив ли хост и какая до него задержка». Но молчание не доказывает, что хост мёртв: echo часто режут файрволом, при этом сервис на TCP-порту работает. Проверил ping, проверь и порт.
traceroute
У каждого IP-пакета есть TTL (time to live): счётчик, который каждый маршрутизатор уменьшает на единицу. Дошёл до нуля, и пакет выбрасывается, а отправителю летит ICMP time exceeded.
traceroute пользуется этим намеренно: шлёт пакеты с TTL=1, потом TTL=2 и
так далее. Каждый следующий маршрутизатор по пути убивает свой пакет и
выдаёт себя ответом time exceeded. Так строится список узлов до цели.
$ traceroute -n izidevops.com
1 192.168.1.1 0.8 ms
2 10.20.0.1 3.1 ms
3 * * *
4 5.35.11.49 12.4 ms
Строка * * * — узел, который не шлёт time exceeded. Это нормально и не
означает обрыв: пакеты сквозь него проходят.
Почему нельзя блокировать весь ICMP
Соблазн «запретить ICMP, чтобы нас не пинговали» ломает больше, чем защищает. Через ICMP работает Path MTU Discovery: если по пути есть звено с меньшим MTU, маршрутизатор сообщает об этом ICMP-сообщением fragmentation needed. Заблокировали его, и большие пакеты молча пропадают.
Выглядит это как мистика: ping ходит, маленькие запросы работают, а большой POST или git push зависает навсегда. Если нужно спрятаться от ping, режь именно echo request, а не весь протокол.
Что важно запомнить
ICMP — служебные сообщения об IP-пакетах, не транспорт данных и без портов.
ping = echo request + echo reply. Молчание ping не доказывает, что хост мёртв.
traceroute строит маршрут на TTL и ответах time exceeded; * * * — узел
молчит, но трафик пропускает.
Полная блокировка ICMP ломает Path MTU Discovery: большие пакеты начинают молча теряться.
В следующем уроке — NAT: как приватная сеть выходит в интернет через один адрес.
Дрилл · вопросы как на собесе
Проверь себя без подсказок
Сформулируй ответ вслух или письменно, потом раскрой и честно отметь: знал или нет.
Что такое ICMP?
NET-015Прошли материал до конца? Отметьте урок пройденным.
Прогресс сохранён в этом браузере
Почистишь историю или откроешь с телефона, и отметки пропадут. Оставь почту, они переедут в аккаунт. Пароль придумывать не нужно.
Готово. теперь в аккаунте: прогресс виден с любого устройства. Мой прогресс