Ipfw и управление трафиком в FreeBSD

Оригинал: www.nt.com.ua
Автор: Игорь Чубин

Содержание

Фильтрация пакетов
Что такое и для чего нужна фильтрация пакетов
Утилита ipfw
Правила ipfw
Трансляция адресов
Что такое и зачем нужна трансляция адресов
Трансляция адресов в FreeBSD
Настройка natd
Регулировка величины трафика
Что такое регулировка трафика и зачем она нужна
Трафик-шейпер в FreeBSD
Настройка трафик-шейпера
Учет трафика
Работа с ipfw
Настройка ядра для поддержки ipfw
Настройка ipfw и natd при загрузке

Несколько дополнительных слов во введении

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

ОС FreeBSD предлагает хороший инструментарий для решения названых задач. Центральным элементом этого инструментария является подсистема ядра ipfw, предназначеная для пакетной фильтрации и решения других родственных задач; и одноименная утилита ipfw, которая нужна для настройки этой подсистемы.

Здесь рассматривается, как пользоваться утилитой ipfw для настройки фильтрации/учета/регулировки трафика; конфигурировать демон natd для выполнения трансляции адресов, а также указывается, с какими опциями должно быть собрано ядро системы для того чтобы все это работало. В завершение рассказывается, как ipfw и natd автоматически настраивать при загрузке системы.

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

Что такое и для чего нужна фильтрация пакетов

Внутренняя дружественная сеть и потенциально опасный Интернет должны быть разделены. Внутренние компьютеры должны быть ограничены от пагубного внешнего воздействия, но при этом, с одной стороны, они должны обеспечивать другие компьютеры внутренней сети необходимыми сервисами; с другой стороны, должны иметь полноценный доступ к компьютерам Интернета. Эта задача обычно решается при помощи брандмауэра.

Брандмауэр представляет собой программно-аппаратный комплекс, выполняющий разграничение сетей и ограничивающий доступ из одной сети в другую. Термин брандмауэр (firewall) берет свое начало в строительной отрасли, где он означает сооружение, препятствующее распространению огня при пожаре из одной части здания в другую. Аналогичным образом, в компьютерных сетях брандмауэр ограничивает распространение вредного сетевого воздействия.

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

Брандмауэры обычно строятся на базе двух элементов, которые оба занимаются фильтрацией и контролем трафика, но делают это по-разному:

  • Фильтры пакетов выполняют анализ содержимого проходящих через него сетевых пакетов и пропускает только некоторые из них. Таким образом, нежелательные соединения отсекаются. Такой брандмауэр работает на сетевом и транспортном уровнях и абсолютно прозрачен (незаметен) для протоколов более высокого уровня.

    ОС FreeBSD может выполнять пакетную фильтрацию с помощью подсистемы ядра ipfw.

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

    Ярким примером такого рода брандмауэра может служить кэширующий прокси-сервер, который обрабатывает клиентские HTTP-запросы. Клиенты не могут соединиться напрямую с web-сервером и отправляют запрос прокси-серверу, который в свою очередь обращается уже к web-серверу.

Обычно обе технологии построения брандмауэров комбинируют.

Утилита ipfw

Утилита 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 уже существует, оно будет перезаписано.

Таблица 1. Действия с цепочками правил

Название

Смысл

add

Добавить правило

delete

Удалить правило

flush

Очистить цепочку

show или list

Показать содержимое цепочки правил

zero или resetlog

Обнулить счетчики правил

Правила ipfw

Общая структура правила такова:

[ число ] [ 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 -- сообщение "Порт недоступен".



[1] Если быть точным, то ipfw2