Содержание
Несколько дополнительных слов во введении
Трафик, проходящий через маршуртизатор не должен быть бесконтрольным. Абсолютно естественно, когда хочется:
Выполнять фильтрацию трафика , то есть пропускать только то что можно, фиксировать то что нужно и уничтожать все остальное.
Выполнять трансляцию адресов , для того чтобы скрыть несколько хостов одним, когда нужно дать доступ к Интернету целой сети, а есть только один IP-адрес; или перенаправить различные входящие соединения на различные компьютеры скрытые за брандмауэром.
Выполнять регулировку трафика , то есть ограничивать трафик одного вида, чтобы трафик другого вида чувствовал себя свободнее.
Выполнять учет трафика , дабы знать, каков объем тех или иных данных прошедших через шлюз за определенный промежуток веремени.
ОС FreeBSD предлагает хороший инструментарий для решения названых задач. Центральным элементом этого инструментария является подсистема ядра ipfw, предназначеная для пакетной фильтрации и решения других родственных задач; и одноименная утилита ipfw, которая нужна для настройки этой подсистемы.
Здесь рассматривается, как пользоваться утилитой ipfw для настройки фильтрации/учета/регулировки трафика; конфигурировать демон natd для выполнения трансляции адресов, а также указывается, с какими опциями должно быть собрано ядро системы для того чтобы все это работало. В завершение рассказывается, как ipfw и natd автоматически настраивать при загрузке системы.
Внутренняя дружественная сеть и потенциально опасный Интернет должны быть разделены. Внутренние компьютеры должны быть ограничены от пагубного внешнего воздействия, но при этом, с одной стороны, они должны обеспечивать другие компьютеры внутренней сети необходимыми сервисами; с другой стороны, должны иметь полноценный доступ к компьютерам Интернета. Эта задача обычно решается при помощи брандмауэра.
Брандмауэр представляет собой программно-аппаратный комплекс, выполняющий разграничение сетей и ограничивающий доступ из одной сети в другую. Термин брандмауэр (firewall) берет свое начало в строительной отрасли, где он означает сооружение, препятствующее распространению огня при пожаре из одной части здания в другую. Аналогичным образом, в компьютерных сетях брандмауэр ограничивает распространение вредного сетевого воздействия.
Брандмауэры обычно устанавливаются в том месте, где внутренняя сеть соединяется с Интернетом. Весь трафик, входящий из Интернета или исходящий из внутренней сети проходит через брандмауэр. При этом брандмауэр может проанализировать трафик и выяснить, является ли он допустимым с точки зрения политики безопасности.
Брандмауэры обычно строятся на базе двух элементов, которые оба занимаются фильтрацией и контролем трафика, но делают это по-разному:
Фильтры пакетов выполняют анализ содержимого проходящих через него сетевых пакетов и пропускает только некоторые из них. Таким образом, нежелательные соединения отсекаются. Такой брандмауэр работает на сетевом и транспортном уровнях и абсолютно прозрачен (незаметен) для протоколов более высокого уровня.
ОС FreeBSD может выполнять пакетную фильтрацию с помощью подсистемы ядра ipfw.
Брандмауэр уровня приложений также известен как прокси-сервер (сервер-посредник). Запросы на ресурсы по ту сторону сети направляются ему, а он уже самостоятельно получает доступ к этому ресурсу и передает полученную информацию запросившему ее клиенту. Брандмауэр работает на уровне приложений. Это значит, что не существует прозрачных соединений более низкого уровня проходящих через него.
Ярким примером такого рода брандмауэра может служить кэширующий прокси-сервер, который обрабатывает клиентские HTTP-запросы. Клиенты не могут соединиться напрямую с web-сервером и отправляют запрос прокси-серверу, который в свою очередь обращается уже к web-серверу.
Обычно обе технологии построения брандмауэров комбинируют.
Утилита ipfw используется в FreeBSD для управления пакетным фильтром ipfw [1] и регулировщиком трафика dummynet, встроенными в ядро.
Каждый пакет, обрабатываемый ядром, проходит через цепочку правил (ruleset). Цепочка представляет собой набор правил, на соответствие каждому из которых последовательно проверяются пакеты. Если соотвествие найдено, выполняется заданное действие, иначе проверяется следующее правило. И так до тех пор, пока не будет найдено соответствие или не проверятся все правила цепочки. В последнем случае срабатывает правило-по-умолчанию , которое определяет, как нужно поступить с теми пакетами, о которых никто не побеспокоился.
Каждое правило в цепочке имеет номер от 1 до 65535. Номера не обязательно должны идти подряд, важно то, что правила с меньшим номером проверяются раньше правил с большим номером. Правило-по-умолчанию всегда имеет номер 65535.
Например, в этом случае цепочка фильтрации содержит два правила.
# ipfw list
00100 deny ip from 10.0.0.2 to any
65535 allow ip from any to any
Первое правило отклоняет (deny) все пакеты, которые приходят от хоста с адресом 10.0.0.2. Второе правило, которое является правилом-по-умолчанию, разрешает проходить всем остальным.
Цепочку правил можно модифицировать с помощью ipfw. Для этого утилите нужно указать, какое действие она должна выполнить с цепочкой:
# ipfw
действие
[
число
] [
правило
]
Здесь действие определяет действие, которое нужно выполнить; правило -- правило, которое будет добавлено в цепочку (при условии, что его нужно добавлять). Необязательное поле число указывает с каким именно правилом в цепочке выпоняется действие. Например, команда
# ipfw add deny ip from 10.0.0.3 to any
добавит правило deny ip from 10.0.0.3 to any в цепочку фильтрации. Номер правила будет выбран автоматически: он будет равен максимальному номеру правила (не считая правила-по-умолчанию) плюс шаг.
Команда
# ipfw add 100 deny ip from 10.0.0.3 to any
будет работать точно также, но если правило с номером 100 уже существует, оно будет перезаписано.
Общая структура правила такова:
[
число
] [ set
число
] [ prob
вероятность
]
действие
[ log ]
тело
Обычно, большинство полей в правиле не указывают, и оно имеет более простую структуру:
[
число
]
действие
тело
Каждое правило содержит условие ( тело ), при котором оно будет срабатывать, и действие ( действие ), которое говорит о том, как именно правило будет себя вести.
Например, правило
allow from any to any
содержит действие allow, которое применяется ко всем пакетам (при условии, что пакет дошел до правила). Выбор пакетов определяется телом правила: from any to any.
Таблица 2. Элементы правила ipfw
Элемент |
Назначение |
---|---|
номер |
Номер правила. Если не указан, вычисляется автоматически. |
set число |
Номер набора. Наборы помогают управлять группами правил. Например, можно удалить множество правил одной командой, если они приналежат одному набору. Есть смысл объединять правила в наборы, если эти правила семантически как-то связаны между собой |
prob вероятность |
Вероятность срабатывания правила. Можно использовать, например, для имитации сбойного канала |
log [ logamount число ] |
При совпадении с правилом занести информацию о пакете в журнал (при net.inet.ip.fw.verbose = 1 ). Количество записей касающихся этого правила, занесенных в журнал, не должно превышать величину logamount (или net.inet.ip.fw.verbose_limit, если logamount не указано ) |
Простейшими действиями ipfw являются allow и deny. Действие allow разрешает прохождение пакета, и он больше не проверяется на соответствие ни одному условию, а deny, наоборот, приводит к тому, что пакет отбрасывается. При этом отправитель не получает никакой информации о судьбе пакета -- пакет считается просто потерявшимся. Если нужно чтобы отправитель знал о том, что пакет был уничтожен, следует использовать действие unreach host.
Другие действия ipfw, такие как divert, fwd, pipe, queue, используются для организации трансляции адресов и регулирования полосы пропускания.
Таблица 3. Действия в правилах ipfw
Обозначение |
Действие |
---|---|
allow | accept | pass | permit |
Разрешить прохождение пакета, которое соответствует правилу. Прекратить поиск. |
count |
Посчитать пакет, который соответствует правилу и продолжить проверку. |
deny | drop |
Уничтожить пакет, не извещая отправителя. |
divert порт |
Передать пакет на указанный порт хоста и не выполнять дальнейшую проверку. Используется, например, для выполнения трансляции адресов с помощью natd. |
unreach код |
Уничтожить пакет и направить его отправителю ICMP-извещение с указанным код ом. В качестве код а может использоваться либо число от 0 до 255, либо соответствующее ему слово. Например, host означает ICMP сообщение "Хост недоступен" (Host unreachable), а port -- сообщение "Порт недоступен". |