handbook - IPFW


handbook - IPFW

   Перевод англицкого раздела handbook - касающийся IPFW. Прислал Andy.


  Примечание: Данный раздел находится в разработке. Содержание всегда может быть неточным.

  IPFIREWALL (IPFW) является поддерживаемым файрволлом FreeBSD, авторы и люди развивающие данное программное обеспечение являются добровольцами. Он использует правила наследования состояния и наследовние техники программирования для достижения того, что называется логикой Simple Stateful (простое состояние).
  Пример набора правил для IPFW (находится в “/etc/rc.firewall”) в стандартной инсталляции FreeBSD довольно прост, и не предусматривается его прямое использование, без модификации. Примеры не используют фильтрацию состояния, которое необходимо в большинстве настроек, поэтому оно не будет использоваться как основа для этого раздела.
  Правила состояний IPFW подразумевают технически сложные возможности выбора, которые могут превзойти уровень знания обычного пользователя брендмауэра. IPFW предназначен для профессионального пользователя, или для технически продвинутого человека, увлеченного своим хобби, которому требуются улучшенные возможности выбора пакетов. Высокий уровень знаний о том, как различные протоколы используют и создают свои уникальные заголовки пакетов, необходим перед тем, как будет выпущена сила IPFW. Предоставление такого рода объяснений, выходит за рамки данной раздела руководства.
  IPFW составлен из семи компонентов, первичный компонент - брэндмауэр управляющий списком правил на уровне ядра и интегрированная в него возможность пакетного учета, возможность ведения логов, "divert" правила которые взаимодействуют с NAT, и улучшенные специальные средства, траффик dummynet, возможность шейпинга, возможность перенаправления "fwd rule", возможность бриджа, возможность ipstealth.


28.6.1 Включаем IPFW
  IPFW содержит в простой инсталляции FreeBSD отдельно загружаемые модули. Система динамически загружает модуль ядра когда в “rc.conf” используется значение “firewall_enable="YES"”. Вам не нужно включать поддержку IPFW в ядро, пока вам не потребуется включить функцию NAT.
  После перезагрузки вашей системы с “firewall_enable="YES"” в rc.conf, следующее собщение высветится на вашем экране как часть процесса загрузки:
ipfw2 initialized, divert disabled, rule-based forwarding disabled, default to deny, logging disabled
  Загружаемый модуль содержит встроенную возможность протоколирования. Для того что бы включить ведение логов и установить предел отчета, есть строки которые нужно установить в “/etc/sysctl.conf”, добавляя эти значения ведение логов будет включено при следующей перезагрузке:
net.inet.ip.fw.verbose=1
net.inet.ip.fw.verbose_limit=5

28.6.2 Опции ядра
  Не обязательным является требование включения IPFW следующих опций при компиляции ядра, до тех пор пока вам не понадобилась возможность NAT. Они представлены здесь как дополнительная информация.
options    IPFIREWALL
  Эта опция включает IPFW как часть ядра
options    IPFIREWALL_VERBOSE
  Включается лог пакетов которые прошли через IPFW и имеют установленное ключевое слово "log" в наборе правил.
options    IPFIREWALL_VERBOSE_LIMIT=5
  Ограничивает число входящих пакетов зарегестрированных через syslogd. Вы можете захотеть использовать эту опцию во враждебном окружении, в которой вам потребуется протоколировать активность брэндмауэра. Эта возможность закроет возможные denial of service атаки, через флудинг syslog'а.
options    IPFIREWALL_DEFAULT_TO_ACCEPT
  Эта опция позволит всему проходить через файрволл по умолчанию, неплохая идея если вы только начинаете настроивать файрволл.
options    IPV6FIREWALL
 options    IPV6FIREWALL_VERBOSE
 options    IPV6FIREWALL_VERBOSE_LIMIT
 options    IPV6FIREWALL_DEFAULT_TO_ACCEPT
  Эти опции точно такие же как и для IPv4, только они для IPv6. Если вы не используете IPv6 вы возможно захотите использовать IPv6FIREWALL без всяких правил для блокировки все IPv6.
options    IPDIVERT
  Эта опция включает использование NAT
  Примечание: если вы не включаете IPFIREWALL_DEFAULT_TO_ACCEPT или набор ваших правил позволяет входящие пакеты, вы блокируете все пакеты идущие к вам и от вашей машины.


28.6.3 Опции “/etc/rc.conf”
Включаем файрволл:
firewall_enable="YES"
  Для выбора одного из правил по умолчанию, идущих с FreeBSD, выберите одно прочитав файл “/etc/rc.firewall” и внесите в него следующее:
firewall_type="open"
  Возможные значения для этой установки следующие:
тип значение
open пропускаем весь траффик
client будет защищать только эту машину
simple защита всей сети
closed полностью выключает весть IP траффик; исключая loopback интерфейс
UNKNOWN выключает загружаемые правила файрвола
filename абсолютный путь к файлу содержащему правила

  Возможно использование двух разных путей, для загрузки разных правил для файрволла “[bjipfw[/b]”. Первое - это установка переменной “firewall_type” в абсолютном пути к файлу, которая содержит правила для файрвола без всяких опций командной строки для самого ipfw. Простой пример набора правил следующий:
add block in  all
add block out all
  С другой стороны, можно установить переменную “firewall_script” в абсолютном пути запускаемого скрипта, который содержит ipfw команды которые запускаются во время загрузки системы. Правильный набор правил в скрипте, будет эквивалентен набору правил в файле, показанному выше, следующий:
#!/bin/sh

ipfw -q flush

ipfw add block in  all
ipfw add block out all
  Примечание: Если “firewall_type” установлен в “client” или в “simple”, правила по умолчанию находятся в “/etc/rc.firewall” должны быть рассмотрены для заполнения конфигурационного файла данной машины. Так же учтите, что примеры используемые в этой главе предусматривают что “firewall_script” установлен в “/etc/ipfw.rules”.
  Включаем протоколирование:
firewall_logging="YES"
  Внимание: Единственная вещь, которую сделает переменная “firewall_logging”, это присвоит “1” значению переменной “net.inet.ip.fw.verbose” в “sysctl” (смотрите секцию 28.6.1). В “rc.conf” нет переменной которая устанавливает ограничение на файл логов, но значение может быть установлено через переменную “sysctl”, вручную или из файла “/etc/sysctl.conf”:
net.inet.ip.fw.verbose_limit=5
  Если ваша машина работает как гейт, то есть, осуществляет трансляцию адресов (NAT) через natd, пожалуйста обратитесь к секции 29.8, для информации относительно опций в “/etc/rc.conf”.


28.6.4 Команды IPFW
  Команды ipfw - обычное средство для создания одного правила, или добавления или удаления активного внутреннего правила файрвола, пока он загружен. Проблема использования данного метода состоит в том, что пока ваша система не выключится или зависнет, все правила которые были добавлены, или изменены, или удалены, потеряются. Запись всех правил в файл и использование этого файла для загрузки правил во время загрузки системы, или массовое замещения выполняемых в данный момент правил файрволла, изменениями которые вы записали в файл - рекомендованный метод, который здесь используется.
  Комманда ipfw все еще очень полезна, для вывода используемых правил файрвола на консольный экран. Считывающее средство IPFW, динамически создает счетчик для каждого правила, которое считает каждый пакет, который совпадает с правилом. В течении процесса проверки правила, список правил с счетчиком является одним из способов определить функционирование правила.
  Последовательный список всех правил:
ipfw list
Список всех правил, с пометкой времени, когда правило последний раз совпадало:
ipfw -t list
Список собранной информации, количество совпавших с правилами пакетов, наряду с самими правилами.
Первая колонка, номер правил, сопровождаемая количеством совпавших исходящих пакетов, следующее за
номером входящих совпавших пакетов и затем, само правило.
ipfw -a list
Список динамических правил добавленных к статическим:
ipfw -d list
Так же показывает список истекших динамических правил:
ipfw -d -e list
Сбрасывает счетчики:
ipfw zero
Сбрасывает счетчики только для правила NUM:
ipfw zero NUM

28.6.5 Набор правил IPFW
  Набор правил это группа правил ipfw написанных для пропускания или отбрасывания пакетов основанных на значениях содержащихся в самих пакетах. Двунаправленный обмен пакетов между хостами, включает диалог сессии. Набор правил устанавливает процесс пакета дважды: первый когда он пребывает из общего интернет хоста, и второй раз, когда он отправляется к общему хосту в интернете. Каждый сервис tcp/ip (т.е. telnet, www, mail, и так далее) предопределен в соответствии с протоколом и номером порта. Это основные критерии используемые при создании правил которые пропускают или отбрасывают сервисы.
  Когда пакет входит в файрволл, он сопоставляется с первым правилом в наборе и увеличивается на единицу за количество перемещений сверху вниз в списке по возрастанию номера правила в порядке следования. Когда пакет совпадает с выбранными правилами, значение области действия правил выбрано, для этого пакета поиск правил заканчивается. В поиске это упоминается как "первое совпадение побеждает". Если пакет не совпадает ни с одним из правил, он ловится принудительно правилом по умолчанию в ipfw, с номером 65535 которое отбрасывает все пакеты без отправления назад по тому же пути.
  Примечание: Поиск будет продолжен, после count, skipto и tee правил.
  Инструкции содержащиеся здесь базируются на использовании правил, которые содержат состояния "keep state", "limit", "in"/"out", а так же через опции. Это основа написания правил и включаемых типов в набор правил файрволла.
  Включаемый набор правил файрволла только позволяет проходить сервисам через совпадения с правилами. Таким образом, вы можете контролировать какие сервисы пройдут от вас в интернет, и какие сервисы получат доступ к вашей частной сети из интернета. Все остальное будет отброшено по умолчанию. Включаемые наборы правил намного более безопасны, чем исключающие наборы, и это единственный тип правил рассматриваемый здесь.
  Внимание: Когда работаете с правилами файрволла будьте внимательны, вы можеть заблокировать себя.


28.6.5.1 Синатксис Правил
  Синтаксис правил представленный тут, был упрощен потому, что необходимо создать стандарт правил файрволла включаемого типа. Для более полного описания синтаксиса правил смотрю5ю1справочную страницу ipfw.
  Правила содержат ключевые значения: эти ключевые значения должны быть написаны в определенном порядке, слева направо в строчку. Ключевые слова выделены жирным. Некоторые ключевые слова имеют подопции, которые сами могут быть ключевыми словами и так же включать еще больше подопций.
  # - используется для отметки начала комментария, и может следовать до конца строки правила или содержать собственные строки. Пустые строки игнорируются.
CMD RULE_NUMBER ACTION LOGGING SELECTION STATEFUL

28.6.5.1.1 CMD
  Каждое новое правило, должно предворяться “add”, для того что бы добавить правило во внутреннюю таблицу.


28.6.5.1.2 RULE_NUMBER
  Каждое правило должно иметь номер правила, для работы с ним.


28.6.5.1.3 ACTION
  Правило которое может быть ассоциировано с одним из следующих действий, которые будут запущены когда пакет совпадает с выбранным критерием правила.
allow | accept | pass | permit
  Все это означает ту же самую вещь, которая позволяет пакетам, которые совпадают с правилом, выйти из обработки правил брэндмауэром. Поиск заканчивается на этом правиле.
check-state
  Сравнивает пакет с динамической таблицей правил. Если найдено совпадение, выполняется действие, связанное с правилом которое создало это динамическое правило, иначе переходит к следующему правилу. Check-state не имеет критериев выбора. Если ни одно check-state состояние не найдено в наборе правил, динамическая таблица правил проверятся на первые keep-state или limit правила.
deny | drop
  Оба слова значат тоже самое, что и отбрасывание пакетов которые совпадают с этим правилом. Поиск заканчивается на этом правиле.


28.6.5.1.4 Протоколирование
log или logamount
  Когда пакет совпадает с правилом, с ключевым словом “log”, сообщение будет сохранено syslog'ом в логе с именем SECURITY. Протоколирование только произойдет если количество пакетов которые будут запротоколированы для определенного правила не превысит параметр logamount. Если logamount не определен, лимит берется из переменной в sysctl - net.inet.ip.fw.verbose_limit. В обоих случаях значение ноль удаляет лимит логов. Тогда когда лимит будет достигнут, протоколирование можно будет запустить заново, очистив счетчик протоколирования, или счетчик пакетов для этого правила. Смотрите команду сброса логов ipfw.
  Примечание: Протоколирование завершается после того, как состояние всех других пакетов будет успешно подтверждено и перед выполнением заключительного действия (“accept”, “deny”) над пакетом. Вам решать какое правило вы хотите протоколировать.


28.6.5.1.5 Отбор
  Ключевое слово описаное в данном разделе используется для описания атрибутов пакета, который будет опрошен при определении совпадает правило с пакетом или нет. Следующие признаки общего назначения, даны для соответствия и должны использоваться в таком порядке:
udp | tcp | icmp
или любые имена протоколов, содержащиеся в “/etc/protocols”, распознаются и могут быть использованы. Значение определенное в протоколе должно быть сопоставимо. Это обязательное требование.
from src to dst
from и to используются для сопоставления с IP адресом. Правила должны быть определены для обоих параметров, источника и приемника. any специально ключевое слово, которое совпадает с IP адресом. me - специальное ключевое слово которое совпадает с любым IP адресом заданным на интерфейсе вашей FreeBSD для представления PC где запущен файрволл (то есть как коробки) как "от меня к любому" или от "от любого ко мне", или "от 0.0.0.0/0 к любому" или "от 0.0.0.0/0 ко мне", или "от 0.0.0.0 к любому" или "от 0.0.0.0 ко мне", IP адреса определены как адреса через точку, цифровая форма/длина маски или как один IP адрес без маски. Это обязательное требование. Смотрите эту ссылку для помощи по записям длины маски http://jodies.de/ipcalc.
port number
  Для протоколов которые поддерживают номера (такие как TCP или UDP). Обязательно нужно написать номер порта сервиса для совпадения. Имена сервисов (из “/etc/services”) могут использоваться вместо значений номеров портов.
in | out
  Совпадения для входящих или исходящих пакетов соответственно. in и out - ключевые слова и обязательное написание одного или другого как часть критерия совпадения.
via IF
  Совпадающие пакеты проходящие через определенное имя интерфейса интерфейс. via - ключевое слово которое означает интерфейс который будет всегда проверяться как часть процесса совпадения.
setup
  Обязательное ключевое слово, которое распознает запрос о начале сессии для TCP пакетов.
keep-state
  Обязательное ключевое слово. После совпадения файрволл создаст динамическое правило, чье поведение по умолчанию состоит в том, что бы было совпадение двунаправленного траффика между IP адресом или портом источника и приемника по тому же самому протоколу.
limit {src-addr | src-port | dst-addr | dst-port}
  Файрволл будет позволять только N соединений с тем же набором параметров, какие определены в правилах. Один или больше исходных и приемных адрессов может быть определено. "limit" и "keep-state" не могут быть использованы в том же правиле. "limit" дает ту же самую функцию состояния как и "keep-state" плюс собственные функции.


28.6.5.2 Опция правил состояний
  Фильтр состояний расценивает траффик, как двунаправленный обмен пакетами включая сессию. Он умеет определять установлена ли сессия между оригинальным отправителем и назначением следющим за правильной процедурой двунаправленного обмена. Любые пакеты, которые не соответствуют заголовкам сессии, автоматически отвергаются.
  "check-state" используется для определения, в какой момент, в наборе правил IPFW, пакет должен быть проверен в таблице динамических правил. При совпадении, пакет покидает файрвол и продолжает свой путь, новое правило создается динамически для следующего ожидаемого пакета при обмене в течении этой двунаправленной сессии. При несовпадении, пакет продвигается к следующему правилу.
  Динамические правила уязвимы для SYN-flood атак, которые открывают большое количество динамических правил. Для предотвращения подобного рода атак, во FreeBSD добавлена новая опция названная limit. Эта опция используется для ограничения числа одновременных сессий, путем опроса полей источника и полей назначения, указанных в опции limit и использования IP адресов пакетов найденых там же, в поиске открытых динамических правил подсчитывая количество правил и IP адресов, если количество больше, чем значение переменной limit, пакет отбрасывается.


28.6.5.3 Протоколирование сообщений файрволла
  Выгоды протоколирования очевидны: предоставляется возможность посмотреть логи после активирования правила, которые содержат информацию, какой пакет был отброшен, из какого адреса он пришел и куда направлялся, предоставляя вам серьезную возможность выследить нападающих.
  Даже если возможность ведения логов включена, IPFW не создаст правила протоколирования сам. Администратор файрволла решает сам, какое правило в наборе он хочет протоколировать, и добавляет к этому правилу протоколирование. Обычно протоколируются только запрещающие правила, как например, правило запрещающее входящие ICMP пинги. Таким образом, вы увидите все пакеты, которые не совпадают ни с одним правилом, в наборе правил.  Протоколирование - это палка о двух концах, если вы не осторожны, то вы потеряетесь в обилии логов и быстро заполните дисковое пространство расширяющимися лог файлами. DoS атаки которые быстро заполняют дисковый массив, одни из самых старых нападений. Эти логи пишутся не только в syslogd, но еще и на выводяться на главную консоль и быстро раздражают.
  Опция ядра IPFIREWALL_VERBOSE_LIMIT=5 ограничивает количество сообщений посланных syslogd, относительно совпадения данного пакета правилу. Когда эта опция включена в ядро, число сообщений относительно определенного правила, заключено в определенном числе. Ничего не будет получено от 200 сообщений, которые говорят об одной и той же вещи. Например, 5 сообщений, относительно специфического правила были получены syslogd, остальные идентичные сообщения будут подсчитаны и переданы syslogd следующей фразой:
last message repeated 45 times
  Все сообщения о протоколируемых пакетах записываются по умолчанию в файл “/var/log/security”, который определен в файле “/etc/syslog.conf”.


28.6.5.4 Создаем скрипт с правилами
  Большинство опытных пользователей IPFW создают файл содержащий правила и пишут его на манер запускаемого скрипта. Главная выгода от этого - правила файрволла могут быть обновлены разом без необходимости перезагрузки системы для активации новых правил. Этот метод очень удобен при тестировании новых правил, так как процедура запуска может быть выполнена столько раз, сколько это необходимо. В скрипте вы можете использовать символическую подмену, для написания частоиспользуемых значений и подмены их во многих правилах. Вы увидите это в следующих примерах.
  Синтаксис скрипта, который используется здесь, совместим c 'sh', 'csh', 'tcsh' оболочками. Поля с символической подменой, указываются в виде префикса, долларового знака '$' . Символические поля не имеют долларового знака. Значение записываемое в символическое поле должно быть заключено в "двойные кавычки".
  Начните ваш файл с правилами, так:
############### начало примера скрипта с правилами ipfw #############
#
ipfw -q -f flush       # Удаляем все правила
# Устанавливаем значения по умолчанию
oif="tun0"             # выходной интерфейс
odns="192.0.2.11"      # IP адрес DNS'а провайдера
cmd="ipfw -q add "     # префикс создания правил
ks="keep-state"        # слишком ломает писать это постоянно
$cmd 00500 check-state
$cmd 00502 deny all from any to any frag
$cmd 00501 deny tcp from any to any established
$cmd 00600 allow tcp from any to any 80 out via $oif setup $ks
$cmd 00610 allow tcp from any to $odns 53 out via $oif setup $ks
$cmd 00611 allow udp from any to $odns 53 out via $oif $ks
################### конец примера скрипта с правилами ipfw ############
  Вот, собственно и все. Правила не важны в этом примере, демонстрировалось как используются и заполняются поля символической подмены.
  Пример выше содержится в файле “/etc/ipfw.rules”, вы можете загрузить эти правила, набрав в командной строке следующее:
# sh /etc/ipfw.rules
  Файл “/etc/ipfw.rules” может находится где угодно и именоваться как угодно.
  Те же самое, могжет быть достигнуто загрузкой команд вручную:
ipfw -q -f flush
ipfw -q add check-state
ipfw -q add deny all from any to any frag
ipfw -q add deny tcp from any to any established
ipfw -q add allow tcp from any to any 80 out via tun0 setup keep-state
ipfw -q add allow tcp from any to 192.0.2.11 53 out via tun0 setup keep-state
ipfw -q add 00611 allow udp from any to 192.0.2.11 53 out via tun0 keep-state

28.6.5.5 Набор правил состояний
  Следующее не NAT набор правил - пример, как написать очень защищеный "включаемый" тип файрвола. Включаемый тип файрвола позволяет пройти через него только совпавшим сервисам, остальное он блокирует по умолчанию. Все файрволлы должены иметь, как минимум, два интерфейса которые должны иметь правила позволяющие файрволлу функционировать.
  Все UNIX® подобные операционные системы разработаны для использования интерфейса lo0 и IP адреса 127.0.0.1 для внутреннего взаимодействия с операционной системой. Правила файрволла должны содержать правила, которые позволяют беспрепятственному хождению этих специальных, внутренних пакетов.
  Интерфейс, который смотрит в интернет, один из тех, для которого вы пишите правила разрешают и управляют доступом в глобальную сеть, а так же запросами доступа из интернета. Это может быть вашим ppp tun0 интерфейсом или вашим NIC подсоединенным к DSL или кабельному модему.
  В случаях, когда один, или более одного NIC, подключены к частному LAN'у за файрволлом, эти интерфейсы должны содержать правила для беспрепятственного хождения пакетов из LAN.
  Сперва правила должны быть организованы в три разные секции, все беспрепятственные интерфейсы, публичные исходящие интерфейсы и публичные входящие интерфейсы.
  В порядке построения правил, в каждой секции с публичным интерфейсом порядок следования правил следующий: часто используемые идут сначала, затем используемые реже, заключающим правилом должно быть блокирование и протоколирование всего на этом интерфейсе во всех направлениях.
  Исходящая секция, в следующем наборе правил, содержит только правило "allow" , которое содержит значения выбора, которые точно идентифицируют сервис для публичного доступа в Интернет. Все правила имеют написанные опции proto, port, in/out, via и keep state. Правила "proto tcp" имеют опцию "setup" для идентификации запроса о начале сессии как сигнальный пакет который будет помещен в таблицу состояний keep-state.
  Секция входящих, содержит вначале правила, блокирующие нежелательные пакеты, по двум разным причинам. Первая - блокированные пакеты могут быть частью, наоборот, правильного пакета который может быть пропущен дальнейшими правилами. Вторая - при наличии правила которое явно блокирует выбранные пакеты которые я получаю не часто, и не хочу видеть их в логах, это не дает пакету быть пойманым последним правилом, которое блокирует и протоколирует все пакеты которые не прошли правила. Последнее правило в секции, которое блокирует и протоколирует все пакеты дает вам возможность создать легальные улики для преследования людей, которые атакуют вашу систему.
  Другая вещь, которую вы должны принять во внимание - никакого ответа нежелательным пакетам не возвращается, эти пакеты отбрасываются и исчезают. Таким образом, атакующие не имеют понятия, достиг ли пакет вашей системы. Чем меньше атакующий может узнать о вашей системе, тем более она защищена. Когда вы протоколируете пакеты с неизвестными вам номерами портов, посмотрите их номера в /etc/services или посетите http://www.securitystats.com/tools/portsearch.php и поищите номер порта, что бы понять для чего нужен данный номер порта. Посетите эту ссылку, что бы узнать какие номера портов используются троянцами: http://www.simovits.com/trojans/trojans.html.


28.6.5.6 Пример включаемого набора правил
  Следующее не NAT набор правил, является полным набором правил включаемого типа. Не будет неправильным, использование данных правил для собственных целей. Всего лишь закоментируйте пропускающие правила для сервисов, которые вам не нужны. Если вы видите сообщения в лог файле, которые вы видеть не хотите, всего лишь добавьте deny правило в секцию входящих пакетов. Вам придется изменить имя интерфейса dc0 в каждом правиле на имя сетевой карты в вашей системе, которая смотрит в интернет. Для пользователя ppp имя будет tun0.
  Вы увидите образец использования правил:
•  Все состояния которые запрашивают начало сессии с интернетом используют keep-state
•  Все разрешенные сервисы которые приходят из интернета имеют опцию limit для предотвращения флуда
•  Все правила используют in или out для определения направления
•  Все правила используют via имя интерфейса, для определения интерфейса через который будет проходить пакет.
  Следующие правила идут в “/etc/ipfw.rules”.
################ Начало файла правил IPFW ###############################
# Прежде, чем мы начнем, сбросим список
ipfw -q -f flush

# Установим префикс команды для набора правил
cmd="ipfw -q add"
pif="dc0"     # имя сетевой карты, которая смотрит в Интернет

#################################################################
# Нет запретов внутри интерфейса смотрящего в локальную сеть
# не нужно до той поры, пока у вас нет локальной сети
# Измените имя xl0 на имя сетевой карты смотрящей в локальную сеть
#################################################################
#$cmd 00005 allow all from any to any via xl0

#################################################################
# Нет ограничений на Loopback интерфейсе
#################################################################
$cmd 00010 allow all from any to any via lo0

#################################################################
# Позволяем пакету проходить, если предыдущий был добавлен
# в "динамическую" таблицу правил с разрешением состояния keep-state.
#################################################################
$cmd 00015 check-state

#################################################################
# Интерфейс смотрящий в интернет (Исходящая секция)
# Опрашиваем запросы начала сессии идущие из-за файрвола
# в локальную сеть или от гейта в Интернет
#################################################################

# Разрешаем исходящий доступ к DNS моего провайдера.
# x.x.x.x должны быть IP адреса DNS вашего провайдера.
# Повторите эти строки, если ваш провайдер имеет более одного DNS сервера.
# Возмите IP адреса из файла /etc/resolv.conf
$cmd 00110 allow tcp from any to x.x.x.x 53 out via $pif setup keep-state
$cmd 00111 allow udp from any to x.x.x.x 53 out via $pif keep-state

# Разрешаем исходящий доступ к DHCP серверу моего провайдера для
# кабельных/DSL конфигураций.
# Это правило не потребуется для пользователя с  ppp. соединением в Интернет.
# поэтому вы можете удалить целую группу.
# Используйте следующее правило и проверьте лог для выяснения IP адреса.
# Затем запишите IP адрес в закоментированное правило и удалите первое правило
$cmd 00120 allow log udp from any to any 67 out via $pif keep-state
#$cmd 00120 allow udp from any to x.x.x.x 67 out via $pif keep-state

# Разрешаем исходящие не безопасные стандартные www функции
$cmd 00200 allow tcp from any to any 80 out via $pif setup keep-state

# Разрешаем исходящие безопасные www функции https через TLS SSL
$cmd 00220 allow tcp from any to any 443 out via $pif setup keep-state


# Разрешаем исходящую функцию отправки и приема почты
$cmd 00230 allow tcp from any to any 25 out via $pif setup keep-state
$cmd 00231 allow tcp from any to any 110 out via $pif setup keep-state

# Разрешаем исходящие FBSD (make install & CVSUP) функции
# Проще говоря даем пользователю root "GOD" привилегии.
$cmd 00240 allow tcp from me to any out via $pif setup keep-state uid root

# Разрешаем исходящий пинг
$cmd 00250 allow icmp from any to any out via $pif keep-state

# Разрешаем исходящий Time
$cmd 00260 allow tcp from any to any 37 out via $pif setup keep-state

# Разрешаем исходящий nntp news (т.е. группы новостей)
$cmd 00270 allow tcp from any to any 119 out via $pif setup keep-state

# Разрешаем исходящую безопасные FTP, Telnet, and SCP
# Эта функция используется SSH (безопасным shell)
$cmd 00280 allow tcp from any to any 22 out via $pif setup keep-state

# Разрешаем исходящий whois
$cmd 00290 allow tcp from any to any 43 out via $pif setup keep-state

# Запрещаем и протоколируем все остальное пытающееся пройти.
# Это правило предписывает блокировать и протоколировать все по умолчанию.
$cmd 00299 deny log all from any to any out via $pif

#################################################################
# Интерфейс смотрящий в Internet (Входящая секция)
# Опрашиваем запросы начала сессии идущие из Интернета
# в локальную сеть или к гейту
#################################################################

# Запрещаем весь входящий траффик из зарезервированных адресных пространств
$cmd 00300 deny all from 192.168.0.0/16 to any in via $pif #RFC 1918 private IP
$cmd 00301 deny all from 172.16.0.0/12 to any in via $pif  #RFC 1918 private IP
$cmd 00302 deny all from 10.0.0.0/8 to any in via $pif     #RFC 1918 private IP
$cmd 00303 deny all from 127.0.0.0/8 to any in via $pif    #loopback
$cmd 00304 deny all from 0.0.0.0/8 to any in via $pif      #loopback
$cmd 00305 deny all from 169.254.0.0/16 to any in via $pif #DHCP auto-config
$cmd 00306 deny all from 192.0.2.0/24 to any in via $pif   #reserved for docs
$cmd 00307 deny all from 204.152.64.0/23 to any in via $pif #Sun cluster interconnect
$cmd 00308 deny all from 224.0.0.0/3 to any in via $pif    #Class D & E multicast

# Запрещаем публичные пинги
$cmd 00310 deny icmp from any to any in via $pif

# Запрещаем ident
$cmd 00315 deny tcp from any to any 113 in via $pif

# Запрещаем весь сервис Netbios. 137=имя, 138=дейтаграмма, 139=сессия
# Netbios это сервис общего доступа MS/Windows .
# Блокируем MS/Windows hosts2 name server requests 81
$cmd 00320 deny tcp from any to any 137 in via $pif
$cmd 00321 deny tcp from any to any 138 in via $pif
$cmd 00322 deny tcp from any to any 139 in via $pif
$cmd 00323 deny tcp from any to any 81 in via $pif

# Запрещаем пакеты прибывшие позже
$cmd 00330 deny all from any to any frag in via $pif

# Запрещаем ACK пакеты которые не совпадают с динамической таблицей правил
$cmd 00332 deny tcp from any to any established in via $pif

# Разрешаем входящий траффик от DHCP сервера провайдера.
# Это правило должно содержать
# IP адрес DHCP сервера вашего провайдера, так как только
# он является авторизованым источником
# для отправки пакетов такого типа.
# Необходимо только для кабельных или DSL конфигураций.
# Это правило не нужно для пользователя с соединяющегося с интернетом по ppp.
# Это тот же IP адрес который мы получили и использовали в исходящей секции
#$cmd 00360 allow udp from any to x.x.x.x 67 in via $pif keep-state

# Разрешаем входящую www функцию потому что у меня стоит сервер apache
$cmd 00400 allow tcp from any to me 80 in via $pif setup limit src-addr 2

# Разрешаем входящие безопасные FTP, Telnet, and SCP из интернета
$cmd 00410 allow tcp from any to me 22 in via $pif setup limit src-addr 2

# Разрешаем входящие небезопасные Telnet сессии из интернета
# указано как небезопасные потому что ID & PW передаются через интернет
# открытым текстом
# Удаляем эту группу правил, если у вас нет работающего telnet сервера.
$cmd 00420 allow tcp from any to me 23 in via $pif setup limit src-addr 2

# Отбрасываем и протоколируем все входящие пакеты из внешнего мира
$cmd 00499 deny log all from any to any in via $pif

# Остальное отбрасывается по умолчанию
# отбрасываем и протоколируем все непрошедшие пакеты,
# что бы можно было увидеть какие они
$cmd 00999 deny log all from any to any
################ Конец файла правил IPFW ###############################

28.6.5.7 Пример NAT и набора правил состояний
  Здесь приводятся дополнительные состояния конфигурации, для включения функции NAT в IPFW. В исходный код ядра должна быть добавлена опция 'option divert', к другим опциям IPFIREWALL, скомпилированым в произвольное ядро.
  В дополнение к обычным опциям IPFW в файле “/etc/rc.conf”, должны быть добавлены следующие.
natd_enable="YES"                 # Включаем NATD функцию
natd_interface="rl0"                # имя интерфейса который смотрит в интернет
natd_flags="-dynamic -m"      # -m = preserve port numbers if possible
  Использование правил состояния с правилами divert nat (Network Address Translation) сильно усложняет логику написания набора правил. Расположение правил 'check-state' и 'divert natd' в наборе правил становится критичным. Это уже не простая логика прохождения через поток. Используется новый тип действий называемый 'skipto'. Для использования команды 'skipto' обязательна нумерация каждого правила, исходя из этого,  вы всегда знаете где номер правила "skipto" к которому вы переходите.
  Cледующий, непрокоментированный пример, одного метода написания правил, выбранного для объяснения прохождения пакета через набор правил.
  Процесс прохождения начинается с первого правила, в верхней строчки файла правил и увеличивается на одно правило за раз, ниже пока не достигнет конца, или пакет не будет проверен по критерию отбора на совпадение и пакет будет отпущен файрволлом. Важно заметить местоположение правил 100, 101, 450, 500, and 510. Эти правила управляют трансляцией исходящих и входящих пакетов и поэтому их keep-state записи в динамической таблице всегда регистрируют адрес частной локальной сети. Далее, обратите внимание на то, что все разрешающие и запрещающие правила определены в направлении движения пакета. Так же учтите, что исходящие запросы на начало сессии в правиле 500 для трансляции адресов.
  Предположим, что пользователь локальной сети использует браузер для просмотра страниц. Web страницы используют 80 порт для соединений. Итак, пакет входит в файрволл, он не совпадает с правилом с номером 100, потому, что он выходит, а не входит. Он минует правило 101, потому что это первый пакет и у него нет keep-state записи в динамической таблице. Пакет наконец, добирается до правила 125, и совпадает с ним. Это исходящий пакет, идущий через интерфейс, смотрящий в интернет. Пакет все еще имеет адрес источника, который является адресом в частной локальной сети. При совпадении с правилом, производяться два действия. Опция keep-state запишет это правило в динамическую таблицу keep-state правил и выполнит указанное действие. Действие - это часть информации записаной в динамическую таблицу. В этом случае оно "skipto rule 500". Правило 500 транслирует сетевой IP адрес пакета и выпустит его. Запомните это, это очень важно. Этот пакет проделывает путь до пункта назначения и возвращается обратно, и попадает в начало набора правил. В этот раз, он совпадает с правилом 100 и IP адрес его пункта назначения транслируется обратно в его адрес в локальной сети. Затем он обрабатывается правилом check-state, он находится в таблице существующих сессий и выпускается в локальную сеть. Он идет к компьютеру в локальной сети, который посылал этот пакет и отправляет новый пакет запрашивая другой сегмент данных от удаленного сервера. В этот раз он проверяется правилом check-state, исходящая запись найдена, связанное действие выполняет "skipto 500". Пакет переходит к правилу 500, транслируется и выпускается наружу. С входящей стороны все что приходит, является частью существующей сессии и автоматически обрабатывается правилом check-state и должным образом помещается в правила divert natd. Все что мы должны сделать, это обратиться по адресу отбрасывающему пакеты и поддерживающему только авторизованные сервисы. Предположим, у нас есть сервер Apache работающий за файрволлом и мы хотим, что бы люди в интернете, могли получить доступ к веб сайту. Новый входящий пакет запроса совпадает с правилом 100, и его IP адрес в локальной сети транслируется для файрволла. Пакет проверяется на все гадкие штучки, на которые мы хотим его проверить и, наконец, совпадает с правилом 425. При совпадении, происходят две следующие вещи. Правило пакета записывается в динамическую таблицу keep-state, но на этот раз, все запросы о создании новой сессии, приходящие от исходного IP адреса, ограничены 2. Это защищает от DDoS атак на сервис работающий по определенному порту. Действие допускается, поэтому пакет отправляется в локальную сеть. По возвращению check-state правило расценивает пакет как принадлежащий существующей сессии и отправляет его на правило 500, для трансляции и последующего выпуска на выходной интерфейс.
  Пример набора правил 1:
#!/bin/sh
cmd="ipfw -q add"
skip="skipto 500"
pif=rl0
ks="keep-state"
good_tcpo="22,25,37,43,53,80,443,110,119"

ipfw -q -f flush

$cmd 002 allow all from any to any via xl0  # exclude LAN traffic
$cmd 003 allow all from any to any via lo0  # exclude loopback traffic

$cmd 100 divert natd ip from any to any in via $pif
$cmd 101 check-state

# Разрешенные выходящие пакеты
$cmd 120 $skip udp from any to xx.168.240.2 53 out via $pif $ks
$cmd 121 $skip udp from any to xx.168.240.5 53 out via $pif $ks
$cmd 125 $skip tcp from any to any $good_tcpo out via $pif setup $ks
$cmd 130 $skip icmp from any to any out via $pif $ks
$cmd 135 $skip udp from any to any 123 out via $pif $ks

# Запрещаем весь входящий траффик из зарезервированных адресных пространств
$cmd 300 deny all from 192.168.0.0/16  to any in via $pif  #RFC 1918 private IP
$cmd 301 deny all from 172.16.0.0/12   to any in via $pif  #RFC 1918 private IP
$cmd 302 deny all from 10.0.0.0/8      to any in via $pif  #RFC 1918 private IP
$cmd 303 deny all from 127.0.0.0/8     to any in via $pif  #loopback
$cmd 304 deny all from 0.0.0.0/8       to any in via $pif  #loopback
$cmd 305 deny all from 169.254.0.0/16  to any in via $pif  #DHCP auto-config
$cmd 306 deny all from 192.0.2.0/24    to any in via $pif  #reserved for docs
$cmd 307 deny all from 204.152.64.0/23 to any in via $pif  #Sun cluster
$cmd 308 deny all from 224.0.0.0/3     to any in via $pif  #Class D & E multicast

# Разрешенные входящие пакеты
$cmd 400 allow udp from xx.70.207.54 to any 68 in $ks
$cmd 420 allow tcp from any to me 80 in via $pif setup limit src-addr 1

$cmd 450 deny log ip from any to any

# Местоположение skipto для исходящих правил состояния
$cmd 500 divert natd ip from any to any out via $pif
$cmd 510 allow ip from any to any

######################## конец правил  ##################
  Написанное ниже, в значительной степени похоже, на написанное выше, но используется прокоментированный стиль написания правил, дабы помочь неопытным писателям правил IPFW, что правила делают.
  Пример набора правил 2:
#!/bin/sh
################ Начало файла правил  IPFW  ###############################
# Прежде, чем мы начнем, сбросим список
ipfw -q -f flush

# Установим префикс команды для набора правил
cmd="ipfw -q add"
skip="skipto 800"
pif="rl0"     # имя сетевой карты, которая смотрит в Интернет

#################################################################
# Нет запретов внутри интерфейса смотрящего в локальную сеть
# не нужно до той поры, пока у вас нет локальной сети
# Измените имя xl0 на имя сетевой карты смотрящей в локальную сеть
#################################################################
$cmd 005 allow all from any to any via xl0

#################################################################
# Нет ограничений на Loopback интерфейсе
#################################################################
$cmd 010 allow all from any to any via lo0

#################################################################
# проверяем если пакет входящий и транслирван ли он
#################################################################
$cmd 014 divert natd ip from any to any in via $pif

#################################################################
#Позволяем пакету проходить, если предыдущий был добавлен
# в "динамическую" таблицу правил с разрешением состояния keep-state.
#################################################################
$cmd 015 check-state

#################################################################
#Интерфейс смотрящий в интернет (Исходящая секция)
# Опрашиваем запросы начала сессии идущие из-за файрвола
# в локальную сеть или от гейта в Интернет
#################################################################

# Разрешаем исходящий доступ к DNS моего провайдера.
# x.x.x.x должны быть IP адреса DNS вашего провайдера.
# Повторите эти строки, если ваш провайдер имеет более одного DNS сервера.
# Возмите IP адреса из файла /etc/resolv.conf
$cmd 020 $skip tcp from any to x.x.x.x 53 out via $pif setup keep-state


# Разрешаем исходящий доступ к DHCP серверу моего провайдера для
# кабельных/DSL конфигураций.
$cmd 030 $skip udp from any to x.x.x.x 67 out via $pif keep-state

# Разрешаем исходящие не безопасные стандартные www функции
$cmd 040 $skip tcp from any to any 80 out via $pif setup keep-state

# Разрешаем исходящие безопасные www функции https через TLS SSL
$cmd 050 $skip tcp from any to any 443 out via $pif setup keep-state

# Разрешаем исходящую функцию отправки и приема почты
$cmd 060 $skip tcp from any to any 25 out via $pif setup keep-state
$cmd 061 $skip tcp from any to any 110 out via $pif setup keep-state

# Разрешаем исходящие FBSD (make install & CVSUP) функции
# Проще говоря даем пользователю root "GOD" привилегии.
$cmd 070 $skip tcp from me to any out via $pif setup keep-state uid root

# Разрешаем исходящий пинг
$cmd 080 $skip icmp from any to any out via $pif keep-state

# Разрешаем исходящий Time
$cmd 090 $skip tcp from any to any 37 out via $pif setup keep-state

# Разрешаем исходящий nntp news (т.е. группы новостей)
$cmd 100 $skip tcp from any to any 119 out via $pif setup keep-state

# Разрешаем исходящую безопасные FTP, Telnet, and SCP
# Эта функция используется SSH (безопасным shell)
$cmd 110 $skip tcp from any to any 22 out via $pif setup keep-state

# Разрешаем исходящий whois
$cmd 120 $skip tcp from any to any 43 out via $pif setup keep-state

# Разрешаем прохождение пакетов от ntp time server
$cmd 130 $skip udp from any to any 123 out via $pif keep-state

#################################################################
# Интерфейс смотрящий в Internet (Входящая секция)
# Опрашиваем запросы начала сессии идущие из Интернета
# в локальную сеть или к гейту
#################################################################

# Запрещаем весь входящий траффик из зарезервированных адресных пространств
$cmd 300 deny all from 192.168.0.0/16  to any in via $pif  #RFC 1918 private IP
$cmd 301 deny all from 172.16.0.0/12   to any in via $pif  #RFC 1918 private IP
$cmd 302 deny all from 10.0.0.0/8      to any in via $pif  #RFC 1918 private IP
$cmd 303 deny all from 127.0.0.0/8     to any in via $pif  #loopback
$cmd 304 deny all from 0.0.0.0/8       to any in via $pif  #loopback
$cmd 305 deny all from 169.254.0.0/16  to any in via $pif  #DHCP auto-config
$cmd 306 deny all from 192.0.2.0/24    to any in via $pif  #reserved for docs
$cmd 307 deny all from 204.152.64.0/23 to any in via $pif  #Sun cluster
$cmd 308 deny all from 224.0.0.0/3     to any in via $pif  #Class D & E multicast

# Запрещаем ident
$cmd 315 deny tcp from any to any 113 in via $pif

# Запрещаем весь сервис Netbios. 137=имя, 138=дейтаграмма, 139=сессия
# Netbios это сервис общего доступа MS/Windows .
# Блокируем MS/Windows hosts2 name server requests 81
$cmd 320 deny tcp from any to any 137 in via $pif
$cmd 321 deny tcp from any to any 138 in via $pif
$cmd 322 deny tcp from any to any 139 in via $pif
$cmd 323 deny tcp from any to any 81  in via $pif

# Запрещаем пакеты прибывшие позже
$cmd 330 deny all from any to any frag in via $pif

# Запрещаем ACK пакеты которые не совпадают с динамической таблицей правил
$cmd 332 deny tcp from any to any established in via $pif

# Разрешаем входящий траффик от DHCP сервера провайдера.
# Это правило должно содержать
# IP адрес DHCP сервера вашего провайдера, так как только
# он является авторизованым источником
# для отправки пакетов такого типа.
# Необходимо только для кабельных или DSL конфигураций.
# Это правило не нужно для пользователя с соединяющегося с интернетом по ppp.
# Это тот же IP адрес который мы получили и использовали в исходящей секции
$cmd 360 allow udp from x.x.x.x to any 68 in via $pif keep-state

# Разрешаем входящую www функцию потому что у меня стоит сервер apache
$cmd 370 allow tcp from any to me 80 in via $pif setup limit src-addr 2

# Разрешаем входящие безопасные FTP, Telnet, and SCP из интернета
$cmd 380 allow tcp from any to me 22 in via $pif setup limit src-addr 2

# Разрешаем входящие небезопасные Telnet сессии из интернета
# указано как небезопасные потому что ID & PW передаются через интернет
# открытым текстом
# Удаляем эту группу правил, если у вас нет работающего telnet сервера.
$cmd 390 allow tcp from any to me 23 in via $pif setup limit src-addr 2

# Отбрасываем и протоколируем все входящие пакеты из внешнего мира
$cmd 400 deny log all from any to any in via $pif

# # Отбрасываем и протоколируем все исходящие пакеты во внешний мир
$cmd 450 deny log all from any to any out via $pif

# Местоположение skipto для исходящих правил состояния
$cmd 800 divert natd ip from any to any out via $pif
$cmd 801 allow ip from any to any

# Остальное отбрасывается по умолчанию
# отбрасываем и протоколируем все непрошедшие пакеты,
# что бы можно было увидеть какие они
$cmd 999 deny log all from any to any
################ Конец файла правил IPFW  ###############################
yakuzzza, 2007-12-16 в 19:50:59
В блокирование нетбиоса я бы обязательно добавил 445/tcp, его необходимо фильтровать на внешних интерфейсах например.
Александр, 2008-01-25 в 4:43:34
Правила 20 там где запросы от сетки к днс серверу провайдера надо дописать навсякий случай еще правилами
add allow udp from ${inet} to x.x.x.x 53 keep-state.

Почему то у меня обмениваются udp пакетами. Да и вообще везде записано что DNS работает на udp.
Dmitry Stremkouski, 2008-02-18 в 21:05:33
Несколько пугает применение двух дивертов. Может я не прав, но это несколько не похоже на философию ipfw.
Очень пугает правило:
801 allow ip from any to any

Правильно учить пользователей на основе SIMPLE.
Dark Smoke, 2008-03-27 в 0:29:54
Попробовал последний пример:
и у меня все пакеты ходят только через 2 правила:
00005 774 104843 allow ip from any to any via vr0
и
00801 808 107523 allow ip from any to any
все остальные правила не активны, не одного пакета не прошло.



IPFW - штатный файрволл FreeBSD

Автор: lissyara. В составе FreeBSD есть штатный файрволл - IPFW. К сожалению, раздел хандбука, ему посвящённый, до сих пор не переведён... зато в английской части эта тема неплохо окучена :) Кстати, во многом именно по этому начинающим он тяжело даётся - сам помню, как ковырялся почти две недели, пытаясь настроить его - ничё не получалось... Зато потом был миг озарения, когда я пришёл утром на работу, и, неторопясь, набрал все правила, придумывая их находу из головы. После чего отправил комп в перезагрузку и пошёл курить - абсолютно уверенный что всё работает. И оно работало. Это был момент перехода количества в качество... Эта статья является скорее кратким переводом той аглицкой статьи из хандбука, щедро разбавленное собственным видением происходящего :) Итак. Для включения файрволла придётся пересобрать ядро со следующими опциями: options IPFIREWALL # собственно файрволл options IPFIREWALL_VERBOSE # логгинг пакетов, если в правиле # написано `log` options IPFIREWALL_VERBOSE_LIMIT=5 # ограничение логов (повторяющихся) - на # случай атак типа флудинга # (я, правда, 100 ставлю) options IPFIREWALL_FORWARD # перенаправление (форвардинг) пакетов # например, для прозрачного прокси options IPDIVERT # если нужен NAT (трансляция адресов) options DUMMYNET # если понадобится ограничивать скорость # инета пользователям (обычно - да :)) options IPFIREWALL_DEFAULT_TO_ACCEPT # дефолтовое правило (последнее) # будет разрешающим (во всех других) # случаях - запрещающее Кстати, ядро можно и не пересобирать - достаточно загрузить модуль при старте системы, для этого внесём строку firewall_enable="YES" в файл /etc/rc.conf и после перезагрузки файрволл заработает. Никто, кстати, не мешает сделать это и находу, без перезагрузки (советую подумать, если вы сидите на машине, по ssh прежде чем выполнять - по дефолту будет одно правило - запрещено всё), загрузив соответствующий модуль: %su /usr/home/lissyara/>kldload ipfw /usr/home/lissyara/>ipfw show 65535 0 0 deny ip from any to any /usr/home/lissyara/> Управляется загруженный на ходу файрволл также как и обычный, некоторые специфические опции включаемые в ядро при статической сборке есть в sysctl: /usr/home/lissyara/>sysctl -a | grep ip.fw net.inet.ip.fw.enable: 1 net.inet.ip.fw.one_pass: 1 net.inet.ip.fw.debug: 1 net.inet.ip.fw.verbose: 1 net.inet.ip.fw.verbose_limit: 1000 net.inet.ip.fw.dyn_buckets: 256 net.inet.ip.fw.curr_dyn_buckets: 256 net.inet.ip.fw.dyn_count: 0 net.inet.ip.fw.dyn_max: 1000 net.inet.ip.fw.static_count: 294 net.inet.ip.fw.dyn_ack_lifetime: 300 net.inet.ip.fw.dyn_syn_lifetime: 20 net.inet.ip.fw.dyn_fin_lifetime: 1 net.inet.ip.fw.dyn_rst_lifetime: 1 net.inet.ip.fw.dyn_udp_lifetime: 10 net.inet.ip.fw.dyn_short_lifetime: 5 net.inet.ip.fw.dyn_grace_time: 10 /usr/home/lissyara/> Это был вывод с тестовой машины. Кстати ipfw, статически собранный в ядре, также прекрасно рулится через sysctl: /usr/home/lissyara/>sysctl net.inet.ip.fw.verbose_limit=10 net.inet.ip.fw.verbose_limit: 1000 -> 10 /usr/home/lissyara/>sysctl -a | grep ip.fw.verbose_ net.inet.ip.fw.verbose_limit: 10 /usr/home/lissyara/> Учтите - эти изменения живут ровно до первой перезагрузки, если хотите чтобы они остались насовсем, то читайте тут. Вообще, глубокий смысл вкомпиляции файрволла в ядро - на мой взгляд, повышение быстродействия, и опции недоступные через sysctl. Если собирали ядро без опции IPFIREWALL_DEFAULT_TO_ACCEPT, или грузили его модулем, то изначально правило только одно - запрещающее. В rc.conf есть несколько опций касающихся файрволла: firewall_enable="YES" - если файрволл грузится модулем firewall_type="/etc/rc.firewall" - файл с правилами файрволла firewall_logging="YES" - единственное что делает эта строка - устанавливает значение net.inet.ip.fw.verbose равным 1. Не забудте поставить лимиты, через sysctl. Для просмотра установленных правил файрволла есть следующие команды (а если быть точным - ключи, потому как для всего используется одно приложение): ipfw list - показывает список правил ipfw show - тоже показывает список правил, но вместе с числом пакетов и байт, что попали под эти правила. Очень удобно при отдладке - смотрим на чём зарубаются пакеты. ipfw zero - обнуление всех счётчиков. Если вести в виде ipfw zero №_правила то будет обнулён только счётчик правила с этим номером. Вот пример простого файрволла для обычнейшей ситуации - сервер организации, одним интерфейсом смотрит в локалку, другим торчит наружу, на нём крутится почта, и работает www сервер: #!/bin/sh # для начала вводим переменные - для нашего же удобства, чтобы не # вводить по сотне раз одно и то же, а потом искать почему не работает, # и в итоге выяснять, что ошибся IP адресом в одном из правил FwCMD="/sbin/ipfw" # собственно где лежит бинарник ipfw LanOut="xl0" # внешний интерфейс LanIn="sis0" # внутренний интерфейс IpOut="222.222.222.222" # внешний IP адрес машины IpIn="192.168.20.254" # внутренний IP машины NetMask="24" # маска сети (если она разная для внешней # и внутренней сети - придётся вводить ещё # одну переменную, но самое забавное, что # можно и забить - оставить 24 - всё будет # работать, по крайней мере я пробовал - # работаало на 4-х машинах, в разных сетях, # с разными масками - настоящими разными! но - # это неправильно.) NetIn="192.168.20.0" # Внутренняя сеть # Сбрасываем все правила: ${FwCMD} -f flush # Проверяем - соответствует ли пакет динамическим правилам: ${FwCMD} add check-state # Разрешаем весь траффик по внутреннему интерфейсу (петле) # Вообще я во многих местах читал что без него может ничё не заработать вообще # и прочие страшилки. Работает - почта, апач, .... А вот squid - не работает :) # так что без него и правда - никуда. ${FwCMD} add allow ip from any to any via lo0 # рубим попытки lo0 куда-то лезть и откуда-то лезть на lo0 (вот честно - ни # одного пакета по этим правилам не зарубилось за всё время... Может в этом # моё счастье? :)) ${FwCMD} add deny ip from any to 127.0.0.0/8 ${FwCMD} add deny ip from 127.0.0.0/8 to any # Вводим запреты: # режем частные сети на внешнем интерфейсе - по легенде он у нас # смотрит в интернет, а значит пакетам этим браться неоткуда на нём. # рубим частные сeти ${FwCMD} add deny ip from any to 10.0.0.0/8 in via ${LanOut} ${FwCMD} add deny ip from any to 172.16.0.0/12 in via ${LanOut} ${FwCMD} add deny ip from any to 192.168.0.0/16 in via ${LanOut} ${FwCMD} add deny ip from any to 0.0.0.0/8 in via ${LanOut} # рубим автоконфигуреную частную сеть ${FwCMD} add deny ip from any to 169.254.0.0/16 in via ${LanOut} # рубаем мультикастовые рассылки ${FwCMD} add deny ip from any to 240.0.0.0/4 in via ${LanOut} # рубим фрагментированные icmp ${FwCMD} add deny icmp from any to any frag # рубим широковещательные icmp на внешнем интерфейсе ${FwCMD} add deny log icmp from any to 255.255.255.255 in via ${LanOut} ${FwCMD} add deny log icmp from any to 255.255.255.255 out via ${LanOut} # а тут собственно файрволл и начался: # отправляем всех на frox ${FwCMD} add fwd ${IpIn},2121 tcp from ${NetIn}/${NetMask} to any 21 via ${LanOut} # отправляем всех на squid (в данном случае - прокси прозрачный) ${FwCMD} add fwd 127.0.0.1,3128 tcp from ${NetIn}/${NetMask} to any 80 via ${LanOut} # пропускаем траффик через трансляцию сетевых адресов (NAT) ${FwCMD} add divert natd ip from ${NetIn}/${NetMask} to any out via ${LanOut} ${FwCMD} add divert natd ip from any to ${IpOut} in via ${LanOut} # рубим траффик к частным сетям через внешний интерфейс # заметтьте - эти правила отличаются от тех что были выше! ${FwCMD} add deny ip from 10.0.0.0/8 to any out via ${LanOut} ${FwCMD} add deny ip from 172.16.0.0/12 to any out via ${LanOut} ${FwCMD} add deny ip from 192.168.0.0/16 to any out via ${LanOut} ${FwCMD} add deny ip from 0.0.0.0/8 to any out via ${LanOut} # рубим автоконфигуреную частную сеть ${FwCMD} add deny ip from 169.254.0.0/16 to any out via ${LanOut} # рубаем мультикастовые рассылки ${FwCMD} add deny ip from 224.0.0.0/4 to any out via ${LanOut} # рубаем мультикастовые рассылки ${FwCMD} add deny ip from 240.0.0.0/4 to any out via ${LanOut} # разрешаем все установленные соединения (если они установились - # значит по каким-то правилам они проходили.) ${FwCMD} add allow tcp from any to any established # разрешаем весь исходящий траффик (серверу-то в инет можно? :)) ${FwCMD} add allow ip from ${IpOut} to any out xmit ${LanOut} # разрешаем DNS снаружи (нам же надо узнавать IP по именам машин?) ${FwCMD} add allow udp from any 53 to any via ${LanOut} # разрешаем DNS входящий снаружи - если на этой машине работает named # и держит какую-то зону. В остальных случаях - не нужно ${FwCMD} add allow udp from any to any 53 via ${LanOut} # разрешаем UDP (для синхронизации времени - 123 порт) ${FwCMD} add allow udp from any to any 123 via ${LanOut} # разрешаем ftp снаружи (оба правила - для пасивного режима) # для узнавания портранджа по которому будет работать, лезем в #/usr/home/lissyara/>sysctl net.inet.ip.portrange.first # net.inet.ip.portrange.first: 49152 # /usr/home/lissyara/>sysctl net.inet.ip.portrange.last # net.inet.ip.portrange.last: 65535 ${FwCMD} add allow tcp from any to ${IpOut} 21 via ${LanOut} #Можно изгалиться примерно так, если есть желание, но я предпочитаю руками #${FwCMD} add allow tcp from any to ${IpOut} \ #`sysctl net.inet.ip.portrange.first | awk '{print $2}'`-\ #`sysctl net.inet.ip.portrange.last | awk '{print $2}'` via ${LanOut} ${FwCMD} add allow tcp from any to ${IpOut} 49152-65535 via ${LanOut} # разрешаем некоторые типы ICMP траффика - эхо-запрос, # эхо-ответ и время жизни пакета истекло ${FwCMD} add allow icmp from any to any icmptypes 0,8,11 # открываем снаружи 80 порт - если у нас есть WWW сервер на машине ${FwCMD} add allow tcp from any to ${IpOut} 80 via ${LanOut} # открываем снаружи 25 порт (SMTP) если на машине крутится почта #${FwCMD} add allow tcp from any to ${IpOut} 25 via ${LanOut} # открываем снаружи 22 порт - если надо будет ходить на машину по ssh ${FwCMD} add allow tcp from any to ${IpOut} 22 via ${LanOut} # открываем снаружи 143 порт(если надо смотреть почту снаружи по IMAP) ${FwCMD} add allow tcp from any to ${IpOut} 143 via ${LanOut} # открываем снаружи 110 порт(если надо смотреть почту снаружи по POP) ${FwCMD} add allow tcp from any to ${IpOut} 110 via ${LanOut} # по поводу следующих трёх правил, для tcp, udp и icmp - их можно # заменить одним правилом: #${FwCMD} add allow ip from any to any via ${LanIn} # но для удобства наладки и контроля происходящего я предпочитаю три отдельных # правила, хотя могут быть грабли - например протокол gre не пройдёт - # придётся стругать отдельное правило для него, типа #${FwCMD} add allow gre from any to any via ${LanIn} # итак: # разрешаем весь tcp траффик внутри локалки (на внутреннем интерфейсе) ${FwCMD} add allow tcp from any to any via ${LanIn} # разрешаем весь udp траффик внутри локалки (на внутреннем интерфейсе) ${FwCMD} add allow udp from any to any via ${LanIn} # разрешаем весь icmp траффик внутри локалки (на внутреннем интерфейсе) ${FwCMD} add allow icmp from any to any via ${LanIn} # запрещаем всё и всем. Если тип файрволла не open то это правило добавится # автоматически, но всё-же ну его. Лучше сам. Надёжней. ${FwCMD} add deny ip from any to any Такой вот несложный, и логически понятный файрволл. Надо заметить, что для внутренней локалки в этом фаере всё разрешено. Все могут ходить в инет и пользоваться всеми сетевыми службами. Если такой необходимости нет, то можно сделать чуть иначе: #!/bin/sh # для начала вводим переменные - для нашего же удобства, чтобы не # вводить по сотне раз одно и то же, а потом искать почему не работает, # и в итоге выяснять, что ошибся IP адресом в одном из правил FwCMD="/sbin/ipfw" # бинарник IPFW LanOut="xl0" # Внешняя сетевуха NetOut="222.222.222.220/28" # внешняя сеть IpOut="222.222.222.222" # Внешний IP LanIn="rl0" # внутренняя сетевуха NetIn="192.168.1.0/24" # Внутренняя сеть ip_lan="192.168.1" # Шаблон внутреннего адреса # нужен для ввода разрешений на инет # сбрасываем все правила ${FwCMD} -f flush # сбрасываем все pipe ${FwCMD} -f pipe flush # сбрасываем очереди ${FwCMD} -f queue flush # Не знаю, пригодится ли кому это - по ночам охрана повадилась шариться в инете # и качать музончик, порнушку смотреть... 3 гига трафика за ночь... Поэтому ночью # траффик ограничиваем (скорость) - причём жестоко режем :) # для этого в конфиге ядра должна быть строка # options DUMMYNET # соответственно в crontab надо добавить запись типа sh /etc/rc.firewall # с запуском в 22.01 и 8.01 :))) # Также не забудте поставить в sysctl переменную net.inet.ip.fw.one_pass в 0, # иначе все пакеты будут выпадать из файрволла после трубы - а это дыра. chour=`date '+%H'` if [ ${chour} -lt 8 ]; then ${FwCMD} add pipe 1 ip from not ${NetIn} to ${NetIn} ${FwCMD} pipe 1 config bw 33600 bit/s fi if [ ${chour} -ge 22 ]; then ${FwCMD} add pipe 1 ip from not ${NetIn} to ${NetIn} ${FwCMD} pipe 1 config bw 33600 bit/s fi # Разрешаем весь траффик по внутреннему интерфейсу (петле) # Вообще я во многих местах читал что без него может ничё не заработать вообще # и прочие страшилки. Работает - почта, апач, .... А вот squid - не работает :) # так что без него и правда - никуда. ${FwCMD} add allow ip from any to any via lo0 # Вводим запреты: # рубим попытки lo0 куда-то лезть и откуда-то лезть на lo0 (вот честно - ни # одного пакета по этим правилам не зарубилось за всё время... Может в этом # моё счастье? :)) ${FwCMD} add deny ip from any to 127.0.0.0/8 ${FwCMD} add deny ip from 127.0.0.0/8 to any # рубим пакеты `типа от внутренней сети, но на внешнем интерфейсе` ${FwCMD} add deny ip from ${NetIn} to any in via ${LanOut} # рубим пакеты `типа от внешней сети, но на внутреннем интерфейсе` ${FwCMD} add deny ip from ${NetOut} to any in via ${LanIn} # режем частные сети на внешнем интерфейсе - по легенде он у нас # смотрит в интернет, а значит пакетам этим браться неоткуда на нём. # рубим частные сeти ${FwCMD} add deny ip from any to 10.0.0.0/8 in via ${LanOut} ${FwCMD} add deny ip from any to 172.16.0.0/12 in via ${LanOut} ${FwCMD} add deny ip from any to 192.168.0.0/16 in via ${LanOut} ${FwCMD} add deny ip from any to 0.0.0.0/8 in via ${LanOut} # рубим автоконфигуреную частную сеть ${FwCMD} add deny ip from any to 169.254.0.0/16 in via ${LanOut} # рубаем мультикастовые рассылки ${FwCMD} add deny ip from any to 224.0.0.0/4 in via ${LanOut} # рубаем мультикастовые рассылки ${FwCMD} add deny ip from any to 240.0.0.0/4 in via ${LanOut} # рубим фрагментированные icmp ${FwCMD} add deny icmp from any to any frag # рубим широковещательные icmp на внешнем интерфейсе ${FwCMD} add deny log icmp from any to 255.255.255.255 in via ${LanOut} ${FwCMD} add deny log icmp from any to 255.255.255.255 out via ${LanOut} # Отправляем всех на squid ${FwCMD} add fwd 127.0.0.1,3128 tcp from ${NetIn} to any 80 via ${LanOut} # Делаем NAT (трансляцию сетевых адресов) всему, что не ушло на squid ${FwCMD} add divert natd ip from ${NetIn} to any out via ${LanOut} ${FwCMD} add divert natd ip from any to ${IpOut} in via ${LanOut} # рубим траффик к частным сетям через внешний интерфейс # заметтьте - эти правила отличаются от тех что были выше! ${FwCMD} add deny ip from 10.0.0.0/8 to any out via ${LanOut} ${FwCMD} add deny ip from 172.16.0.0/12 to any out via ${LanOut} ${FwCMD} add deny ip from 192.168.0.0/16 to any out via ${LanOut} ${FwCMD} add deny ip from 0.0.0.0/8 to any out via ${LanOut} # рубим автоконфигуреную частную сеть ${FwCMD} add deny ip from 169.254.0.0/16 to any out via ${LanOut} # рубаем мультикастовые рассылки ${FwCMD} add deny ip from 224.0.0.0/4 to any out via ${LanOut} # рубаем мультикастовые рассылки ${FwCMD} add deny ip from 240.0.0.0/4 to any out via ${LanOut} # разрешаем некоторые типы ICMP траффика - эхо-запрос, # эхо-ответ и время жизни пакета истекло ${FwCMD} add allow icmp from any to any icmptypes 0,8,11 # Разрешаем траффик внутренней сети на внутреннем интерфейсе (входящий) ${FwCMD} add allow ip from any to ${NetIn} in via ${LanIn} # Разрешаем траффик внутренней сети на внутреннем интерфейсе (исходящий) ${FwCMD} add allow ip from ${NetIn} to any out via ${LanIn} # разрешаем tcp-пакеты по уже установленным соединениям ${FwCMD} add allow tcp from any to any established # DNS - 4 правила. (если на машине есть DNS сервер - иначе надо всего два) ${FwCMD} add allow udp from any to ${IpOut} 53 in via ${LanOut} ${FwCMD} add allow udp from ${IpOut} 53 to any out via ${LanOut} ${FwCMD} add allow udp from any 53 to ${IpOut} in via ${LanOut} ${FwCMD} add allow udp from ${IpOut} to any 53 out via ${LanOut} # разрешаем UDP (для синхронизации времени - 123 порт) ${FwCMD} add allow udp from any to any 123 via ${LanOut} # разрешаем снаружи соединяться с 53 портом (TCP DNS) ${FwCMD} add allow tcp from any to ${IpOut} 53 in via ${LanOut} setup # открываем снаружи 80 порт - если у нас есть WWW сервер на машине ${FwCMD} add allow tcp from any to ${IpOut} 80 in via ${LanOut} setup # открываем снаружи 20,21 порт - для активного FTP ${FwCMD} add allow tcp from any to ${IpOut} 20,21 in via ${LanOut} setup # разрешаем входящую почту ${FwCMD} add allow tcp from any to ${IpOut} 25 in via ${LanOut} setup # разрешаем SSH ${FwCMD} add allow tcp from any to ${IpOut} 22 in via ${LanOut} setup # открываем снаружи 20,21 порт - для активного FTP ${FwCMD} add allow tcp from any to ${IpOut} 20,21 in via ${LanOut} setup # пассивный FTP # для узнавания портранджа по которому будет работать, лезем в # /usr/home/lissyara/>sysctl net.inet.ip.portrange.first # net.inet.ip.portrange.first: 49152 # /usr/home/lissyara/>sysctl net.inet.ip.portrange.last # net.inet.ip.portrange.last: 65535 # Можно изгалиться примерно так, если есть желание, но я предпочитаю руками #${FwCMD} add allow tcp from any to ${IpOut} \ #`sysctl net.inet.ip.portrange.first | awk '{print $2}'`-\ #`sysctl net.inet.ip.portrange.last | awk '{print $2}'` via ${LanOut} ${FwCMD} add allow tcp from any to ${IpOut} 49152-65535 via ${LanOut} # COUNTER-STRIKE (без комментариев :)) ${FwCMD} add allow udp from any 27015-27025 to ${NetIn} in via ${LanOut} ${FwCMD} add allow udp from any 27015-27025 to ${NetIn} out via ${LanIn} ${FwCMD} add allow udp from ${NetIn} to any 27015-27025 in via ${LanIn} ${FwCMD} add allow udp from ${IpOut} to any 27015-27025 out via ${LanOut} # Блокируем все остальные попытки соединения с занесением в логи ${FwCMD} add deny log tcp from any to ${IpOut} in via ${LanOut} setup ${FwCMD} add allow tcp from ${IpOut} to any out via ${LanOut} setup ${FwCMD} add allow tcp from any to ${IpOut} in via ${LanIn} setup ########### BEGIN USERS ############################### # Разрешаем всем аську (ICQ) ${FwCMD} add allow tcp from ${NetIn} to any 5190 in via ${LanIn} setup # Пользователи которым разрешён инет ${FwCMD} add allow tcp from ${ip_lan}.151 to not ${NetIn} in via ${LanIn} setup ${FwCMD} add allow tcp from ${ip_lan}.153 to not ${NetIn} in via ${LanIn} setup ${FwCMD} add allow tcp from ${ip_lan}.154 to not ${NetIn} in via ${LanIn} setup ############# END USERS ################################# # запрещаем всё и всем. Если тип файрволла не open то это правило добавится # автоматически, но всё-же ну его. Лучше сам. Надёжней. ${FwCMD} add deny ip from any to any По файрволлам всё. Да, забыл - это всё описано для статически скомпиленных в ядро файрволлов, если грузите модулем - могут быть некоторые отличия (Хотя, с какого перепугу?). Также, необходимо заметить, что сам файл файрволла, по сути является shell-скриптом, - со всеми вытекающими плюсами - типа регулировка траффика день/ночь, в последнем примере... Осталось объяснить - что такое NAT и как его поднять. NAT - это Network Address Translation - подделка сетевых адресов, если по нашему. Есть т.н. частные сети - диапазоны IP-адресов которые запрещено применять в интернете, и они применяются организациями (ну, и, частными лицами) для адресации внутренних сетей организации. Но - несмотря на то, что сеть внутренняя - сотрудники хотят шариться по инету, смотреть порнушку и т.д. :) К тому же, `белых` (не частных) IP адресов не так уж и много - всем не выдашь, одних китайцев полтора миллиарда, а вот IP-шников всего 256*4=4294967296 (4 миллиарда, с копейками, в идеале. минус частные сети, минус всякие америкосовские институты, да вояки заграбаставшие себе по нескольку сетей класса A), поэтому приходится применять частные адреса. Для того чтобы все пользователи серых адресов могли ходить в инет и существует NAT - он подделывает адрес отправителя, как будто пакет шёл от машины, на которой крутится NAT, а не от машины в частной сети. Ответ тоже приходит на эту машину, и всё тот же NAT разбирает кому он предназначен, снова подделывает адрес, будто он шёл не ему, а машине с частным адресом. Итак. Для выполнения вышеописанных `фокусов` с IP адресами в FreeBSD существует natd - Network Address Translation daemon - демон. Для его запуска надо пересобрать ядро со следующими опциями: options IPDIVERT После чего добавляем следующие строки в /etc/rc.conf: natd_enable="YES" # собственно запуск natd natd_interface="fxp0" # интерфейс на котором он будет работать (тот, # который смотрит в инет) natd_flags="-m -u" # флаги : # -u - транслировать только адреса частных сетей # т.е. по RFC 1918: # 10.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16 # -m - попробовать оставить тот же номер порта что и был, # с этим флагом протоколы, типа RPC лучше пашут. Вот теперь всё. :) P.S. Для просмотра pipe, которые уже есть в системе, пользуйтесь командой ipfw pipe show Комментарии пользователей [62 шт.] MONSTR-SHEFF, 2006-01-25 в 15:52:25 У меня ядро как есть, за пускаю фаервол через rc.conf как написано, firewall_enable="YES" - если файрволл грузится модулем firewall_script="/etc/rc.firewall" - файл с правилами firewall_logging="YES" но сеть как была закрыта так и есть закрыта правили взял из первого примера. Где? и Что? не так не пойму по команде sh /etc/rc.firewall он запускается (вобщем я ни фига не понял от 4ей попы яйца ) НУЖНА СРОЧНО ПОМОЩЬ!!! lissyara, 2006-01-25 в 16:19:03 Создай тему в форуме - не надо тут спамить :) Кнопку отправить надо жать один раз, а не долбить по три :) Насчёт вопроса: firewall_type="/etc/rc.firewall" а не firewall_script="/etc/rc.firewall" Это не моя ошибка, а хандбука... Причём навыерно даже не ошибка - надо сравнить как оно в разных версиях FreeBSD - может поменяли... DeadLoco, 2006-02-16 в 12:08:10 В скрипте настоятельно рекомендую заменить вот эту строку: FwCMD="/sbin/ipfw" На вот эту: FwCMD="/sbin/ipfw -q " Ключ "-q" подавляет вербозный вывод при отработке команды ipfw, что нехорошо при запуске скрипта с терминала, если первой командой скрипта стоит флаш, а файрволл по умолчанию блокирующий. Вообще, общеупотребительно добрый совет: прописывая в переменную имя программы, ВСЕГДА добавляйте пару пробелов в конце. Например: FwCMD="/sbin/ipfw " Этим вы гарантируетесь, что все последующие переменные будут восприняты, как аругменты, а не получится, что-то вроде ipfqadd. dsa, 2006-02-17 в 0:08:12 # открываем снаружи 25 порт (SNMP) если на машине крутится почта опечаточка вышла 25 - SMTP порт :) lissyara, 2006-02-17 в 9:02:09 пьяная была, не помню :))) На самом деле, о чём думаешь - о том и пишешь. А за ошибку - спасибо! Щас поправлю. StepaniDOS, 2006-03-31 в 10:42:40 работы NAT обязательно присутствие строки gateway_enable="YES" в rc.conf по крайней мере для 6-ки nikola, 2006-04-20 в 18:36:14 firewall_type="/etc/rc.firewall" в 5.3 неработает выдаёт ошибку о неправилном аргументе FwCMD="/sbin/ipfw". Ей нужен firewall_script="/etc/rc.firewall" Dmitry, 2006-06-06 в 7:43:21 День добрый! установил FreeBSD_6, на фре имеется 2 интерфейса - внутренняя и внешняя сеть; пересобрал ядро. В ядре включил IPFIREWALL_DEFAULT_TO_ACCEPT. Но фря ни как не хочет выпускать во внешнюю сеть. :( Что только не пробовал - и ipnat и natd ни в какую подскажите пожалуйста, что делаю не так? и как можно исправить такую беду??? Marshall, 2006-07-02 в 18:32:29 А зачем в примере "простого файрволла для обычнейшей ситуации" еще вот эта строка: ${FwCMD} add divert natd ip from any to ${IpOut} in via ${LanOut} ? Просто я как-то без нее всю жизнь обходился P.S. ИМХО вообще-то проще пользовать IPNAT Sergey, 2006-07-12 в 22:55:10 Вот эти три строки: # разрешаем весь tcp траффик внутри локалки (на внутреннем интерфейсе) ${FwCMD} add allow tcp from any to any via ${LanIn} # разрешаем весь udp траффик внутри локалки (на внутреннем интерфейсе) ${FwCMD} add allow udp from any to any via ${LanIn} # разрешаем весь icmp траффик внутри локалки (на внутреннем интерфейсе) ${FwCMD} add allow icmp from any to any via ${LanIn} видимо можно заменить на одну: ${FwCMD} add allow all from any to any via ${LanIn} Статья интересная, спасибо большое. Правда я настраивал по другой, http://www.bsdportal.ru/kb.php?mode=article&k=76. Да еще, по личному опыту. На машину хожу по ssh и поначалу открыл стандартный 22 порт. В логах была куча попыток авторизации. неудачных естественно =) Чтобы юные дарования, освоившие nmap шли лесом повесил ssh на нестандартный порт. Попыток авторизации больше нет =) maxim, 2006-09-12 в 16:29:06 Грамотная статья, но но не нашел как сделать так чтобы на одной машине крутилось два NAT-а (бывает же у людей несколько сетевых карт на машине). Я это решил так в /etc новый файл rc.local natd -p 8668 -n xl0 natd -p 8778 -n xl1 а в firewall вместо natd написал 8668 и 8778 ita, 2006-09-28 в 10:15:25 ${FwCMD} add allow tcp from ${ip_lan}.100 to not ${NetIn} in via ${LanIn} setup не хочет у меня работать такое правило. работает ${FwCMD} add allow tcp from ${ip_lan}.100 to any via ${LanIn} setup reLax, 2006-12-09 в 9:10:18 Не работало правило ${FwCMD} add fwd 127.0.0.1,3128 tcp from ${NetIn} to any 80 via ${LanOut} . Заработало только в таком виде - ${FwCMD} add fwd ${IpIn},3128 tcp from ${NetIn} to any 80 via ${LanIn} Олег, 2007-01-19 в 5:37:56 Искренне благодарен !!!! Таких как ты не много! sergio, 2007-01-25 в 19:08:20 Для FreeBSD 6.0: В /etc/rc.conf должно быть: firewall_script="/etc/rc.firewall" Ванёк, 2007-02-02 в 12:19:39${FwCMD} add divert natd ip from ${NetIn}/${NetMask} to any out via ${LanOut} ${FwCMD} add divert natd ip from any to ${IpOut} in via ${LanOut} Вторая строчка безсмысленна, я када то то наступил уже на эти грабли =) Это хорошо работает только если у тебя ести 1 белый адрес на сетку, а если тебе нужно вывеси в инет сервак, который лежит в локалке (тупой начальник не захотел дать 2 метра кабеля и свитч =) урод... ) Например: IpOut="222.222.222" ${FwCMD} add divert 8868 ip from ${NetIn}.111 to any out via ${LanOut} ${FwCMD} add divert 8868 ip from any to ${IpOut}.1 in via ${LanOut} ${FwCMD} add divert 8869 ip from ${NetIn}.222 to any out via ${LanOut} ${FwCMD} add divert 8869 ip from any to ${IpOut}.2 in via ${LanOut} Ничего не работает =) Всмысле юзеры с нета не видят сервак из твоей локалки... В большинстве мануалов приведен именно такой пример (почему не знаю), в строчках ${FwCMD} add divert 8868 ip from any to ${IpOut}.1 in via ${LanOut} и ${FwCMD} add divert 8869 ip from any to ${IpOut}.2 in via ${LanOut} нужно ставить in via ${LanIn} вместо ${LanOut}. Это логически понятно, но новички могут запутатся... Надеюсь кому то поможет =) Ванёк, 2007-02-02 в 13:23:42 Совсем забыл... Демон nat'a запускается с ключём redirect_address {белый ip} {локальный ip} ну и port соответственно 8868 и 8869 Any, 2007-02-09 в 9:19:06 ${fwcmd} add divert 8668 ip from any to any via bfe0 Mikle, 2007-02-12 в 10:49:01 firewall_script="/etc/rc.firewall" #название скрипта firewall_type="SIMPLE" #название группы правил в скрипте,их #может быть несколько Меня когда то учили, что в целях оптимизации по правилу нужно пропускать пакет setup, типа: ${FwCMD} add allow tcp from ${IPany} 1024-65535 to ${IPout} 22 in via ${LanOut} setup остальные пакеты пойдут по правилу established. Соответственно правило established должно находится выше всех разрешающих правил. Это для нагруженных серверов, ес-но. Из минусов - статистика по правилам будет некорректна. KaMa-CyTpA, 2007-03-02 в 19:01:30 Сорри, только что проверил - многие серверы КС с порта 27010 начинаются. Ну это так. Просто. OMG!, 2007-04-01 в 5:45:33 Цитата (http://www.freebsd.org/doc/en_US.ISO8859-1/books/handbook/firewalls-ipfw.html): Enable the firewall: firewall_enable="YES" Эта строка должна быть обязательна, а не "если файрволл грузится модулем", как у вас в статье. Благодарю, из-за этого сегодня сервер (естественно, просто тестовый, на живом я бы тысячу раз перед пересбокой ядра подумал =)) ушёл в даун. Тем не менее, спасибо за ваш труд. Жаль, что такие неточности исправляются только 21 комментарием =\ OMG!, 2007-04-01 в 5:47:09 *** "обязательна" следует читать как "обязательно" ^^ hz, 2007-05-28 в 11:37:51 # рубаем мультикастовые рассылки ${FwCMD} add deny ip from any to 224.0.0.0/4 in via ${LanOut} # рубаем мультикастовые рассылки ${FwCMD} add deny ip from any to 240.0.0.0/4 in via ${LanOut} два раза подряд чтоб уж наверняка =) видимо в первом или во втором правиле имелось в виду LanIn lissyara, 2007-05-28 в 15:25:22 Советую обратить внимание на то, что между ними, и перечитать man ipfw - это взято именно оттуда, насколько я помню. Reshek, 2007-06-14 в 6:03:52 Почему-то если эта строка всё портит. ТЕ firewall , начинает блокировать всё что поступает с внешнего интерфейса. ${FwCMD} add divert natd ip from any to ${IpOut} in via ${LanOut} А СТАТЬЯ СУПЕР! rootd, 2007-06-14 в 15:23:43 ${FwCMD} add allow tcp from ${IpOut} to any out via ${LanOut} setup А разве вот это правило не позволит пользователям юзать инет и асю и вообще любые tcp подключения ? rootd, 2007-06-26 в 16:38:54 "Кстати, ядро можно и не пересобирать - достаточно загрузить модуль при старте системы, для этого внесём строку firewall_enable="YES" в файл /etc/rc.conf и после перезагрузки файрволл заработает." Потратил час пока не понял что FORWARD работает только с пересборкой ядра... Ckopnuo, 2007-07-18 в 17:48:38 Так все правила пишутся в /etc/rc.firewall? Или куда? Просто после пересборки ядра файлик этот уже есть и он не пустой...Получается надо оттуда все удалить и написать свои правила? Спасибо Ckopnuo, 2007-07-19 в 11:41:32 Сорри, все, понял уже:) begemoto, 2007-07-24 в 21:09:22 если есть check-state должен быть keep-state или limit, а их то я в этом конфиге и не вижу. например: ${FwCMD} add allow tcp from ${ip_lan}.151 to not ${NetIn} in via ${LanIn} setup а какое правило разрешает обратные пакеты? Или я не догоняю? lissyara, 2007-07-24 в 21:43:36 # разрешаем tcp-пакеты по уже установленным соединениям ${FwCMD} add allow tcp from any to any established *DEAD*Zmey, 2007-07-25 в 14:20:00 lissyara, спасибо огромное за все те материалы, которые у Вас здесь выложены! На мой взгляд - Мегасайт (по классификации Гоблина :D) Многие из статей попробовал, и очень многое выручило. :) В строке "# Разрешаем весь траффик по внутреннему интерфейсу (петле)" ${FwCMD} add allow ip from any to any via lo0 разрешаем всё через lo0, или, что тоже самое ${FwCMD} add allow all from any to any via lo0 далее # Вводим запреты: # рубим попытки lo0 куда-то лезть и откуда-то лезть на lo0 (вот честно - ни # одного пакета по этим правилам не зарубилось за всё время... Может в этом # моё счастье? :)) ${FwCMD} add deny ip from any to 127.0.0.0/8 ${FwCMD} add deny ip from 127.0.0.0/8 to any Мы уже разрешили ВЕСЬ трафик, в первом правиле, так что "Запреты" наверное можно убрать? Ну и соответственно потому и "не рубится". Или я не прав? lissyara, 2007-07-25 в 14:29:03 Прав. Надо правила местами поменять :) begemoto, 2007-07-25 в 21:16:22 так все таки зачем check-state? и еще: почему не обьеденить правила: ${FwCMD} add deny ip from any to 10.0.0.0/8 in via ${LanOut} и ${FwCMD} add deny ip from 10.0.0.0/8 to any out via ${LanOut} в одно: ${FwCMD} add deny ip from 10.0.0.0/8 to any via ${LanOut} lissyara, 2007-07-25 в 22:06:18 когда будешь ковырять - почему что-то не работает - удобней когда так. ============= и прочти наконец текст в окошке для ввода комментов, до того как стираешь его. skoval, 2007-08-13 в 11:07:57 По-моему в явном виде тут никто так и не написал про firewall_type и firewall_script. В хендбуке написано, что в firewall_type помимо параметров для /etc/rc.firewall (open, simple etc.) можно указать абсолютный путь к файлу с правилами для фаервола, т.е. add block in all add block out all а в firewall_script указывается абсолютный путь к командам для /bin/sh, т.е. ipfw add block in all ipfw add block out all. Это два основных способа написания своих правил для фаервола. Nadz Goldman, 2007-08-20 в 12:22:05 Фря 6.0 IPFW+NAT Ядро собрано с опциями: options IPFIREWALL options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=5 options IPFIREWALL_FORWARD options IPDIVERT options DUMMYNET options IPFIREWALL_DEFAULT_TO_ACCEPT Но все правила, в которых указана опция SETUP попросту неработают. urgor, 2007-08-21 в 14:06:22 > Мы уже разрешили ВЕСЬ трафик, в первом правиле, Мы разрешили на интерфейсе lo, а для пакетов что пришли на него с fxp0 отработают запреты.... 2 liss: ничего менять не надо, у тя все прально... Kolesya, 2007-09-07 в 17:19:40 >hz, 2007-05-28 в 11:37:51 > ># рубаем мультикастовые рассылки >${FwCMD} add deny ip from any to 224.0.0.0/4 in via >${LanOut} ># рубаем мультикастовые рассылки >${FwCMD} add deny ip from any to 240.0.0.0/4 in via >${LanOut} >два раза подряд чтоб уж наверняка =) >видимо в первом или во втором правиле имелось в виду >LanIn 224 и 240 не совпадают :) так что Лис правильно написал kolesya, 2007-09-07 в 19:44:10 [b]Статья Лиса, последний пример(типа не самый простой файрвол) ># Разрешаем траффик внутренней сети на внутреннем >интерфейсе (входящий) >${FwCMD} add allow ip from any to ${NetIn} in via ${LanIn} ># Разрешаем траффик внутренней сети на внутреннем интерфейсе (исходящий) >${FwCMD} add allow ip from ${NetIn} to any out via ${LanIn} Если у когото успользуется чтот типа tun-интерфейс(VPN и т.д.), правила приведенные выше,при условии что сети доверенные, нужно поменять на: VPNNet="10.1.2.0/24" VPNIf="tun0" ... ${FwCMD} add allow ip from any to ${NetIn},${VPNNet} in via ${LanIn} ${FwCMD} add allow ip from ${NetIn},${VPNNet} to any out via ${LanIn} ${FwCMD} add allow ip from any to ${NetIn},${VPNNet} in via ${VPNIf} ${FwCMD} add allow ip from ${NetIn},${VPNNet} to any out via ${VPNIf} barsykoff, 2007-09-12 в 14:15:57 А разве не оптимальней было сделать так: 1. Разрешить трафик по локальной сети и петле 2. NAT, fwd 3. Разрешить некоторый трафик снаружи 4. Запретить все. Ведь тогда не надо писать так много запретов... Kolesya, 2007-10-02 в 20:39:08 > barsykoff, 2007-09-12 в 14:15:57 Если можно подробнее torki, 2007-10-18 в 1:15:16 lissyar-e, опять земной поклон! Статья супер! Спасибы множественные! Хвати пить пиво, обеспеч себе старость(шутка). Пиши Книгу, материал уже набрался! artem, 2007-11-16 в 18:19:28 Из мелочей: обновление подправленного файла rc.firewall- #root#>sh /etc/rc.firewall я пока не догадался reboot писал :) lisergey, 2007-11-16 в 18:59:59 по идее, еще правильне обновлять правила фаервола так # /etc/rc.d/ipfw restart & этот вариант проверит и переменные из /etc/rc.conf и при необходимости запустит NAT, и правильно выберет скрипт для фаервола в зависимости от того, как он прописан в /etc/rc.conf в простейшем же случае это будет эквивалентно тому же самому # sh /etc/rc.firewall f0s, 2007-12-06 в 17:10:30 курил сегодня хендбук... там написано следующее: # Deny all inbound traffic from non-routable reserved address spaces $cmd 00300 deny all from 192.168.0.0/16 to any in via $pif $cmd 00301 deny all from 172.16.0.0/12 to any in via $pif $cmd 00302 deny all from 10.0.0.0/8 to any in via $pif $cmd 00303 deny all from 127.0.0.0/8 to any in via $pif $cmd 00304 deny all from 0.0.0.0/8 to any in via $pif $cmd 00305 deny all from 169.254.0.0/16 to any in via $pif $cmd 00306 deny all from 192.0.2.0/24 to any in via $pif $cmd 00307 deny all from 204.152.64.0/23 to any in via $pif $cmd 00308 deny all from 224.0.0.0/3 to any in via $pif а у теб в статье тоже самое от них к any, но не 'in', a 'out' почему-то artem, 2007-12-21 в 14:32:28 советую еще почитать здесь особенно про DUMMYNET smilealex, 2007-12-21 в 14:44:05 2artem... вот я туп.. и? уважаемый.. неужели труда составляет выразить своё пренебрежение выкладыванием ссылки вместо обоснованного комментария с доводами и примерами? Честь имею! ЗЫ пусть к стыду - но по ссылке даже не пройдусь, ибо довольствуюсь малым. lissyara, 2007-12-21 в 15:12:23 Он ТИЦ и ПР сайта своего повышает... Чтоб ссылки дороже продавались =) Тока вот неучёл, что специально для таких я ссылки сделал через редирект. =========== оффтоп - по меркам интернета и поисковиков, эта конкретная страница - очень жирная. По запросу IPFW - она в первой пятёрке всех крупных поисковиков. Периодически на первое место лезет, но ниже пятёрки - не падает. Вот поэтому, такой ерундой и занимаются. ============= "Остапа понесло" :) artem, 2008-01-10 в 16:04:22 у кого о чем голова болит, а я DUMMYNET прикручивал а так как тут он рассмотрен вскольз то оставил ссылку дабы помочь остальным и себе если забуду :) Reshek, 2008-01-10 в 16:38:33 Ну и где линк? DarkHost, 2008-01-15 в 15:44:30 Jail на машине c ipfw не хочет пускать по SSH, хотя стот allow ip from 195.14.56.XXX to me 22. На основную машину войти могу, в Jail-нет. Порт открытый вижу, а при генерации DSA ключа - замирает и отваливается по timeout(логи). KaMa-CyTpA, 2008-02-29 в 15:39:54 Народ! В 7 IPFW переделан сильно насколько я понял. Правила по поводу НАТ-а не работают - ну это на сайте написано что тни просто НАТ в IPFW включили. А вот форвардинг у меня тоже типа обломался почему-то... Буит описалово аль как? Reshek, 2008-02-29 в 15:51:01 Да. Интересно. Иду ковырять 7-ку. dimts, 2008-03-02 в 13:05:10 В коментах тут увидел про перезагрузку правил. Правильно перезапускать их этим скриптом: /usr/share/examples/ipfw/change_rules.sh только не забудьте дать права на выполнение ffzema, 2008-04-10 в 11:29:05 Настроил ipfw. Вот решил задачу выхода во внешнюю сеть на сервер провайдера, в котором лежит репозитарий Но в инет пользователей не пустил вот кусочек моего ${FwCMD} add 140 deny ip from 127.0.0.0/8 to any #следующим 2 правилам нужно сделать так чтоб пропускалось следующее за ними правило #!!!!!!!!!!!! проверить ${FwCMD} add 145 skipto 160 ip from ${AllIp} to ${ErTelecom} out via ${LanOut} #Разрешаем соединение с сервером р-телекома ${FwCMD} add skipto 110 ip from ${ErTelecom} to ${AllIp} #Разрешаем соединение сервера р-телекома с компами #Разрешил в инет, если нужно еще кому, то нужно добавить через запятую его ip адрес или лучше прописать в переменной #${FwCMD} add 150 deny ip from not ${AllowIp} to any out via ${LanOut} # Этим адресам можно в инет # Вводим запреты: # режем частные сети на внешнем интерфейсе - по легенде он у нас # смотрит в интернет, а значит пакетам этим браться не откуда на нём. # рубим частные сeти ${FwCMD} add 160 deny ip from any to 10.0.0.0/8 in via ${LanOut}
Источник статьи