Главная > Операционные системы > UNIX
Конфигурация брандмауэра IPFW может быть «закрытой» или «открытой»
IPFW можно включить одним из двух способов: добавить нужные строки к конфигурационному файлу ядра и пересобрать его, или воспользоваться программой kldload и подгрузить нужный модуль ядра. Однако только метод пересборки ядра позволяет регулировать некоторые функции, например включить журналирование. Динамическое включение IPFW:
Для статического включения IPFW в конфигурационный файл ядра следует поместить строку options IPFIREWALL затем пересобрать ядро и перезагрузить машину. Но не всё так просто, как кажется. Нужны ещё некоторые телодвижения. Дело в том, что брандмауэр, как было сказано выше, может быть закрытым и открытым. По умолчанию он закрыт. Это может стать настоящим кошмаром при конфигурировании брандмауэра удалённо. Поначалу, пока не наберётесь опыта, старайтесь не включать IPFW удалённо ни статически ни динамически. Если такая неоходимость есть, попробуйте использовать команду at(1) для того, чтобы отменить включение брандмауэра через десять минут. Если всё будет в порядке, вы можете командой atrm(1) отменить поставленное задание по снятию IPFW. Если вы хотите динамически включить IPFW удалённо, сделайте это так:
Такое действие приведёт к тому, что брандмауэр после включения будет открыт и вы не потеряете связь с ним, а если всётаки что-то пойдёт не так, то через 10 минут брандмауэр откроется сам собой, благодаря команде at(1). При локальной работе за консолью, такое действие не требуется.
Включение IPFW статически на удалённой машине, требует некоторых
дополнительных действий. После того, как ядро пересобрано, перед
перезагрузкой, надо указать как минимум две дополнительные опции в
firewall_enable="YES" firewall_type="OPEN" Существуют и другие политики, мы рассмотрим их ниже в Раздел E.1.1.1.1.1, «Предопределённые типы брандмауэров» и Раздел E.1.1.1.1.2, «Пользовательские типы брандмауэров», однако открытый брандмауэр — рекомендуемая практика для новичков. Можно вкомпилировать политику непосредственно в ядро. Для этого в конфигурационном файле ядра следует указать следующую опцию: options IPFIREWALL_DEFAULT_TO_ACCEPT
В этом случае нет необходимости задавать политику при включении
IPFW и нет необходимости делать это в
В дополнение к указанным опциям, в конфигурационном файле ядра можно указать ещё и следующие опции: options IPFIREWALL_VERBOSE options IPFIREWALL_FORWARD options IPFIREWALL_VERBOSE_LIMIT=# Кроме опций в конфигурационном файле ядра, данными возмоностями можно управлять через переменные ядра при помощи команд
Если система поддерживает IPv6, можно включить в ядре следующие опции: options IPV6FIREWALL options IPV6FIREWALL_VERBOSE options IPV6FIREWALL_VERBOSE_LIMIT=100 options IPV6FIREWALL_DEFAULT_TO_ACCEPT Специальных переменных ядра влияющих на журналирование IPv6 нет. Существуют и другие переменные ядра для настройки IPFW, однако они будут освещены в других местах, так как они не нужны для активации брандмауэра, а требуются для более тонкой настройки.
Переменные ядра следует указать так же в файле
Кроме того, если ваша машина выступает в качестве шлюза, вам
понадобится включить проброс пакетов между интерфейсами. Для этого
в gateway_enable="YES"
или оперировать переменной ядра
Независимо от того, указан ли тип брандмауэра в
ipfw add 100 pass all from any to any via lo0 ipfw add 200 deny all from any to 127.0.0.0/8 ipfw add 300 deny ip from 127.0.0.0/8 to any Их назначение — пропускать весь локальный трафик на кольцевом интерфейсе и предотвращать попытки обращения к внутренним адресам машины из внешнего мира. Если этих правил не будет, поломается множество внутренних сервисов — RPC, X11 и др.
Если тип брандмауэра в ipfw add 65000 pass all from any to any
Это правило пропускает весь внешний трафик внутрь и весь
внутренний трафик наружу. Оно выполняет ту же функцию, что и
опция
Есть две возможности: либо использовать предопределённые
типы брандмауэра из
Разумеется последнее слово в выборе типа брандмауэра за
администратором. Если вам почему-то хочется именно
использовать один из предустановленных типов, хотя бы
посмотрите скрипт firewall_type="..."
Тип брандмауэра можно задавать в любом регистре:
Разумная практика состоит в том, чтобы самому написать
правила брандмауэра, и подгружать их как пользовательский
тип в
Синтаксис файла Синтаксис правил IPFW довольно прост. Каждое правило можно добавить в консоли при помощи команды ipfw(8). Прежде чем мы углубимся в изучение синтаксиса, посмотрим как можно просмотреть имеющиеся правила.
Команда
Опция
Опция
Теперь посмотрим, какие правила можно использовать для настройки stateless фильтрации. (Т.е. фильтрации без учёта состояния соединений. stateful фильтрация — фильтрация с учётом состояния соединений, позволяет заметно упростить набор правил и повысить эффективность работы брандмауэра. Они будут рассмотрены в Раздел E.1.5, «Фильтрация с учётом состояния соединений»). Правила в брандмауэр можно добавлять как при помощи утилиты ipfw(8) так и из файла:
В последнем случае в файл строка за строкой кладутся аргуметы команды ipfw(8). Например: add 1000 allow all from any to any
Мы с вами уже встречали это правло раньше, когда смотрели на
открытый тип брандмауэра. Ключевые слова В простейшем случае синтаксис правил IPFW выглядит следующим образом: <команда> [<номер правила>] <действие> <протокол> from <источник> to <назначение>
Важные команды: Действие может быть одним из следующего списка:
В поле протокола можно указать любой протокол транспортного
уравня. Как правило это Адрес источника и адрес назначения имеют одинаковый формат:
Перед каждым адресом можно указать ключевое слово
После указания хоста или сети, можно указать номер порта или
название протокола из файла
Если в названии протокола встретится знак минус, его
необходимо защищать обратным слешем:
Если операции с масками сети кажутся вам неясными, попробуйте обратиться к Раздел 6.8.2, «Маска подсети в формате CIDR». Хотя рассмотренные правила покрывают множество простых ситуаций, вам могут понадобиться более сложные правила, в ситуации когда у вашей системы более одного сетевого интерфейса или вы хотите генерировать какие-то специальные ответы на пакеты или хотите лучше контролировать направление движения трафика. Для начала приведём синтаксическую диаграмму правил IPFW: <команда> [<номер правила>] <действие> [log [logamount <число>]] <протокол> from <источник> to <назначение> [<интерфейс>] [<опции>] Всё, что находится в квадратных скобках, это необязательные аргументы, которые дают системе новый функционал. Эти-то правила и будут рассмотрены в данном разделе. Мы рассмотрим некоторые действия, которых не коснулись в предыдущем разделе.
Дествие Важная возможность брандмауэра IPFW не рассмотренная в Раздел E.1.2, «Основы синтаксиса правил ipfw» — возможность контроля за тем, на каком интерфейсе появился пакет и в каком он движется направлении. До сих пор мы делали предположения о направлении пакетов просто на основании адресов источника и назначения, однако узнать откуда пакет пришёл в самом деле мы не могли.
Если вы хотите, чтобы правило срабатывало только в отношении
пакетов идущих внутрь или наружу, вы можете указывать ключевые
слова Например, если мы хотим обрабатывать все входящие пакеты вне зависимости от их направления, мы можем использовать правило add 1000 allow all from any to any in Например:
Как видно, правило 100 считало только исходящие «пинги», правило 200 считало входящие «понги», а правило 300 считало и те и другие пакеты. («пинг» — echo-request пакет, «понг» — echo-reply пакет.)
Чтобы определять пакеты, идущие через конкретный интерфейс,
используйте ключевое слово add 1100 allow all from any to any in via xl0 Или если вы хотите детектировать трафик направленный от любого хоста любому хосту, но выходящий через любой интерфейс: add 1200 allow all from any to any out via any
В старых реализациях IPFW, если вы использовали сочетание
ключевых слов
Однако вы можете использовать ключевые слова ipfw add allow ip from any to any out recv ed0 xmit ed1 Пакеты ICMP, TCP и UDP бывают различного типа в зависимости от выставленных в них флагах. Мы можем определять типы этих пакетов при помощи описанных ниже правил.
Правило Таблица E.2. типы ICMP сообщений опознаваемые брандмауэром IPFW
К примеру, следующие три правила позводяют машине, защищаемой IPFW пинговать всех, но не дают никому пинговать нашу машину: 1000 allow icmp from any to any out icmptypes 8 1100 allow icmp from any to any in icmptypes 0 1200 deny icmp from any to any in icmptypes 8 Здесь правило номер 1000 — разрешает исходящие «пинги», правило 1100 — разрешает ответные «понги», правило номер 1200 — блокирует внешине «пинги». Надо заметить, что практика запрещения «пингов» весьма распространена, однако не они наиболее разрушительны для системы. Например, пакет ICMP-redirect может использоваться для подделки таблицы маршрутизации на вашем хосте, что намного серьёзнее. Такое внимание «пингам» обусловлено не в поледнюю очередь историческими причинами. (См. POD.)
Опция
Подробнее о флагах TCP можно прочитать в Раздел B.1.4.3, «TCP». Флаги можно указывать через запятую. Восклицательный знак означает отсутсвие флага. Например:
Восклицательный знак в некоторых оболочках обладает
специальным значением, поэтому мы экранировали строку
кавычками. Обратите внимание на отклик системы, вместо того,
чтобы сказать
Один из наибелее важных флагов для нас — флаг
SYN, так как он выставляется у пакета открывающего TCP
соединение. Из-за его важности у ipfw(8)
есть специальное правило, которое отслеживает именно этот
флаг —
Таким образом, в приведённом выше примере мы разрешили
открывать соединения к нам на 80-й
порт. А как же быть с остальными пакетами, которые пойдут по
установленному соединению? Характерной особенностью этих
пакетов является то, что в них выставлен флаг
RST — обрыв соединения, или флаг
ACK — подтверждение о доставке предыдущих
пакетов. Чтобы ловить пакеты в которых выстален либо флаг
RST, либо ACK есть специальное правило
С применением правил allow 1000 from any to me established allow 1100 from any to me 22,25,80 setup deny 65535 from any to any
Первое правило пропускает все пакеты принадлежащие уже
установленным соединениям. Этих пакетов будет большинство,
поэтому мы вынесли данное правило в самое начало
брандмауэра, это способствует оптимизации пропускной
способности системы. Второе правило разрешает открывать
соединения на порты номер 22, 25 и 80. Третье правило
блокирует весь остальной трафик. Таким образом, мы запретили
устанавливать соединения на неразешённые порты, а
следовательно
Ключевое слово 900 deny all from any to any in frag
Одна из интереснейших возможностей IPFW —
фильтрация на основе UID и GID сокета от которого получен
пакет. Это значит, что исходящие соединения можно фильтровать
по признаку «кто это соединение открыл». После
ключевых слов Например, если мы хотим, чтобы только george мог ходить в интернет с нашей машины, мы можен написать следующее правило: 1000 allow all from me to any uid george 65535 deny all from any to any Данную возможность можно применять для ограничения возможностей мета-пользователей на случай их взлома. Речь идёт о пользователях от имени которых запускаются сервисы в системе. Другое возможное назначение таких правил — ограничение полосы пропускания применительно к конкретным локальным пользователям в нашей системе. При этом надо понимать, что речь идёт лишь о локальных пользователях, если полосу пропускания надо ограничить пользователю вне нашего шлюза, находящемуся в локальной сети, на основе логина и пароля, то для этого удобнее использовать пакетный фильтр OpenBSD. (см. Раздел C.2.3.4, «Authpf: авторизация в пакетном фильтре»). Преимущества журналирования многочислены. При помощи системных журналов вы можете по прошествии времени ответить на вопрос что когда как произошло в вашей системе. В тоже время неаккуратное ведение журнала в состоянии причинить существенный вред системе. Одна из разновдностей DOS атак может состоять в попытке переполнения вашего жёсткого диска путём заполнения журнальных файлов избыточной информацией. Общие советы касающиеся журналирования могут выглядеть следующим образом:
Для включения журналирования в конфигурационном файле ядра можно указать пару опций, пересбрать ядро и перезагрузить систему: options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=# Последняя опция ограничивает количество обращений правил брандмауэра к системе syslogd(8). Если вы укажете в этой опцмм число 10, то каждое правило, которое должно отсылать сообщение демону syslogd(8) будет отсылать не более 10 сообщений. После достижения этого предела, сообщения перестанут направляться в систему журналирования до тех пор, пока не будут сброшены журнальные счётчики в брандмауэре. Журнальные счётчики, это не тоже самое, что обычные счётчики пакетов. Они сбрасываются при помощи следующей команды:
Эти же опции можно включать не пересобирая ядро, при помощи переменных ядра:
Куда будут записаны сообщения от брандмауэра, зависит от
настроек сделанных в файле
Чтобы застивить syslogd(8) журналировать сообщения от брандмауэра IPFW в отдельный журнальный файл, следует выполнить следующие три действия: Во-первых. Создайте пустой журнальный файл, а может даже специальный каталог для журналов и уже в нём журнальный файл:
Убедитесь, что никто не может читать из этих файлов. Во-вторых.
Сконфигурируйте syslogd(8) так, чтбы он
писал журнал в этот файл. Для этого в самый конец (это
важно, в конец файла)
!ipfw *.* /var/log/ipfw/ipfw.log В некоторые другие файлы, в частности на консоль и терминал суперпользователя, тоже будут попадать некоторые сообщения. Не пытайтесь отменить журналирование на консоль и терминал суперпользователя. Такое поведение системы позволяет вам быстро отреагировать на то, что в системе происходит что-то не то. В-третьих. Не забудьте послать сигнал SIGHUP демону syslogd(8), для того, чтобы он перечитал сделанные вами изменения в его конфигурационном файле:
Итак, мы настроили журналирование событий через демон syslogd(8). Теперь нам надо настроить вращение журнального файла, в противном случае, он будет всё время расти в объёме и переполнит партицию, меж тем нам не нужна информация о том, что происходило в сети год назад.
Чтобы настроить вращение журнала достаточно добавить всего
одну строку в файл
/var/log/ipfw/ipfw.log 600 10 * $W0D2 J
Эта строка означает следующее: система
newsyslog(8) будет вращать файл
Наша система полностью готова к принятию журнальной информации, теперь мы можем задавать правила в брандмауэре, которые будут журналировать сообщения через syslogd(8).
Ключевое слово 65000 deny log all from any to any
Параметр 65000 deny log logamount 100 all from any to any При журналировании в сохраняется следующая информация:
Например:
Обратите внимание как демон syslogd(8)
обрабатывает ситуацию с повторяющимися событиями. Мы послали
три пинга на адрес 172.19.0.34. syslogd(8)
занёс в журнал первое событие, а остальные поместил в буфер,
так как они по его мнению однотипные. После этого мы послали
три пинга на другой адрес, это другое событие, поэтому
syslog(8) освободил свой буфер выдав
сообщение о двух непрожурналированных событиях: last message
repeated 2 times. С одной строны, такое поведение экономит
место в журнале, с другой стороны, оно затрудняет работу
парсеров и главное, препятсвует сбору данных о времени
совершения атаки. К сожалению, данную особенность
syslogd(8) отключить невозможно. В этом
смысле журналирование средствами пакетного фильтра
OpenBSD выглядит более разумно (см. Раздел C.2.3.1, «Журналирование в пакетном фильтре»). Зато такая система может быть
применена для конструирования системы активного реагирования
на события, так как журналируемые события можно направлять из
syslogd(8) на стандартный ввод любой
программе, которая, например, может автоматически на лету
переписывать правила брандмауэра. Впрочем, лучший вариант
состоит в заворачивании пакетов в программу при помощи правила
При фильтрации трафика без учёта состояний соединений, брандмауэр каждый пакет фильтрует индивидуально, без учёта других пакетов. Такой брандмауэр прост в реализации и может быть эффективно использован для:
Напротив, при фильтрации трафика с учётом состояния соединений, брандмауэр трактует трафик не как множество независящих друг от друга пакетов, а как совокупность потоков, каждый из которых, принадлежит некоторому соединению. Все соединения в большинстве протоколов используют некоторое число, указывающее в каком порядке должны собираться пакеты в сокете назначения. Брандмауэр, использующий stateful inspection, на основании этого числа может опознать пакеты как принадлежащие одному соединению. В особенности это относится к протоколам поддерживающим информацию о соединениях. Таким как TCP. Такой брандмауэр более сложен в реализации, однако он может:
Брандмауэр с учётом состояния соединения создаёт динамические правила для каждого соединения и автоматически удаляет эти правила по истечении некоторого времени. Всё это позволяет такому брандмауэру принимать более интеллектуальные решения на основе сетевых критериев более высоких уровней. С другой стороны, такое поведение не даёт брандмауэру принимать решения индивидуально по каждому пакету, поскольку динамические правила относятся сразу ко всем пакетам принадлежащим установленному соединению и препятствуют какому-то анализу кроме как анализу по принципу правильности осуществления процедуры открытия/закрытия соединения. Разумный подход заключается в объединении обоих методов фильтрации, для того, чтобы использовать сильные стороны и того и другого подхода.
Все приведённые выше примеры правил не учитывали состояние
соединения. Единственным исключением были критерии
Для нашего первого примера мы используем старый функционал
IPFW. Многие, кто использует в качестве примера для своего
брандмауэра файл add 1000 allow tcp from any to any established add 2000 allow tcp from any to any 22 in setup
Итак, мы предполагаем, что политика брандмауэра закрытая,
т.е. в ядре отсутствует опция Аналогичного эффекта можно добиться при помощи правил, в которых вообще нет критериев изучающих флаги заголовка TCP, т.е. при помощи заведомо stateless брандмауэра: add 1000 allow tcp from any to any out add 2000 allow tcp from any to any 22 in В приведённом примере разрешён любой исходящий трафик в любом направлении, а входящий трафик разрешён только на 22-й порт. В общем случае, тактика брандмауэра с учётом состояния соединений состоит в том, чтобы сперва пропускать все уже установленные соединения, а потом перечислить какие соединения можно открывать. Вот более комплексный пример. Приведём правила, которые разрешают трафик FTP, SSH, SMTP и DNS в сеть 172.16.0.0/27: add 1000 allow tcp from any to any established add 2000 allow tcp from any to 172.16.0.0/27 21,22,25 setup add 3000 allow udp from 172.16.0.0/27 to any 53 add 3100 allow udp from any 53 to 172.16.0.0/27
Поскольку трафик DNS осуществляется по протоколу UDP, мы не
используем в правилах 3000 и 3100 ключевые слова
Как уже было сказано выше, проверка только флагов заголовка
TCP ограничивает применимость stateful фильтрации. Начиная с
FreeBSD 4.0 в IPFW появилась
полноценная фильтрация с учётом состояния соединений. Это
достигнуто путём создания так называемых динамических правил.
Динамические правила образуются автоматически, если пакет
соответствует правилу, в котором присутсвует ключевое слово
Динамические правила находятся в цепочке правил там же, где
они заведены, т.е. если правило add 1000 check-state add 2000 allow tcp from any to any 22 in setup keep-state Вот переменные ядра влияющие на величины таймаутов:
Мне кажется, что таймауты по умолчанию принятые в FreeBSD для корпоративного шлюза являются слишком жёсткими. Возможно в ряде случаев их стоит увеличить. Особенно если вы не слишком лимитированы объёмом оперативной памяти и можете увеличить размер таблицы с динамическими правилами (см. ниже). Рассмотрим, как работают приведённые здесь два правила.
Надо заметить, что в примере приведённом в Раздел E.1.5.1, «Основы учёта состояний соединений (stateful inspection)», поддельный пакет был бы
пропущен правилом с ключевым словом Существует так же такой тип сетевых атак как SYN-флуд. Он заключается в том, что злоумышленник организует большой поток TCP пакетов с выставленным в них флагом SYN. (См. так же Раздел C.2.1.4.9, «TCP SYN proxy».) Такой флуд переполняет таблицы сокетов на атакуемой машине, что не даёт возможности открыть соединения для легальных пользователей. Т.е. совершается DOS-атака.
В брандмауэре такая атака приводит к росту количества
динамических правил. Текущее количество динамических правил
можно узнать из переменной Если количество разрешённых соединений достигнет предела, то новые динамические правила перестанут образовываться и новые соединения не будут разрешены в брандмауэре. Фильтрация с учётом состояния применима не только к трафику TCP. Например, ниже приведено правило, позволяющее нам пинговать из внутренней сети внешнюю, но не пропускающее обратные пинги: add 1000 check-state add 2000 allow icmp from any to any out icmptypes 8 keep-state
Правило номер 2000 заводит динамическое правило в момент,
когда мы посылаем пинг, нас можно будет пропинговать только с
той машины, которую мы пингуем, и только в тот самый момент,
пока не истёк таймаут от нашего пинга. (По умолчанию 5
секунд — Впрочем, надо заметить, что во-первых, чтобы мы могли пинговать хост снаружи, нам надо, чтобы он откликался быстрее чем за 5 секунд, а это не всегда так. Во-вторых, если злоумышленник нащупает время, когда мы пингуем его, он может продлевать действие динамического правила непрерывно бомбя нас пингами. Опять-таки, я говорю это не как о потенциальной опастности, а для понимания механизма действия динамических правил.
Для просмотра текущих динамических правил, можно применять
агрумент
Обратите внимание, что в счётчике указано 18 динамических
правил, а в листинге приведено только три. Это связано с
тем, что правила, которые истекли по таймауту не удалены из
таблицы динамических правил. Они не работают, но в таблице
присутсвуют и будут замещены только когда это понадобится.
Полностью таблицу динамических правил можно просмотреть при
помощи опции
Управление трафиком подразумевает регулировку полосы пропускания
(скорость связи), внедрение задержек, «случайная»
потеря пакетов и др. Если регулировка скорости трафика может
быть полезна для провайдеров доступа к сети, то прочие
«фокусы» могут использоваться для исследовательских
целей. Например для того, чтобы эмулировать соединение через
модем при подключении через FastEthernet. Мы можем использовать
Обсуждаемые возможности не могут быть применены совместно с динамическими правилами.
В составе IPFW имеется полезный инструмент для тестирования
сети, с помощью которого можно случайно отбрасывать пакеты с
некоторой вероятностью. Эта возможность активируетя при помщи
опции <command> [<rule #>] [prob <match_probability>] <action> [log [logamount <number>]] <proto> from <source> to <destination> [<interface-spec>] [<options>] Например, чтобы отбрасывать 20% «пингов», мы можем использовать следующее правило: add 1000 prob 0.8 allow icmp from any to any in icmptypes 8 Или мы можем отбрасывать половину пакетов TCP SYN идущих к web-серверу, для того, чтобы эмулировать состояние перегрузки: add 1000 prob 0.5 allow tcp from any to any in setup via ep0
Любые дополнительные возможности по контролю за трафиком
требуют наличия options DUMMYNET либо подгружена в виде модуля:
Когда
Это простое правило позволяет ограничить полосу пропускания
для трафика направляемого в 10-й канал величиной 100 килобит
в секунду. Ширину полосы пропускания можно указывать в разных
единицах: bit/s, Byte/s, Kbit/s, KByte/s Mbit/s, MByte/s.
Ключевое слово
Другое действие, которое можно выполнить при помощи pipe 10 config delay 100
После ключевого слова
Ключевое слово pipe 10 config plr 0.2
При регулировании полосы пропускания при помощи каналов, следует уделить внимание регулировке размера буфера или очереди (queue). Размер очереди задаётся в слотах, размер которых равен размеру MTU — максимальный размер кадра на канальном уровне модели OSI (см. MTU). Размер MTU можно узнать при помощи команды ifconfig(8):
Если на интерфейсе с достаточно большим размером MTU сильно заузить полосу пропускания, то большая очередь будет заполняться слишком долго. Например, если мы организуем канал, эмулирующий работу модема 56Kbit/s: pipe 10 config bw 56Kbit/s то окажется, что очередь в таком канале заполняется в течение 1500*8(MTU)*50(slot)/56000=10.7 секунд. Здесь 1500*8 — величина MTU в битах, 50 слотов — размер очереди по умолчанию. Чтобы снизить задержки можно либо уменьшить размер MTU при помощи команды ifconfig(8) (см. Раздел 6.2.2, «ifconfig(8) — настройки сетевых интерфейсов»), что явно неудачное решение, либо уменьшить количество слотов в очереди: pipe 10 config bw 56Kbit/s queue 5Kbytes Размер очереди можно задавать как в слотах, так и в байтах (см. пример). В последнем сучае, размер очереди не будет зависеть от MTU. Чем уже полоса пропускания канала, тем меньше должен быть размер очереди. В одном канале может быть несколько очередей. Допустим у нас во внутренней сети класса C хосты должны иметь скорость не более 100Kbit/s. Чтобы обеспечить такое ограничение мы можем либо завести 254 каналов (по каналу на каждый хост), или, что лучше, организовать динамические каналы при помощи масок. Пусть у нас будет маска 0.0.0.255. При накладывании такой маски на адрес 192.168.0.34 мы получим число 0.0.0.34. Это число является идентификатором динамически созданного канала. В битовой маске единицы могут стоять в любой позиции, т.е. маска не обязана быть дополнительной к сетевой маске и вычисляться по правилу 2n-1. Маски возможны следующих типов:
Маска указывает идентификатор канала. Например, если мы сделаем маску 0.0.0.255, то все адреса отличающиеся в третьем октете (т.е. из разных сетей класса C) будут принадлежать разным динамическим каналам, а при совпадении первых трёх октетов — одному каналу. Для рассматриваемой ситуации мы должны были бы сделать следующие правила: pipe 10 config mask src-ip 0x000000ff bw 100Kbit/s queue 10Kbytes pipe 20 config mask dst-ip 0x000000ff bw 100Kbit/s queue 10Kbytes add 1000 add pipe 10 all from 192.168.0.0/16 to any out via xl0 add 2000 add pipe 20 all from 192.168.0.0/16 to any in via xl0 Здесь мы впервые столкнулись с правилом, которое направляет трафик в канал. Итак, мы организуем два канала, один (10-й) заводит динамические каналы по IP-адресам источника, другой по адресам назначения (20-й). Правило 1000 направляет весь исходящий трафик в 10-й канал, а правило 2000 направляет весь исходящий рафик в 20-й канал. Как видно из приведённого примера, маски можно указывать не только в точечно-десятичной, но и в шестнадцатеричной форме. Обратите внимание, в этом примере в учебных целях присутствует одна странность: в канал направляется трафик из сети 192.168.0.0/16, а маска канала 0.0.0.255. Это приведёт к тому, что хосты 192.168.0.34, 192.168.5.34, 192.168.10.34, 192.168.16.34, 192.168.56.34, и т.д. будут находиться в одном канале с идентификатором 34 и будут делить общую полосу пропускания. В жизни это не самое удачное решение, оно приведено здесь с учебной целью.
Пакеты прошедшие через канал могут вернуться в цепочку
правил, для этого надо приравнять к нулю переменную ядра
Главная > Операционные системы > UNIX |