Page tree
Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

Интерфейс

"ipfw" - командный интерфейс к пакетному фильтру ipfirewall

Синтаксис:

ipfw

=================================================

list

show | reset

rearrange [N]

flush

quiet | -quiet

del num

mov num1 num2

add[out] [NUM] [IFNAME] rules...

 

rules: [{setpri|addpri}=[N]] accept|reject|rpfilter|pass [log]

   [vlan={N|any|$ACL}] [dot1p=N] [swg=N] [ether={X|any}] [dscp=N|tos=N] [prf]

   -f "pcap filter expression"

   |

   PROTO from [not] ADDR [PORTs] to [not] ADDR [PORTs]

 

   PROTO: [all] | tcp | udp | icmp | arp | proto NUMBER

   ADDR: IP | $LOCAL | $ROUTE | $ACL | mac {x:x:x:x:x:x}

   PORTS: NUM[:NUM] [NUM] ...

Описание

ipfw list

Текущий набор фильтров выводится на консоль.

ipfw show

Выводит все созданные правила "ipfw".

ipfw reset

Обнуляет статиcтику счетчиков срабатывания правил "ipfw".

ipfw flush

Все определённые в данный момент фильтры в обоих (маршрутизирующем и блокирующем) наборах удаляются. Механизм фильтрации отключается.

ipfw add[incoming] [num] . . .
ipfw addout[going] [num] . . .

Эти две команды используются для добавления фильтра в  наборы "addincoming" и "addoutgoing" соответственно. За ключевым словом "add*" следует описание фильтра.

Необязательный параметр num используется для явного указания порядкового номера правила в списке.

ipfw del num

Используются для удаления фильтра из списка.

Удаляемый фильтр указывается своим порядковым номером num, который можно посмотреть командой "ipfw list".

ipfw mov num1 num2

Перемещает фильтр с номером num1 в позицию num2.

ipfw rearrange [N] 

Перенумеровывает все фильтры с инкрементом N (по умолчанию 5).

ipfw [-]quiet

Отключение регистрации отброшенных пакетов. По умолчанию регистрация включена, для отключения её следует выполнить команду "ipfw quiet".

ipfw show

Данная команда показывает счётчики срабатывания для каждого фильтра.

ipfw reset

Команда сбрасывает счетчики срабатывания фильтров.

Фильтры

Синтаксис:

 [[{setpri|addpri}=[N]] accept|reject|rpfilter|pass [log]

  [vlan={N|any|$ACL}] [dot1p=N] [swg=N] [ether={X|any}] [dscp=N|tos=N] [prf]

   -f "pcap filter expression"

   |

   PROTO from [not] ADDR [PORTs] to [not] ADDR [PORTs]

   PROTO: [all] | tcp | udp | icmp | arp | proto NUMBER

Здесь приводится полное описание синтаксических правил для составления пакетных фильтров. В основном рассматривается именно синтаксис (т.е. строка описания фильтра), но и вопросам семантики (т.е. назначению фильтра) тоже уделяется некоторое место.

Общая форма описания фильтра приведена выше в подразделе Синтаксис. Необязательное поле "interface" определяет имя сетевого интерфейса, к которому применим данный фильтр. Имя интерфейса зависит от конкретной модели маршрутизатора и может, например, иметь вид "eth0" или "rf5.0" для обозначения ethernet или радио-интерфейса соответственно. Если поле "interface" задано, то фильтр будет применяться только к тем пакетам, которые поступают или выходят через этот интерфейс.

Параметры "setpri|addpri" позволяют назначить/повысить приоритет пакету, в случае срабатывания данного фильтра. Параметр "setpri" явно изменяет приоритет на указанный в команде. При использовании данного параметра с пустым значением (setpri=), у пакета сбрасывается его приоритет. Параметр "addpri" изменит приоритет только в том случае, если вновь устанавливаемый приоритет выше, чем уже имеющийся у пакета (чем меньше число, тем выше приоритет). То есть с помощью параметра addpri приоритет можно только повысить.

Поле disp (сокращение от disposition) определяет действие, которое должно быть выполнено в случае срабатывания данного фильтра. Возможные значения: accept или reject. Если указано accept, то пакет свободно пройдёт сквозь фильтр. Использование "reject" приводит к тому, что пакет будет отброшен фильтром. Вслед за действием можно указать необязательный параметр "log" ("accept log" или "reject log"), в этом случае при срабатывании фильтра в системный журнал будет занесена соответствующая информация.

Модуль "ipfw" дополнен фильтром "rpfilter" (reverse path filter). Этот фильтр позволяет убедиться, что отправитель пакета действительно доступен через тот интерфейс, через который пакет от него поступил в систему. Если фильтр не срабатывает, то обработка пакета модулем "ipfw" продолжается, иначе пакет уничтожается. Данный фильтр можно вставлять в список правил первым:

ipfw add rpfilter all from 0/0 to 0/0

Поля "disp" может принимать значение “pass”, позволяющее "пропустить" правило, выполнив связанные с ним действия, и продолжить просмотр других правил по списку.

Например,

ipfw add pass log tcp from 0/0 to 0/0

При срабатывании данного правила, работа фильтра продолжится дальше, а информация о пришедшем пакете запишется в журнал.

Параметры "[vlan={N|any|$ACL}] [dot1p=N] [swg=N] [ether={X|any}] [dscp=N|tos=N] [prf]" – представляют собой классификаторы, позволяющие  анализировать VLAN ID, приоритет 802.1p, номер группы коммутации (SWitchGroup), тип пакета (EtherType), а также поле "ip_tos" на наличие конкретного значения метки DSCP или IP precedence. Классификатор prf позволяет включить фильтрацию трафика порождаемого интерфейсами PRF.

В классификаторе "vlan" можно указать несколько VLAN тегов в виде списка "$ACL" (описание списков ACL см. раздел «Списки контроля доступа (команда «acl»)).

При использовании опции "any" в классификаторах "vlan" и "ether" фильтр будет пропускать все тегированные пакеты с любым значением VLAN ID или пакеты любых типов соответственно.

Поле "proto" определяет конкретный протокол семейства IP, используемый фильтром. Возможные значения: tcp, udp, icmp, arp, all либо числовое значение номера протокола.

Необязательное поле "modifiers" может быть использовано для указания некоторых дополнительных характеристик пакета. Они описаны позже.

Обязательное ключевое слово from разделяет поля "proto" и  "modifiers" от адреса источника (endpoint).  Ключевое слово "to" отделяет адрес источника от адреса получателя (endpoint).

"endpoint" определяет адреса источника или получателя. Точный синтаксис полей "endpoint" зависит от значения поля "proto". Если "proto" указан как "all" или "icmp", то "endpoint" содержит адресную информацию. Если  proto задано как "udp" или "tcp" , то "endpoint" содержит адресную информацию и необязательный список портов.

Адресная информация задаётся как IP-адрес и необязательная маска (mask). IP-адрес должен задаваться в традиционном числовом формате (nn.nn.nn.nn). Необязательная маска может быть задана как длиной маски в битах, так и числовым значением в формате (nnn.nnn.nnn.nnn).
Возможные форматы задания адресной информации:

nn.nn.nn.nn
nn.nn.nn.nn:xxx.xxx.xxx.xxx
nn.nn.nn.nn/NN

Двоеточие указывает на то, что маска задана в числовом адресном формате. 

Символ "/"  указывает на использование длины маски (число начальных бит, установленных в единицу, остальные будут установлены в ноль).

Например: 192.168.9.0/24 описывает адрес сети 192.168.9.0  с длиной маской в 24 бита.

Второй вариант:  192.168.9.0:255.255.255.0.

Запись 0/0  описывает все возможные IP-адреса.

Если необходимо составить фильтр, который применяется к нескольким сетевым адресам или группам, то вместо повторения однотипных правил удобнее и эффективнее сгруппировать все фигурирующие адреса в соответствующий список доступа и указать имя списка в качестве IP-адреса ($ACLRULE)

Существует несколько предопределённых динамических ACL списков, которые невозможно построить другим способом.

Список "$LOCAL" включает в себя все локальные адреса, принадлежащие данному маршрутизатору. Его можно использовать для удобной записи фильтров ограничивающих (или разрешающих) доступ к самому устройству.

ipfw add accept all from 0/0 to $LOCAL

Список "$ROUTE" содержит текущую системную таблицу маршрутов, за исключением default route. Совпадение адреса с этим списком означает, что для данного адреса существует точный маршрут и не будет использован маршрут по умолчанию.

ipfw add reject all from 0/0 to not $ROUTE

Для интерфейсов, имеющих физические MAC-адреса в стандарте Ethernet, допускается использовать непосредственно цифровое значение MAC адреса с предшествующим ключевым словом "mac". При этом для входящих фильтров можно указать только MAC-адрес источника, а для исходящих только адрес получателя. Кроме того, вместо числового значения, можно указывать ключевое слово "$BS". В этом случае в качестве числового значения будет использоваться реальный MAC-адрес базовой станции к которой подключен абонентский блок (если таковая имеется).

Следует иметь ввиду, что правила использующие MAC-адреса для входящих пакетов будут обработаны раньше всех остальных правил, а правила для исходящих пакетов, напротив, будут обработаны в самую последнюю очередь. Будьте внимательны.

После ключевых слов "from" и "to" возможно использование отрицающей приставки "not", её действие будет распространяться только на соответствующий адрес(а), но не на порты, если они используются в команде.

Например,

ipfw add reject all from mac 0012345678 to 0/0
ipfw addout reject all from 0/0 to mac 0012345678
ipfw add rf1 reject all from mac $BS to 0/0
ipfw add reject all from 0/0 to not 1.1.1.0/24

Список портов задаётся в виде простого перечисления номеров портов разделённых пробелами.

Первый элемент в списке может быть парой портов, разделённых двоеточием. Эти порты будут определять диапазон номеров (от меньшего к большему,  включая указанные).

В текущей реализации может быть указано до 10 номеров портов в списке.

Заметьте, что пакеты, которые не являются первым фрагментом фрагментированного IP-пакета, не проверяются на номер порта (поскольку номер порта фигурирует только в первом фрагменте). Это не является серьёзным ограничением, поскольку если первый фрагмент будет отвергнут фильтром, то остальные фрагменты будут отвергнуты IP-протоколом на целевой машине.

Поле "modifiers" используется для указания дополнительных характеристик пакета, которые должен учитывать фильтр.

Возможные значения:

  • tcp_connection

определяет, что фильтр относится только к пакетам установления TCP соединения.

  • сonnection

является синонимом "tcp_connection".

Технически,  пакет запроса соединения имеет TCP заголовок с установленным флагом SYN и сброшенным флагом ACK.

  • ip_fragment

указывает, что фильтр относится только к фрагментированным пакетам.
Технически, либо поле offset в заголовке пакета имеет ненулевое значение, либо установлен бит "more fragments".

  • ip_head_fragment

указывает, что фильтр применим только к первому фрагменту фрагментированного пакета.

Технически, поле "offset" равно нулю и бит "more fragments" установлен.

  • ip_tail_fragment

указывает, что фильтр применим ко всем фрагментам фрагментированного пакета, кроме первого.

Технически, поле "offset" ненулевое (значение бита more fragments не имеет значения).

  • ip_option

фильтр применим к IP-пакетам, которые имеют любые установленные IP опции (кроме опции  "NO-OP").

  • ip_recroute_option

фильтр применим только к IP-пакетам, которые имеют включенные опции "record-route" или "timestamp IP" и не имеют никаких других опций.
Эти опции могут использоваться злоумышленниками для построения карты вашей сети. Они не несут никакой другой угрозы.

  • ip_misc_option

фильтр применим только к пакетам, имеющим одну или более IP-опций кроме "record-route", "timestampIP" или "NO-OP".
Многие из IP опций группы misc могут быть использованы и используются злоумышленниками для обхода фильтров и проникновения в чужую сеть.

Есть несколько дополнительных правил для поля modifiers, которые нужно отметить:

  • "tcp_connection" может быть использовано только если поле proto имеет значение "tcp".
  • Если использована более чем одна из опций "ip_fragment", "ip_head_fragment" или "ip_tail_fragment", то последние будут отменять действие первых.
  • Если использована более чем одна из опций "ip_option", "ip_recroute_option" или "ip_misc_option", то последние будут отменять действие первых.

Параметр "–f" позволяет использовать фильтры «pcap».

Например,

ipfw add reject -f "icmp and host (1.1.1.1 or 1.1.1.5)"

Пакет должен удовлетворять всем установленным опциям, в противном случае он будет пропущен фильтром.

Правила обработки пакетов пакетным фильтром

Здесь приводится детальное описание того, как пакеты обрабатываются пакетным фильтром. Каждый пакет, который принимается маршрутизатором, проходит через блокирующий набор фильтров. Пакеты, которые принимаются блокирующими фильтрами, поступают на обработку в IP-компонент ядра маршрутизатора. Если IP стек решает, что пакет не относится к данной машине и должен быть отправлен дальше, то он проходит через маршрутизирующий набор фильтров. Информация о пакетах, которые отбрасываются фильтрами, выводится на системную консоль, а сами пакеты уничтожаются без уведомления источника.

Пакет, "проходящий сквозь" набор фильтров, сравнивается с каждым фильтром в наборе, начиная с первого и заканчивая либо концом набора, либо конкретным подходящим фильтром.

Логика поведения фильтра следующая:

  • Если набор фильтров пуст, то пакет принимается.
  • Иначе, первый же подходящий фильтр определит судьбу пакета. Если фильтр разрешающий, то пакет принимается. Если фильтр запрещающий, то пакет отбрасывается.

ВНИМАНИЕ

Если не нашлось ни одного фильтра, подходящего к пакету, то пакет принимается.

Логика работы конкретного фильтра представлена ниже:

  • Если поле "proto" фильтра не "all" и это не тот же протокол, что и в пакете, то фильтр пропускается.
  • Если адрес источника в пакете и в фильтре не совпадают, то фильтр пропускается (если адрес был указан с  маской, то, перед сравнением, маска накладывается на оба адреса).
  • Если адреса получателя в пакете и в фильтре не совпадают, то фильтр пропускается (опять-таки, маска обрабатывается так, как было описано ранее).
  • Если задан параметр "ip_fragment", но пакет не является фрагментом, то фильтр пропускается.
  • Если задан параметр "ip_tail_fragment", но пакет является либо первым, либо единственным фрагментом, то фильтр пропускается.
  • Если задан параметр "ip_head_fragment", но пакет не является первым фрагментом фрагментированного пакета, то фильтр пропускается.
  • Если задан параметр "tcp_connection", но пакет не является первым или единственным фрагментом  TCP/IP пакета, который пытается установить соединение, то фильтр пропускается.
  • Если задан параметр "ip_option", но пакет не имеет никаких IP опций (кроме возможно "NO-OP" или "EOL"), то фильтр пропускается.
  • Если задан параметр "ip_recroute_option", но пакет не имеет указанных опций, то фильтр пропускается.
  • Если задан параметр "ip_misc_option", но пакет не имеет никаких IP опций кроме, возможно, "record-route", "timestamp", "EOL" или "NO-OP", то фильтр пропускается.
  • Если фильтр имеет параметр "proto" установленный в  "udp" или "tcp" и если адрес источника в фильтре имеет список портов, то если пакет не является первым (или единственным) фрагментом или порт источника в пакете не совпадает со списком портов в фильтре, то фильтр пропускается.
  • Если фильтр имеет параметр proto установленный в "udp" или "tcp" и если адрес получателя в фильтре имеет список портов, то если пакет не является первым (или единственным) фрагментом или порт получателя в пакете не совпадает со списком портов в фильтре, то фильтр пропускается.
  • Пакет обрабатывается фильтром в соответствии с указанным полем "disp".

Особенности работы фильтра с ARP пакетами:

  • ARP пакеты будут всегда пропускаться для тех IP-адресов и диапазонов IP-адресов, которые указаны в разрешающих (accept) фильтрах, даже если эти фильтры созданы для других типов пакетов.

Примеры

Здесь описывается, как использовать команду "ipfw"  для создания фильтров различного назначения.

Простые примеры

В качестве первого примера можно рассмотреть фильтр, который запрещает прохождение всех пакетов с некоторого неблагонадёжного адреса 1.1.1.1 на адрес 2.2.2.2:

ipfw add reject all from 1.1.1.1 to 2.2.2.2

Поскольку враги имеют тенденцию группироваться, можно закрыть прохождение пакетов со всей вражеской сети:

ipfw add reject all from 1.1.1.0/24 to 2.2.2.2

Число 24 после символа "/" (слэш) означает длину маски в битах. Длина маски 24 как раз соответствует сети класса C, состоящей из 256 узлов.

Используя символ  ":" можно переписать предыдущую команду следующим образом:

ipfw add reject all from 1.1.1.1:255.255.255.0  to  2.2.2.2

Следующая команда завершает этот абзац:

ipfw add reject all from 1.1.1.0/24 to 0/0

Она полностью блокирует все пакеты из вражеской сети 1.1.1.0 класса C посланные на любой адрес (если, конечно, они будут проходить через данный маршрутизатор).

Фильтрация по номерам портов

Теперь предположим, что мы хотим написать фильтр, который позволит всем обращаться к сервису  smtp (почтовый агент) на машине с IP-адресом  192.5.42.1. Это можно сделать следующей командой:

ipfw add accept tcp from 0/0 to 192.5.42.1 25

Ключевое слово "tcp" определяет, что фильтр будет применяться только к TCP  пакетам. Сразу за адресом хоста следует номер порта 25, который и определяет сервис "smtp".

Можно использовать список портов для указания сразу нескольких портов в одной команде. Первый элемент списка портов может задавать диапазон номеров от меньшего к большему, разделённый двоеточием. Например, команда

ipfw add accept tcp from 0/0 to 1.1.1.1 900:5000 25 113

разрешит прохождение TCP пакетов на адрес 1.1.1.1, если целевой порт при этом попадает в диапазон от 900 до 5000 или равен 25 (smtp) или 113 (ident).

IP spoofing

В предыдущих примерах адрес источника использовался как главный и единственный критерий проверки благонадёжности источника. К сожалению, имеется возможность посылать пакеты с неблагонадёжного адреса подставляя в качестве обратного адреса тот, которому вы доверяете (этот вид атаки называется IP spoofing). Понятно, что проверять один адрес источника недостаточно. Необходимо также проверить каким путём шёл пакет или, что более практично, через какой интерфейс он был принят.

Пример сети показан ниже: 

Рисунок - Пример сети

Все подсети внутренней сети, включая и адрес хоста innerhost, принадлежат одной сети (или группе сетей). Предположим, во внешней сети нет и не может быть ни одного хоста, принадлежащего диапазону, выделенному для внутренней сети. Следовательно, любые пакеты, которые принимаются через интерфейс  rf5.0 маршрутизатора, на котором запущен firewall, и имеют адрес источника, принадлежащий диапазону адресов внутренней сети, должны блокироваться. Следующая команда позволяет сделать это:

ipfw add rf5.0 reject all from innerhost/16 to 0/0

В отличие от предыдущих примеров, этот фильтр будет применяться только к пакетам приходящим через интерфейс rf5.0. Пакеты, поступающие через любой другой интерфейс, блокироваться не будут (в примере предполагалось, что внутренняя сеть имеет адреса сети класса B). 

В качестве дополнительной меры, возможно, имеет смысл заблокировать также прохождение пакетов с адресом источника из сети loopback (127.0.0.0):

ipfw add rf0 reject all from 127.0.0.0/8 to 0/0

"IP spoofing" как метод атаки широко использовался в сети Интернет (для дальнейшей информации смотри CERT summary CS-95:01, а также summaries на сервере  CERT WWW site ).

Важно понимать, что злоумышленник может использовать метод "IP spoofing" для взлома вашей системы даже несмотря на то, что обратные пакеты никогда не вернутся к отправителю. Смотри, например CERT advisory CA-95:01 .

Фильтрация TCP соединений

TCP/IP клиенты обычно используют порты в диапазоне от 900 до 5000, а сервера обычно обслуживают порты с номерами ниже 900 или выше 5000. Следовательно, следующая пара фильтров позволит запретить любым внешним клиентам работу с нашими серверами (предполагается, что rf5.0 это интерфейс соединяющий нас с внешним миром):

ipfw add rf5.0 accept tcp from 0/0 to 0/0 900:5000
ipfw add rf5.0 reject tcp from 0/0 to 0/0

Первый фильтр пропускает все входящие извне пакеты, посылаемые на сервисы с портами в диапазоне от 900 до 5000 (обычно используемые нашими клиентами), а второй фильтр отбрасывает всё остальное.

К сожалению, этого недостаточно. Некоторые внутренние сервера могут использовать порты в диапазоне от 900 до 5000. Предыдущая пара фильтров позволит внешним станциям работать с нашими серверами. Проблема в том, как закрыть внутренние сервера использующие диапазон портов от 900 до 5000 и в то же время позволить работать нашим клиентам в этом же диапазоне. Одно из решений - блокировать попытки установления соединения между внешним клиентом и внутренним сервером.
Модификатор "tcp_connection" даёт такую возможность:

ipfw add rf0 reject tcp connection from 0/0 to 0/0 900:5000
ipfw add rf0 accept tcp from 0/0 to 0/0 900:5000
ipfw add rf0 reject tcp from 0/0 to 0/0

Первый фильтр предотвращает попытки установить соединение извне с нашими внутренними серверами в диапазоне портов от 900 до 5000. Второй фильтр разрешает другие входящие TCP пакеты в этом диапазоне, и последний фильтр отбрасывает все прочие TCP пакеты.

Ненадёжный UDP

В отличие от протокола TCP, который ориентирован на установление соединений, UDP протокол использует отдельные пакеты (датаграммы). В этом протоколе, каждый пакет передаётся независимо от других и логические сеансы, которые могли бы устанавливаться между UDP/IP клиентом и сервером существует только на уровне приложений и не видны на уровне UDP.

Поскольку все пакеты независимы, по заголовку пакета невозможно определить, посылается пакет от сервера клиенту или наоборот (фактически, в протоколе UDP, участники действуют как равноправные партнёры и термины сервер и клиент явно не определены.
Поэтому лучшее, что мы можем сделать, это возможно более точно определить диапазон портов UDP, который может использоваться для связи с внешним миром.

Сервер имён (DNS) является примером сервера, использующего протокол UDP.
Предполагая, что "rf5.0" - это наше соединение с внешним миром, следующая пара фильтров обеспечит взаимодействие между нашим и внешними DNS серверами, заблокировав весь остальной UDP трафик:

ipfw add accept udp from 0/0 53 to 0/0 53
ipfw add rf0 reject udp from 0/0 to 0/0

Хотя это может показаться простым, на самом деле очень трудно реализовать более открытую политику в области UDP обмена, не создав при этом больших дыр в безопасности. Если вы решите разрешить локальным клиентам общаться с внешними UDP серверами, то примите во внимание следующие соображения (это ДАЛЕКО не полный перечень):

Если вы имеете NFS сервера, имейте в виду, что традиционно они используют UDP порт 2049 (TCP/IP реализации NFS используют TCP порт 2049, который, вероятно, может быть защищён с помощью модификатора "tcp_connection" - смотри выше).

Некоторые реализации "RPC portmapper" имеют серьёзные проблемы с безопасностью. Будьте очень осторожны, разрешая внешний доступ к внутреннему ресурсу portmapper (TCP и UDP порт 111).

Будьте очень осторожны в выборе того, какие порты источника и назначения вы разрешаете. Вы можете поддаться искушению разрешить приём входящих пакетов, которые приходят с определённых  UDP портов. Если вы сделаете это, не забудьте, что злоумышленник может легко посылать любые  TCP/IP и UDP/IP пакеты с любыми номерами портов и комбинациями адресов.

Некоторые сервисы сети Microsoft LAN manager используют UDP. Зная патологическую неприязнь фирмы Microsoft к открытым и безопасным протоколам, и учитывая беспрецедентное число ошибок в реализации, лучше исключить всякую возможность потенциальным злоумышленникам воспользоваться этой дырой в безопасности:

ipfirewall add rf0 reject tcp from 0/0 to 0/0 135:139
ipfirewall add rf0 reject udp from 0/0 to 0/0 135:139

Данный фрагмент достаточно надёжно закрывает внутреннюю сеть от большинства возможных посягательств несанкционированного доступа к вашей сети (если в ней имеются серверы или станции на базе Windows NT/95/98).

IP фрагменты

Модификаторы  "ip_fragment", "ip_head_fragment" и "ip_tail_fragment" предназначены для управления потоком фрагментированных IP пакетов. Чтобы понять, как использовать их в своих фильтрах, вы должны обратить внимание на следующие моменты:

  • фильтр, который проверяет номера портов TCP или UDP, никогда не проверяет  IP фрагменты, если только это не первый фрагмент в последовательности.
  • если ваш фильтр позволяет приём IP фрагментов, то злоумышленник может применить атаку типа "denial-of-service" (отказ в обслуживании), посылая огромное число фрагментов с разными адресами источника, что может привести к нехватке памяти на вашем маршрутизаторе.

Если вы хотите предотвратить потенциальную атаку типа "denial-of-service", то, вероятно, единственное решение заключается в запрете на приём всех фрагментированных пакетов:

ipfw add reject all ip_fragment from 0/0 to 0/0

Это, безусловно, повышает общий уровень защищённости, хотя следует иметь в виду, что злоумышленник может использовать другие пути для атаки (например, просто забрасывая вас пакетами или просто посылая кучу бесполезной почты)

Кроме того, блокирование всех фрагментированных пакетов может помешать нормальной работе.

К примеру, в каждом сегменте сети есть понятие максимально возможного размера пакета (обычно около 1500 байт). Но даже если отправитель посылает не фрагментированный пакет, нет никакой гарантии, что он дойдёт таковым до получателя. Вполне вероятно, что где-то по пути встретится участок с меньшей максимально допустимой длиной  пакета, и он будет разбит на фрагменты. Даже новейшие протоколы определения минимальной длины пакета на всём пути от источника до получателя не гарантируют успеха, поскольку каждый IP-пакет доставляется независимо от других и может идти совершенно различными путями. То есть, блокирование фрагментированных пакетов может приводить к нарушениям в работе сетевых приложений (временным, либо постоянным) с определёнными хостами.

Если вы решите разрешить прохождение фрагментированных пакетов, то, вероятно, одним из первых фильтров можно смело поставить:

ipfw add accept all ip_tail_fragment from 0/0 to 0/0

Разрешение прохождения фрагментов пакета кроме первого не создаёт проблем с безопасностью (за исключением случаев атаки "отказ в обслуживании") поскольку первый фрагмент пакета, который несёт основную информацию о его назначении, будет контролироваться другими фильтрами. Если первый фрагмент пакета будет отвергнут каким-либо фильтром, то оставшиеся фрагменты будут доставлены получателю и уничтожены его программным обеспечением по истечении некоторого интервала времени (обычно 60 секунд).

  • No labels