ipfw - стандартный фаирвол.
Добовляем в ядро строки и пересобираем:
################################################################
options IPFIREWALL ; Собственно сам фаирвол
options IPFIREWALL_VERBOSE ; log-файл
options IPFIREWALL_VERBOSE_LIMIT=100 ; Ограничение log'a
options IPFIREWALL_FORWARD ; Форвардинг пакетов
################################################################
Эти опции задают закрытый фаирвол: deny ip from any to any,
хотя можно сделать открытый фаирвол для этого добавляем в ядро:
------------------------------------------------------------------
options IPFIREWALL_DEFAULT_TO_ACCEPT ; allow ip from any to any
------------------------------------------------------------------
Альтернативно без пересборки можно подгрузить модуль фаирвола:
sh# cd /boot/kernel/
sh# kldload ipfw
Фаирвол загруженый таким способом встаёт в deny ip from any to any
Добавим в /etc/rc.conf строки:
firewall_enable="YES"
firewall_script="/etc/ipfw.rules" ; фаил с правилами
Хотя можно сделать исполняемый фаил и положить в ~rc.d
sh# ln -s /usr/local/etc/rc.d
sh# cd /rс.d
sh# ee ipfw.sh
sh# chmod +x ipfw.sh
При каждой загрузке фаирвол будет сам прогружатся автоматически.
ipfw допускает следующие команды:
-a - при распечатке показываются значения счетчиков; команда вставки подразумевает эту опцию.
-d - при распечатке в дополнение к статическим выводятся динамические правила.
-е - при распечатке, если указана опция -d, также показывает просроченные динамические правила.
-f - не запрашивать подтверждения для команд, что может вызвать проблемы, если неверно используется, например, сброс.
-q - во время добавления, обнуления, очистки журналов или сброса не выводить сообщений (подразумевает -f).
Эта опция полезна для корректировки правил при выполнении множества команд ipfw в скриптах (например, в sh /etc/rc.firewall')
или при обработке файла, содержащего множество правил ipfw при удаленной сессии.
Если выполнен сброс (flush) в нормальном (подробном) режиме, (с конфигурацией ядра по умолчанию), то печатаются сообщения.
Поскольку все правила сброшены, сообщения не могут быть доставлены в удаленную сессию.
По этой причине удаленный вход будет закрыт, и все остальные правила выполнены не будут. Доступ к консоли должен быть восстановлен.
-t - при распечатке показывать соответствующие timestamp.
-N - проверять соответствие имен и адресов при выводе.
-s [field] - при распечатке каналов сортировать, согласно одному из четырех счетчиков (подсчитывают и текущие пакеты или байты).
Примерный конфигурация фаирвола:
sh# ee /rc.d/ipfw.sh
################################################################
#!/bin/sh
fw="/sbin/ipfw add"
my_lan="192.168.1.0/24" ; Моя локалка
ip_lan="192.168.1.1" ; Внутренний ip
if_lan="rl0" ; Внутренний интерфейс
ip_inet="212.22.22.22" ; Внешний ip;
if_inet="xl0" ; Внешний интерфейс
ip_adm="81.228.17.50" ; ip администратора
${fw} -fq flush ; Сброс всех правил
#Разрешаем все протоколы на lo0 (lo0 - это 127.0.0.1)
${fw} pass all from any to any via lo0
#Запрещаем прохождение фрагментированных пакетов
${fw} deny icmp from any to any frag
#Разрешаем типы ICMP траффика:
#"эхо-запрос", "эхо-ответ" и "время жизни пакета истекло"
#icmptypes взято отсюда http://doc.dvgu.ru/admin/iptables/a12854.htm
${fw} add allow icmp from any to any icmptypes 0,8,11
#Разрешаем работу по всем протоколам в пределах нашей сетки
${fw} pass all from any to any via ${if_lan}
#Счётчик общего трафика по протоколу TCP
#${fw} count tcp from any to any
#Подсчёт траффика Васи Пупкина по протоколу HTTP
#Адресс Васи - 192.168.1.17
${fw} count tcp from 192.168.1.17 to any 80 in via xl0
${fw} count tcp from 192.168.1.17 to any 80 out via xl0
#Закрыть всем доступ с записью в лог на сайт:
${fw} log deny all from any to www.playboy.com
#Разрешаем работу с DNS серверами (порт 53)
#Первоё правило на отсыл второе на приём...
#Прозрачное хождение всем по через все интерфейсы
${fw} pass udp from any to any 53
${fw} pass udp from any 53 to any
#Доступ админу по SSH на этот серв из вне (порт 22)
${fw} pass tcp from ${ip_adm} 22 to ${ip_inet}
${fw} pass tcp from ${ip_inet} to ${ip_adm} 22
#Разрешаем наше локалке работу по базовым портам TCP на интерфейсе xl0
${fw} pass tcp from ${my_lan} to any 25,80,110,443 via ${ip_inet}
${fw} pass tcp from any 25,80,110,443 to ${my_lan} via ${ip_inet}
# разрешаем tcp-пакеты по уже установленным соединениям
${fw} pass tcp from any to any established
# предпочитаю делать так:
${fw} 65534 deny log ip from any to any
# Это правило ведёт лог всего что запрещено.
# смотреть в файле /var/log/security
#Это правила есть всегда DEFAULT и действует для всех пакетов
#Оно в зависмости от того что мы воткнули ядро может быть:
#[allow ip from any to any] или [deny ip from any to any]
#Указывать его не обязательно, но можно! Проблем не будет.
${fw} 65535 deny ip from any to any
################################################################
Правила строятся следующийм образом:
[prob match_probability] action [log [logamount number]] proto from src to dst [interface-spec] [options]
[action]
allow,pass,permit,accept - разрешить пакетам
deny,drop - отбрасывать пакеты
reject - отбросить пакеты и отправить ICMP-сообщение, что проверяемый хост недоступен.
unreach code - отбрасывает пакет и отправляет ICMP-сообщение о недоступности хоста с кодом code,
(где code число от 0 до 255 или один из следующих псевдонимов (кодовых слов); net (сеть),
host (хост),
protocol (протокол),
port (порт),
needfrag (необходим фрагмент),
scrfail (сбой источника),
net-unknown (сеть неизвестна),
host-unknown (хост неизвестен),
isolated (изолирован),
net-prohib,
host-prohib,
tosnet,
toshost,
filter-prohib,
host-precedence (старшинство хоста) или
precedence-cutoff (старшинство останова);
reset - (only tcp) отбрасывает пакеты и посылают TCP reset (RST) сообщение.
count - модификация счетчиков для всех пакетов.
check-state - проверяет пакет по динамическим правиламу.
divert port - переадресация пакетов.
tee port - отправка копии пакетов.
fwd ipaddr [,port] - изменить next-hop (следующий отскок) для соответствующих пактов на IP-адрес ipaddr. Должно быть с опцией IPFIREWALL_FORWARD.
pipe pipe_nr - пропустить пакет через dummynet (фиктивную сеть) "pipe".
queue queue_nr - пропустить пакет по правилам dummynet "queue".
skipto number - пропустить все последующие правила с номерамие.
log [logamount number] - (с IPFIREWALL_VERBOSE) собщение будет записано в журнал syslogd cредством LOG_SECURITY; в файл /var/log/security; см. syslog.conf;
proto - IP-протоколы, который определяет именем или номером (полный список приведен в файле /etc/protocols); ip,udp,tcp,icmp,all.
[src и dst]:
any | me | [not] address/mask [ports] соответствие любому IP-адресу, который присвоен конфигурируемой системе.
address/mask может быть определен следующим образом:
ipno - IP-адрес в точечно-десятичной нотации (192.168.0.2), указывает на конкретный компьютер в сети;
ipno/bits - IP-адрес с маской (длиной сетевой части) в форме 1.2.3.4/24; в этом случае будут подходить все IP-адреса от 1.2.3.0 до 1.2.3.255.
inno:mask - IP-адрес с маской в форме 1.2.3.4:255.255.240.0; в этой записи указывается на соответствие всем IP-адресам от 1.2.0.0 до 1.2.15.255
[interface-spec]
Допускаются следующие комбинации спецификации интерфейсов:
in - только для входящих пакетов;
out - только для исходящих пакетов;
via rl0 - пакет должен быть пропущен через интерфейс rl0;
[options]
keep-state - динамическое правило двунаправленный трафик между источником и получателем; имеет ограниченный срок действия.
limit {src-addr | src-port | dst-addr | dst-port} N
- Брандмауэр разрешает только N соединений с теми же самыми параметрами, которые определяются данным правилом. Может быть указан один или более адресов источника или получателя и порты.
bridged - Cooтветствует только bridged-пакетам.
frag - Если пакет фрагментирован и если это не первый фрагмент датаграммы.
ipoptions spec - Если заголовок IP-пакета содержит список опций, указанный в spec.
опции: ssrr (strict source route, жесткая маршрутизация от источника),
lsrr (loose source route, свободная маршрутизацiя от источника),
rr (record packet route, запись маршрута пакета) и
ts (timestamp, отметка о времени).
Отсутствие какой-либо опции может быть обозначено знаком '!".
tcpoptions spec - Если tcp-заголовок содержит опции:
mss (maximum segment size, максимальный размер сегмента),
window (tcp window advertisement, рекламное окно TCP),
sack (селективный опрос),
ts (rfc1323, отметка о времени) и
cc (rfc1644 t/tcp счетчик соединений).
Отсутствие какой-либо опции может быть обозначено знаком '!".
established - Только TCP-пакетов. Если пакет, имеет битовые установки RST и ACK.
setup - Только TCP-пакетов. Если пакет, имеет битовую установку SYN, но не имеют установки ACK.
tcpflags spec - Только TCP-пакетов. Если заголовок TCP-пакета содержит флаги spec. TCP-флаги: fin, syn, rst, psh, ack и urg. или отсутсвие = '!'
icmptypes types - Только ICMP. Если тип ICMP-пакета содержит список опций, указанный в spec.
Список может указывать как на любую комбинацию диапазонов, так и на индивидуальный тип, разделенный запятыми.
Поддерживаются следующие ICMP-типы:
echo reply (0) - ответное эхо,
destination unreachable (3) - адресат недостижим,
source quench (4),
redirect (5) - перенаправляющий,
echo request (8) - запрос эха,
router advertisement (11) - реклама (объявление о себе) маршрутизатора,
IP header bad (12) - повреждение заголовка IP,
timestamp request (15) - запрос о метке времени,
information reply (16) - ответная информация,
address mask request (17) - запрос адресной маски,
address mask reply (18) - ответ на запрос об адресной маске.
uid user - Cоответствие пакетам TCP или UDP отправленным или принятым пользователем user.
gid group - Соответствие пакетам TCP или UDP, посланным или принятым группой group.