Содержание

ICMP

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

Правила фаервола

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

Правила фаервола, которые не мешают работе ICMP протокола.

# Это правило позволит вашему серверу принимать все ICMP-пакеты, что включает в себя как эхо-запросы (ping), так и другие типы ICMP-сообщений.
iptables -A INPUT -p icmp -j ACCEPT
 
# Это правило позволит вашему серверу принимать все ICMPv6-пакеты, что включает в себя такие сообщения, как эхо-запросы (ping) и другие типы ICMPv6-сообщений.
ip6tables -A INPUT -p icmpv6 -j ACCEPT

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

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

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

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

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

Коды ICMP

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

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

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

PF и ICMP

Разрешение ICMP в Packet Filter Firewall (PF) межсетевой экран FreeBSD.

  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

ipfw и ICMP

${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 и ICMP

Правила для Руководство по 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 #

В отличие от цели 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 соединений.