ICMP
ICMP (Internet Control Message Protocol — межсетевой протокол управляющих сообщений). ICMP является протоколом контрольных сообщений Структура межсетевого протокола IPv4. Протокол ICMP используется устройствами сети для отправки управляющих сообщений и сообщений об ошибках на компьютеры и серверы. Существует несколько областей применения протокола ICMP, например, объявление об ошибках в сети, объявление о перегрузке сети и устранение неполадок.
Каждое сообщение протокола ICMP передается по сети внутри пакета IP. Пакеты IP с сообщениями ICMP маршрутизируются точно так же, как и любые другие пакеты, без приоритетов, поэтому они также могут теряться. Мало того, при большой загруженности сети они могут вызывать дополнительную загрузку маршрутизаторов. Для того, чтобы не вызывать лавины сообщения об ошибках, предусмотрели, что в случае потери пакетов IP, которые сами "несут" сообщения ICMP об ошибках, новые сообщения ICMP об ошибке рождаться не будут.
ICMP только сообщает о возникших ошибках отправителю пакета; отправитель сам должен связать ошибки с конкретными прикладными программами и предпринять действия по исправлению ошибок.
Надо отметить, что большая часть ошибок исходит от отправителя, но другие - нет. Так как ICMP сообщает об ошибках отправителю, он не может использоваться, чтобы информировать промежуточные маршрутизаторы об ошибках. Например, пакет следует по пути через маршрутизаторы М1,М2,…,Мk. Если Мk содержит некорректную информацию о маршрутах и ошибочно отправит пакет на маршрутизатор Ме, то маршрутизатор Мe может лишь сообщить об ошибке отправителю пакета. К сожалению, отправитель не отвечает за эту проблему и не может управлять некорректно ведущим себя маршрутизатором Мk. Фактически, отправитель не сможет даже определить, какой маршрутизатор вызвал эту проблему.
Почему ограничивают протокол ICMP взаимодействием только с отправителем? Потому что IP- пакет содержит поля, которые определяют только отправителя и получателя; он не содержит полного описания своего пути через сеть (кроме необычных случаев, о которых мы скажем позже).
Если маршрутизатор обнаруживает ошибку, он просто не может узнать, какие промежуточные машины обрабатывали этот пакет, и поэтому не может сообщить им об ошибке. Вместо простого удаления пакета этот маршрутизатор использует протокол ICMP, чтобы сообщить отправителю о возникшей проблеме, надеясь на то, что администратор сети затем локализует и исправит ошибку.
Коды 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-сообщения может привести к разглашению некоторой информации о хосте, в то время как другие — привести к модификации таблицы маршрутизации, поэтому их необходимо запретить.
PF и ICMP
Разрешение ICMP в Packet Filter Firewall (PF) межсетевой экран FreeBSD.
- Пример
# Разрешить входящие ICMP ping пакеты. Остальные ICMP относятся к # TCP/UDP и разрешаются их статами. # pass in on $ext_if inet proto icmp to ($ext_if) icmp-type echoreq code 0
- Пример
# 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
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 #
- опция –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 соединений.
📌 Для тестирования скриптов, установщиков VPN, Python ботов рекомендуем использовать надежные VPS на короткий срок. Если вам нужна помощь с более сложными задачами, вы можете найти фрилансера, который поможет с настройкой. Узнайте больше о быстрой аренде VPS для экспериментов и о фриланс-бирже для настройки VPS, WordPress. 📌
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!
7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Китайский VPN Shadowsocks простая установка и настройка
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах