Инструменты пользователя

Инструменты сайта


icmp

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

icmp [2018/07/17 09:44] (текущий)
Строка 1: Строка 1:
 +====== ICMP ======
 +
 +~~Title: ICMP протокол диагностики перегрузки сети ~~
 +{{htmlmetatags>​
 +metatag-keywords=(icmp)
 +metatag-description=(Не трож фаервол. Не умеешь правильно фильтровать ICMP - не фильтруй вообще! IP фрагментация,​ MTU, MSS, и PMTUD. Расшифровка кодов ICMP сообщений.)
 +}}
 +
 +
 +**ICMP** (Internet Control Message Protocol — межсетевой протокол управляющих сообщений). ICMP является протоколом контрольных сообщений [[IPv4]]. Протокол ICMP используется устройствами сети для отправки управляющих сообщений и сообщений об ошибках на компьютеры и серверы. Существует несколько областей применения протокола ICMP, например,​ объявление об ошибках в сети, объявление о перегрузке сети и устранение неполадок.
 +<note warning>​Не умеешь правильно фильтровать ICMP - не фильтруй вообще!!! - [[ipv4#​ip_fragmentacija_mtu_mss_i_pmtud|IP фрагментация,​ MTU, MSS, и PMTUD]]</​note>​
 +Каждое сообщение протокола ICMP передается по сети внутри пакета IP. Пакеты IP с сообщениями ICMP маршрутизируются точно так же, как и любые другие пакеты,​ без приоритетов,​ поэтому они также могут теряться. Мало того, при большой загруженности сети они могут вызывать дополнительную загрузку маршрутизаторов. Для того, чтобы не вызывать лавины сообщения об ошибках,​ предусмотрели,​ что в случае потери пакетов IP, которые сами "​несут"​ сообщения ICMP об ошибках,​ новые сообщения ICMP об ошибке рождаться не будут.
 +
 +ICMP только сообщает о возникших ошибках отправителю пакета;​ отправитель сам должен связать ошибки с конкретными прикладными программами и предпринять действия по исправлению ошибок. ​
 +
 +Надо отметить,​ что большая часть ошибок исходит от отправителя,​ но другие - нет. Так как ICMP сообщает об ошибках отправителю,​ он не может использоваться,​ чтобы информировать промежуточные маршрутизаторы об ошибках. Например,​ пакет следует по пути через маршрутизаторы М1,​М2,​...,​Мk. Если Мk содержит некорректную информацию о маршрутах и ошибочно отправит пакет на маршрутизатор Ме, то маршрутизатор Мe может лишь сообщить об ошибке отправителю пакета. К сожалению,​ отправитель не отвечает за эту проблему и не может управлять некорректно ведущим себя маршрутизатором Мk. Фактически,​ отправитель не сможет даже определить,​ какой маршрутизатор вызвал эту проблему. ​
 +
 +Почему ограничивают протокол ICMP взаимодействием только с отправителем?​ Потому что IP- пакет содержит поля, которые определяют только отправителя и получателя;​ он не содержит полного описания своего пути через сеть (кроме необычных случаев,​ о которых мы скажем позже). ​
 +
 +Если маршрутизатор обнаруживает ошибку,​ он просто не может узнать,​ какие промежуточные машины обрабатывали этот пакет, и поэтому не может сообщить им об ошибке. Вместо простого удаления пакета этот маршрутизатор использует протокол ICMP, чтобы сообщить отправителю о возникшей проблеме,​ надеясь на то, что администратор сети затем локализует и исправит ошибку.
 +
 +{{ :​icmp-packet.png?​nolink |}}
 +
 +===== Коды 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-сообщения может привести к разглашению некоторой информации о хосте, в то время как другие — привести к модификации таблицы маршрутизации,​ поэтому их необходимо запретить.
 +
 +<note tip>​Обычно выход во внешний мир разрешают ICMP-сообщениям 3, 8, 12, в то время как на вход принимают только 0, 3, 4, 11, 12.</​note>​
 +
 +===== PF и ICMP =====
 +
 +
 +Разрешение ICMP в [[Packet Filter Firewall (PF)]].
 +  - Пример<​code>​
 +# Разрешить входящие ICMP ping пакеты. Остальные ICMP относятся к
 +# TCP/UDP и разрешаются их статами.
 +#
 +pass in on $ext_if inet proto icmp to ($ext_if) icmp-type echoreq code 0
 +</​code>​
 +  - Пример<​code>#​ ICMP Echo
 +pass in log quick inet proto icmp from any to $AllIFs \
 +icmp-type 8 keep state</​code>​
 +  * ICMP Echo Requests: the ICMP packet type used by ping<​code>​
 +icmp_types="​echoreq"​
 +
 +pass in inet proto icmp all icmp-type $icmp_types keep state
 +</​code>​
 +
 +===== ipfw и ICMP =====
 +
 +<code bash>
 +${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 внешний_интерфейс
 +</​code>​
 +===== iptables и ICMP =====
 +
 +Правила для [[iptables]]. Список возможных типов выводится по команде<​file>​
 +# 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
 +</​file>​ Можно указать стандартный числовой код или сообщение. Пропустить все входящие ICMP-эхо-запросы (пинги).
 +<file bash>
 +# iptables -I INPUT -p icmp --icmp-type 8 -j ACCEPT
 +# iptables -I INPUT -p icmp --icmp-type echo-request -j ACCEPT
 +</​file>​
 +Блокирует фрагменты ICMP-пакетов
 +<​file>​
 +iptables -I INPUT -p icmp -f -j DROP
 +</​file>​
 +Рекомендуемые правила для ICMP:
 +<​file>​
 +#!/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 #
 +</​file>​
 +  * опция --reject-with
 +В отличие от цели DROP, где пакет просто отбрасывается,​ в данном случае отправителю будет отправлено IСМР-сообщение «Port unreachable / icmp port unreachable» («Порт недоступен»). С помощью опции --reject-with можно изменить тип ICMP-сообщения:​
 +
 +<​file>​
 +# iptables -A INPUT -s 1.2.3.4 -j REJECT --reject-with icmp-net-unreachable
 +</​file>​
 +
 +У опции --reject-with есть следующие аргументы:<​file>​
 +icmp-net-unreachable — сеть недоступна;​
 +icmp-host-unreachable — узел недоступен;​
 +icmp-port-unreachable — порт недоступен;​
 +icmp-proto-unreahable — неподдерживаемый протокол;​
 +icmp-net-prohibited — сеть запрещена;​
 +icmp-host-prohibited — узел запрещен.
 +</​file>​По умолчанию будет передано сообщение port-unreachable.
 +Вышеперечисленные аргументы являются ICMP error messages.В дополнение к опции --reject-with TCP-пакеты можно отклонить с помощью аргумента tcp-reset, который отправляет RST-сообщения отправителю. Это наилучший с точки зрения безопасности способ,​ нужно обязательно использовать именно его. TCP RST пакеты используются для закрытия TCP соединений.
 +
 +===== Ссылки =====
 +
 +  * [[http://​book.itep.ru/​4/​44/​icmp_444.htm|Протокол передачи команд и сообщений об ошибках (ICMP) Семенов Ю.А. (ГНЦ ИТЭФ)]]
 +  * [[http://​oregontechsupport.com/​articles/​icmp.txt|Advanced ICMP Filtering with iptables]]
  
загрузка...
icmp.txt · Последние изменения: 2018/07/17 09:44 (внешнее изменение)