Для того, чтобы ядро выполняло фильтрацию пакетов, нужно чтобы в его состав были включены соответствующие модули.
Для этого необходимо поправить файл конфигурации ядра и пересобрать ядро системы. В файле /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 действительны только до перезагрузки. Для того, чтобы сделать их постоянными, необходимо чтобы фильтрация настраивалась каждый раз при загрузке системы.
Напомним, что конфигурация загрузки системы определяется файлом /etc/rc.conf. В нем описываются переменные, которые сообщают загрузочным скриптам, как они должны себя вести. Для того чтобы повлиять на работу загрузочных скриптов, следует изменять значения переменых, устанавливаемях в этом файле.
При запуске машины главный загрузочный скрипт /etc/rc.conf вызывает скрипт настройки сети /etc/rc.network [3]; он в свою очередь вызывает /etc/rc.firewall. Скрипт /etc/rc.firewall выполняет настройку брандмауэра.
В FreeBSD описано несколько типовых конфигураций брандмауэра. Типовая конфигурация выбирается с помощью переменной firewall_type.
Брандмауэр пропускает все пакеты.
Брандмауэр настроен так, как должен быть настроен стандартный клинетский компьютер. Он разрешает все исходящие соединения, и запрещает все входящие соединения кроме соединений по 25 порту.
Брандмауэр
пропускает пакеты, которые отправляются хостом ${ip} в локальную сеть {net}: {mask};
разрешает все исходящие соединения с хоста;
разрешает все входящие соединения на 25 порт
запрещает все остальные входящие TCP соединения;
разрешает прохождение UDP пакетов по портам DNS (53) и NNTP (123).
все остальные пакеты рассматриваются правилом-по-умолчанию, которое определяется конфигурацией ядра
Простеший брандмаэур, защищающий локальную сеть от проникновения из Интернета. Правила фильтрации точно такие же, как и в CLIENT, но
Есть поддержка natd. Выполняться передача IP-пакетов на divert-сокет демона natd, при условии что natd_enable=YES;
Выполняется защита от 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.
Разрешает только трафик через локальный интерфейс lo0. Прохождение остального трафика определяется правилом-по-умолчанию.
Брандмауэр в режиме CLOSED закрыт только в том случае, если правило-по-умолчанию установелно ядром в deny |
Брандмауэр никак не настраивается. Будет он пропускать трафик или нет определяется конфигурацией ядра системы. Используется по умолчанию.
Правила брандмауэра загружаются из внешнего файла. Имя файла определяется значением переменной 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-правила. Нужно запустить его вручную, но при этом не забыть аргументы.