Работа с ipfw во FreeBSD

Настройка ядра для поддержки ipfw

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

Для этого необходимо поправить файл конфигурации ядра и пересобрать ядро системы. В файле /usr/src/sys/i386/conf/ВАШЕ_ЯДРО нужно добавить такие строки:

options IPFIREWALL

options IPFIREWALL_VERBOSE

options IPFIREWALL_VERBOSE_LIMIT=10

options IPFIREWALL_DEFAULT_TO_ACCEPT

и пересобрать его. Опции, , являются необязательными. Опция должна использоваться всегда, если нужно включить поддержку ipfw в ядро.

Для поддержки модуля dummynet нужно добавить опцию DUMMYNET в конфигурационый файл ядра:

options DUMMYNET

Дополнительные параметры, которые могут быть полезны при тонкой настройке dummynet, это NMBCLUSTERS и HZ. Первый позволяет указать объемы сетевых буферов, а второй -- точность (granularity) таймера.

Если шлюз выполняется трансляцию адресов с помощью демона natd, нужно чтобы ядро могло обеспечить передачу ему пакетов в с помощью так называемых divert-сокетов. Поддержка divert-советов в ядре включается с помощью опции IPDIVERT:

options IPDIVERT

Таблица 6. Опции конфигурации ядра, относящиеся к фильтру пакетов

Опция Назначение

IPFIREWALL Включить в ядро код, который выполняет фильтрацию пакетов

IPFIREWALL_VERBOSE Разрешить заносить информацию о пакетах в syslog. Если эта опция не включена, опция log в правилах ipfw ничего не даст.

IPFIREWALL_VERBOSE_LIMIT=10 Если количество записей занесенных в журнал одним правилом превышает указазнный предел (в данном случае, 10), записи прекращают заноситься. Для того, чтобы начать заносить их вновь, нужно сброси счетчик с помощью команды zero.

IPFIREWALL_DEFAULT_TO_ACCEPT Превратить правило-по-умолчанию в allow. Если эта опция не указана, правило-по-умолчанию установлено в deny.

IPDIVERT Поддержка divert-сокетов. Необходима для работы natd (точнее для того, чтобы natd могло работать правильно).

DUMMYNET Встравивать в ядро модуля dummynet. Модуль используется для ограничения величины информационных потоков

HZ Точность таймера

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

# /usr/sbin/config ВАШЕ_ЯДРО

# cd ../compile/ВАШЕ_ЯДРО

# cd ../../compile/ВАШЕ_ЯДРО

# make depend

# make

# make install

Настройка ipfw и natd при загрузке

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

Напомним, что конфигурация загрузки системы определяется файлом /etc/rc.conf. В нем описываются переменные, которые сообщают загрузочным скриптам, как они должны себя вести. Для того чтобы повлиять на работу загрузочных скриптов, следует изменять значения переменых, устанавливаемях в этом файле.

При запуске машины главный загрузочный скрипт /etc/rc.conf вызывает скрипт настройки сети /etc/rc.network [3]; он в свою очередь вызывает /etc/rc.firewall. Скрипт /etc/rc.firewall выполняет настройку брандмауэра.

В FreeBSD описано несколько типовых конфигураций брандмауэра. Типовая конфигурация выбирается с помощью переменной firewall_type.

OPEN

Брандмауэр пропускает все пакеты.

CLIENT

Брандмауэр настроен так, как должен быть настроен стандартный клинетский компьютер. Он разрешает все исходящие соединения, и запрещает все входящие соединения кроме соединений по 25 порту.

Брандмауэр

1. пропускает пакеты, которые отправляются хостом ${ip} в локальную сеть {net}: {mask};

2. разрешает все исходящие соединения с хоста;

3. разрешает все входящие соединения на 25 порт

4. запрещает все остальные входящие TCP соединения;

5. разрешает прохождение UDP пакетов по портам DNS (53) и NNTP (123).

6. все остальные пакеты рассматриваются правилом-по-умолчанию, которое определяется конфигурацией ядра

SIMPLE

Простеший брандмаэур, защищающий локальную сеть от проникновения из Интернета. Правила фильтрации точно такие же, как и в CLIENT, но

1. Есть поддержка natd. Выполняться передача IP-пакетов на divert-сокет демона natd, при условии что natd_enable=YES;

2. Выполняется защита от IP-спуфинга. Пакеты, которые имеют адреса предназначеные для использования внутри локальных сетей 10.x.x.x, 172.16.x.x-172.31.x.x, 192.168.x.x. (RFC 1918) не пропускаются по внешнему интерфейсу. Также удаляются пакеты из внешней сети, которые имеют адрес возврата из сети внутренней.

Адреса внутренней {inet}: {imask} и внешней {onet}: {omask} сети, а также адреса внутреннего ${iif} и внешнего ${oif} интерфейсов указываются в файле /etc/rc.firewall.

Значения ${ip}, ${net} и ${mask} следует вручную устанавливать в файле /etc/rc.firewall.

CLOSED

Разрешает только трафик через локальный интерфейс lo0. Прохождение остального трафика определяется правилом-по-умолчанию.

Брандмауэр в режиме CLOSED закрыт только в том случае, если правило-по-умолчанию установелно ядром в deny

UNKNOWN

Брандмауэр никак не настраивается. Будет он пропускать трафик или нет определяется конфигурацией ядра системы. Используется по умолчанию.

файл

Правила брандмауэра загружаются из внешнего файла. Имя файла определяется значением переменной firewall_type. Дополнительные аргументы ipfw могут быть переданы с помощью firewall_flags.

Файл должен содержать команды ipfw в том виде, в каком они указываются в его командной строке. Например:

add deny icmp from any to any

add deny ip from 1.2.3.4 to any

allow tcp from any to any established

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

Если нужно чтобы шлюз выполнял трансляцию адресов, в /etc/rc.conf следует указать natd_enable=YES. Это приведет к тому, что при загрузке автоматически будет запускаться демон natd. Нужно указать еще natd_interface, для того чтобы natd знал, какой интерфейс является внешним, и natd_flags="-f /etc/natd.conf", чтобы natd знал, откуда ему брать свою конфигурацию. Можно описать конфигурацию natd прямо в этой строке и не выносить ее во внешний файл.

natd_enable="YES"

natd_inteface="lnc0"

natd_flags="-f /etc/natd.conf"

Изменеия конфигурации фильтра пакетов вступят в силу после перезагрузки компьютера. Чтобы они стали действительными прямо сейчас можно выполнить [4]:

# sh /etc/rc.conf /etc/rc.firewall

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

Таблица 7. Некоторые параметры /etc/rc.conf

firewall_enable (YES| NO ) Запускать или нет скрипт настройки брандмауэра /etc/rc.firewall

firewall_script (/etc/rc.firewall) Скрипт, который запускается для настройки брандмаэра

firewall_type (OPEN| CLIENT| SIMPLE| CLOSED| UNKNOWN | файл ) Типа брандмауэра. Определяет, как будет выглядеть таблица фильтрации пакетов.

firewall_quiet (YES| NO ) Нужно ли выполнять все операции в молчаливом режиме. При указании YES ipfw вызывается с ключом -q.

firewall_logging (YES| NO ) Разрешить журнализирование. Включает значение net.inet.ip.fw.verbose в 1.

firewall_flags Список флагов, которые передаются ipfw при вызове

natd_program (/sbin/natd) Программа, которая используется в качестве natd. По умолчанию: /sbin/natd

natd_enable (YES| NO ) Включить поддержку natd. Это приводит к тому, что запускается демон natd и для брандмауэра типа SIMPLE и OPEN автоматически настраивается divert на natd для всех пакетов, проходящих через внешний интерфейс (natd_interface).

natd_interface Интерфейс, адресом которого маскируются исходящие пакеты. Все пакеты, проходящие через этот интерфейс автоматически пеередаются natd если брандмауэр настроен как SIMPLE или OPEN.

natd_flags Дополнительные флаги, которые передаются natd. Есть смысл задавать здесь -f /etc/natd.conf и описывать конфигурацию демона в файле /etc/natd.conf.

3] Точнее, функции которые в нем описаны. Скрипт не делает ничего, кроме того, что описывает несколько функций инициализации сети. Вот почему запуск sh /etc/rc.network сам по себе ничего не дает.

[4] При трансляции адресов скрипт /etc/rc.firewall не запускает natd, а только настраивает divert-правила. Нужно запустить его вручную, но при этом не забыть аргументы.

Обновлено: 12.03.2015