Материал просмотрен 7,997 раз(а)

Итак, у нас поставлена система FreeBSD и на ней собрано ядро с файрволлом ipfw. Теперь начинаем настраивать этот файрволл, заодно и разберемся, как он работает.

Подключение файрволла ipfw.

Открываем файл /etc/rc.conf

#ee /etc/rc.conf

Дописываем туда строки:

firwall_enable="yes"
firewall_script="/etc/firewall.conf"

Закрываем файл /etc/rc.conf

Создаем файл /etc/firewall.conf:

#ee /etc/firewall.conf

Пишем туда:

#!/bin/sh
ipfw="/sbin/ipfw" #объявили переменную ipfw, которая содержит путь до исполняемого файла файрволла.

${ipfw} -f flush #очищаем список всех старых правил
${ipfw} -f queue flush #очищаем список очередей
${ipfw} -f pipe flush #очищаем список каналов

Сохраняем и делаем файл исполняемым:

#chmod +x /etc/firewall.conf

А далее будем учиться писать правила. Правила я разбиваю на категории и подробно рассмотрю каждую из них ниже. Но для начала опишу сетевую топологию данного примера.

У нас две виртуальные машины, которые друг друга прекрасно пингуют. ОС Windows XP (192.168.0.10) и ОС FreeBSD 8.2, описанная в самом начале статьи, с файрволлом ipfw.

Запрещающее правило для ipfw (deny)

${ipfw} add 00010 deny icmp from any to me via em1

Итак, начинаем разбор полётов.

Структура правила очень проста. Вначале идёт использование переменной ipfw, которая у нас в начале скрипта. Можно в тексте скрипта объявить любую переменную NAME=”VALUE” и использовать её в скрипте как ${NAME}. Весьма удобно, если нужно изменить в разных местах одно и то же значение.

Итак, add 00010 – это добавление правила с номером 10. Нумерация правил идет с 1 до 65535, причем последнее правило – разрешающее по-умолчанию (определяется опцией ядра IPFIREWALL_DEFAULT_TO_ACCEPT), либо запрещающее по-умолчанию.

Следующим идёт действие. В данном случае – deny (запретить), могут быть allow, deny, divert и т.д, мы их будем касаться по мере изучения.

Следующим идет протокол. Можно запретить any (все), только tcp или ip (соответствующей директивой).

from <откуда> to <куда> via <интерфейс>

Я думаю, здесь тоже проблем не возникает. В качестве параметров откуда и куда можно использовать либо указывающие слова any (любой), me – адрес самого сервера с файрволлом, или переменная, в которой хранится IP узла.

В данном примере правило:

${ipfw} add 00010 deny icmp from any to me via em1

Создает запрет на прохождение icmp пакетов с любого узла через интерфейс em1 на адрес шлюза. Правило будет иметь номер 10.

Надо сказать, что правила применяются в порядке нумерации, то есть правила с меньшим номером сравниваются раньше, чем с большим.

Пакет проходит по списку правил до первого совпадения. Далее, с пакетом происходит действие, указанное в правиле.

Применяются правила простым вызовом этого файла:

#/etc/firewall.conf

Он ведь у нас исполняемый. Легко заметить, что пинги теперь не идут.

Зелёным подчеркнул до применения правила файрволла, а красным – после.

Ограничение скорости на передачу данных.

Сейчас мы будем заниматься ограничением пропускной способности сети. Я примерно нарисовал схемку, как работает пайп (pipe).

Мы видим два направления передачи данных. Коричневое и зеленое. Коричневое из винды в freebsd, зеленое – обратно. Так вот, ещё важное уточнение, что у каждого направления есть in и out. Т.е. Передается из Windows (это out) но в FreeBSD (in), наоборот, для FreeBSD в качестве out будет начало канала, а для нас он входящий, значит in. По рисунку, я думаю, понятно.

Так вот, Pipe – труба – ставится на любое направление. И как бы “сужает” канал до нужного значения. Тестировать скорость сети мы будем утилитой Iperf. Я замеряю скорость изначально:

Устанавливаем пайп. Для этого в список правил файрволла добавляем:

${ipfw} pipe 1 config bw 2048Kbit/s

Это правило определяет пайп с номером 1, шириной 2048 Кбит/сек., т.е. примерно 2 Мбит/с. bw – bandwidth – ширина канала.

Теперь пропустим канал в трубу. Так как для тестирования утилитой Iperf FreeBSD у нас будет сервером, а Windows XP – клиентом, то резать скорость будем в месте “in” у FreeBSD, т.е. на вход.

HOST="192.168.0.10/32"
${ipfw} add pipe 1 tcp from ${HOST} to me via em1

Как видите, здесь мы создали переменную HOST, в которую внесли адрес узла.

Просмотреть список правил можно командой:

#ipfw show — покажет список правил и количество пакетов (байт) пропущеных по этим правилам

или

#ipfw list — покажет только список правил

Применяем новые правила:

#/etc/firewall.conf

И наслаждаемся:

Скорость порезана на ~2 Мбит/с.

ПРОДОЛЖЕНИЕ СЛЕДУЕТ