ICMP

ICMP (Internet Control Message Protocol — межсетевой протокол управляющих сообщений). ICMP является протоколом контрольных сообщений Структура межсетевого протокола IPv4. Протокол ICMP используется устройствами сети для отправки управляющих сообщений и сообщений об ошибках на компьютеры и серверы. Существует несколько областей применения протокола ICMP, например, объявление об ошибках в сети, объявление о перегрузке сети и устранение неполадок.

Не умеешь правильно фильтровать ICMP - не фильтруй вообще!!! - IP фрагментация, MTU, MSS, и PMTUD

Каждое сообщение протокола ICMP передается по сети внутри пакета IP. Пакеты IP с сообщениями ICMP маршрутизируются точно так же, как и любые другие пакеты, без приоритетов, поэтому они также могут теряться. Мало того, при большой загруженности сети они могут вызывать дополнительную загрузку маршрутизаторов. Для того, чтобы не вызывать лавины сообщения об ошибках, предусмотрели, что в случае потери пакетов IP, которые сами "несут" сообщения ICMP об ошибках, новые сообщения ICMP об ошибке рождаться не будут.

ICMP только сообщает о возникших ошибках отправителю пакета; отправитель сам должен связать ошибки с конкретными прикладными программами и предпринять действия по исправлению ошибок.

Надо отметить, что большая часть ошибок исходит от отправителя, но другие - нет. Так как ICMP сообщает об ошибках отправителю, он не может использоваться, чтобы информировать промежуточные маршрутизаторы об ошибках. Например, пакет следует по пути через маршрутизаторы М1,М2,…,Мk. Если Мk содержит некорректную информацию о маршрутах и ошибочно отправит пакет на маршрутизатор Ме, то маршрутизатор Мe может лишь сообщить об ошибке отправителю пакета. К сожалению, отправитель не отвечает за эту проблему и не может управлять некорректно ведущим себя маршрутизатором Мk. Фактически, отправитель не сможет даже определить, какой маршрутизатор вызвал эту проблему.

Почему ограничивают протокол ICMP взаимодействием только с отправителем? Потому что IP- пакет содержит поля, которые определяют только отправителя и получателя; он не содержит полного описания своего пути через сеть (кроме необычных случаев, о которых мы скажем позже).

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

Расшифровка кодов ICMP сообщений:

  • echo reply (0) — echo reply (echo-ответ, пинг)
  • destination unreachable (3) — destination unreachable/destination port unreachable (адресат недосягаем). Код 3/4 уведомляет о необходимости фрагментации сообщения, отправитель получает его, меняет свой MSS на еще более меньший.
  • source quench (4) — source quench (подавление источника, просьба посылать пакеты медленнее)
  • redirect (5) — redirect (редирект)
  • echo request (8) — echo request (echo-запрос, пинг)
  • router adver-tisement (9) — router advertisement (объявление маршрутизатора)
  • router solicitation(10) — router solicitation (ходатайство маршрутизатора)
  • time-to-live exceeded (11) — time-to-live exceeded (истечение срока жизни пакета)
  • IP header bad (12) — IP header bad (неправильный IP заголовок пакета)
  • timestamp request (13) — timestamp request (запрос значения счетчика времени)
  • timestamp reply (14) — timestamp reply (ответ на запрос значения счетчика времени)
  • information request (15) — information request (запрос информации)
  • information reply (16) — information reply (ответ на запрос информации)
  • address mask request (17) — address mask request (запрос маски сети)
  • address mask reply (18) — address mask reply (ответ на запрос маски сети)

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

Обычно выход во внешний мир разрешают ICMP-сообщениям 3, 8, 12, в то время как на вход принимают только 0, 3, 4, 11, 12.

Разрешение ICMP в Packet Filter Firewall (PF) (обновление 2018.08).

  1. Пример
    # Разрешить входящие ICMP ping пакеты. Остальные ICMP относятся к
    # TCP/UDP и разрешаются их статами.
    #
    pass in on $ext_if inet proto icmp to ($ext_if) icmp-type echoreq code 0
  2. Пример
    # ICMP Echo
    pass in log quick inet proto icmp from any to $AllIFs \
    icmp-type 8 keep state
  • ICMP Echo Requests: the ICMP packet type used by ping
    icmp_types="echoreq"
    
    pass in inet proto icmp all icmp-type $icmp_types keep state
${fwcmd} add 00300 allow icmp from any to внешний_IP in via внешний_интерфейс icmptype 0,3,4,11,12
${fwcmd} add 00301 allow icmp from внешний_IP to any out via внешний_интерфейс icmptype 3,8,12
${fwcmd} add 00304 allow icmp from внешний_IP to any out via внешний_интерфейс frag
${fwcmd} add 00305 deny log icmp from any to any in via внешний_интерфейс

Правила для Руководство по iptables: Настройка и оптимизация фаервола Linux. Список возможных типов выводится по команде

# iptables -p icmp -h

Valid ICMP Types:
any
echo-reply (pong)
destination-unreachable
   network-unreachable
   host-unreachable
   protocol-unreachable
   port-unreachable
   fragmentation-needed
   source-route-failed
   network-unknown
   host-unknown
   network-prohibited
   host-prohibited
   TOS-network-unreachable
   TOS-host-unreachable
   communication-prohibited
   host-precedence-violation
   precedence-cutoff
source-quench
redirect
   network-redirect
   host-redirect
   TOS-network-redirect
   TOS-host-redirect
echo-request (ping)
router-advertisement
router-solicitation
time-exceeded (ttl-exceeded)
   ttl-zero-during-transit
   ttl-zero-during-reassembly
parameter-problem
   ip-header-bad
   required-option-missing
timestamp-request
timestamp-reply
address-mask-request
address-mask-reply

Можно указать стандартный числовой код или сообщение. Пропустить все входящие ICMP-эхо-запросы (пинги).

# iptables -I INPUT -p icmp --icmp-type 8 -j ACCEPT
# iptables -I INPUT -p icmp --icmp-type echo-request -j ACCEPT

Блокирует фрагменты ICMP-пакетов

iptables -I INPUT -p icmp -f -j DROP

Рекомендуемые правила для ICMP:

#!/bin/sh

IPT="/sbin/iptables"

$IPT -A INPUT -p icmp --icmp-type 3 -j ACCEPT # destination-unreachable 3/4
$IPT -A INPUT -p icmp --icmp-type 8 -j ACCEPT # echo request
$IPT -A INPUT -p icmp --icmp-type 12 -j ACCEPT # IP header bad 
$IPT -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT #
$IPT -A OUTPUT -p icmp --icmp-type 3 -j ACCEPT #
$IPT -A OUTPUT -p icmp --icmp-type 4 -j ACCEPT #
$IPT -A OUTPUT -p icmp --icmp-type 11 -j ACCEPT #
$IPT -A OUTPUT -p icmp --icmp-type 12 -j ACCEPT #
  • опция –reject-with

В отличие от цели DROP, где пакет просто отбрасывается, в данном случае отправителю будет отправлено IСМР-сообщение «Port unreachable / icmp port unreachable» («Порт недоступен»). С помощью опции –reject-with можно изменить тип ICMP-сообщения:

# iptables -A INPUT -s 1.2.3.4 -j REJECT --reject-with icmp-net-unreachable

У опции –reject-with есть следующие аргументы:

icmp-net-unreachable — сеть недоступна;
icmp-host-unreachable — узел недоступен;
icmp-port-unreachable — порт недоступен;
icmp-proto-unreahable — неподдерживаемый протокол;
icmp-net-prohibited — сеть запрещена;
icmp-host-prohibited — узел запрещен.

По умолчанию будет передано сообщение port-unreachable. Вышеперечисленные аргументы являются ICMP error messages.В дополнение к опции –reject-with TCP-пакеты можно отклонить с помощью аргумента tcp-reset, который отправляет RST-сообщения отправителю. Это наилучший с точки зрения безопасности способ, нужно обязательно использовать именно его. TCP RST пакеты используются для закрытия TCP соединений.

PQ VPS сервера в 28+ странах.