Проект переехал на новый домен!  [[ перейти ]]

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.