Документация (для v0.2.8)
- СИНТАКСИС
- ОПИСАНИЕ
- ФОРМАТ ПРАВИЛА
- Действия правила
- Тело правила
- Опции правила (образцы соответствия)
- СИСТЕМА СЕТЕВОЙ ЗАЩИТЫ СОСТОЯНИЯ
- ВАЖНЫЕ МОМЕНТЫ
- ПРИМЕРЫ
- СМ. ТАКЖЕ
- АВТОРЫ
Синтаксис
ipfw [-q] add [число] тело_правила
ipfw [-adeftN] {list | show} [число ...]
ipfw [-f | -q] flush
ipfw [-q] {zero | resetlog | delete} [число ...]
ipfw [-Nq] путь
Описание
Конфигурация брандмауэра, или набор правил, задается в виде списка правил, пронумерованных от 1 до 65535. Пакеты попадают в ipfw из различных мест в стеке протокола (в зависимости от источника и адресата пакета, возможно, что ipfw вызывается множество раз для одного и того же пакета). Пакет, пришедший в систему сетевой защиты, сравнивается с каждым из правил набора правил в системе сетевой защиты. Когда найдено соответствие правилу, выполняется соответствующее действие.
Конфигурация всегда включает правило по-умолчанию (с номером 65535), которое нельзя изменять и которое соответствует любому пакету. С этим стандартным правилом может быть связано действие deny(отвергнуть) или allow(пропустить), в зависимости от конфигурации драйвера ядра.
Если набор правил включает одно или несколько правил с опцией keep-state, то программа ipfw предполагает работу с сохранением состояния (stateful behaviour), т.е. при успешном сопоставлении будет создавать динамические правила, cоответствующие конкретным параметрам (адресам и портам) сопоставившегося пакета.
Эти динамические правила с ограниченным временем существования проверяются, начиная с первого вхождения правила check-state или keep-state, и обычно используются для приоткрытия брандмауэра по требованию только для допустимого трафика. Подробнее о работе программы ipfw с сохранением состояния см. далее в разделах ФОРМАТ ПРАВИЛА и ПРИМЕРЫ.
Со всеми правилами (включая динамические) связано несколько счетчиков: счетчик пакетов, счетчик байтов, счетчик журнала (log count) и временная отметка (timestamp), хранящая время последнего сопоставления. Счетчики можно выдать или сбросить с помощью команд ipfw.
Правила добавляются с помощью команды add; удаляются по одному - с помощью команды delete, и все сразу - с помощью команды flush; выдаются, в том числе, возможно, со значениями счетчиков, с помощью команд show и list. Наконец, значения счетчиков можно сбросить с помощью команд zero и resetlog.
Поддерживаются следующие опции:
-a | Выдавать значения счетчиков вместе с правилами. См. также описание команды show. |
---|---|
-d | Показывать динамические правила в дополнение к статическим. |
-e | Если определен параметр -d, показывать также динамические правила с истекшим сроком действия. |
-f | Не запрашивать подтверждения для команд, которые при неправильном использовании могут вызвать проблемы, например, flush. Учтите, что если процесс не связан с терминалом, эта опция подразумевается. |
-q | При добавлении, обнулении, сбросе журнала или списка правил не выдавать информации о действиях (эта опция подразумевает опцию -f). Это полезно при настройке списка правил с помощью нескольких команд ipfw в сценарии (например, sh /etc/rc.firewall), или при обработке файла с несколькими правилами ipfw в сеансе с удаленной регистрацией. Если команда flush выполняется в обычном (информативном) режиме (в стандартной конфигурации ядра), она выдает сообщение. Поскольку все правила сбрасываются, сообщение это не может быть передано сеансу. В результате, сеанс с удаленной регистрацией закрывается и остальные правила не обрабатываются. Для восстановления придется зарегистрироваться с консоли. |
-t | При выдаче правил указывать временную отметку последнего сопоставления. |
-N | При выдаче пытаться разрешать адреса и имена служб. |
enum | Показать список интерфейсов (опция только под Windows). |
sysctl | Показать значения sysctl (опция только под Windows). Вы можете изменять эти значения. Например, "ipfw sysctl debug=0" - изменит значение debug на 0. |
Для упрощения конфигурирования правила можно помещать в файл, который обрабатывается с помощью команды ipfw как показано в первой строке синтаксиса. Необходимо указывать полное имя файла. Файл будет читаться построчно и строки применяются как аргументы вызова утилиты ipfw.
Формат правила
Правила ipfw имеют следующий формат:
[prob вероятность_сопоставления] действие [log [logamount число]] протокол from исходный_адрес to целевой_адрес [спецификация_интерфейса] [опции]
Каждый пакет можно фильтровать на основе следующей, связанной с ним информации:
Протокол IPv4 | TCP, UDP, ICMP и т.п. |
Исходный и целевой IP-адреса | (возможно, замаскированные) |
Исходный и целевой порт | списки, диапазоны или маски |
Направление | (входящий или исходящий) |
Интерфейс передачи и приема | по имени или адресу |
Различные поля IP заголовка | version, type of service, datagram length, identification, fragment flag (non-zero IP offset), Time To Live |
Различные поля TCP заголовка | флаги TCP (SYN, FIN, ACK, RST, etc.), sequence number, acknowledgment number, window |
Опции TCP | |
Типы ICMP | для ICMP пакетов |
Учтите, что фильтровать пакеты на основе исходного IP-адреса или исходного порта TCP/UDP небезопасно, поскольку адрес и номер порта легко подделать.
- номер_правила
- Каждое правило имеет номер (rule_number ) в диапазоне 1.. 65535, с последним, зарезервированным для заданного по умолчанию правила. Правила проверяются последовательно по номерам правил. Несколько правил могут иметь один и тот же номер, при проверке они обрабатываются в том же порядке, в котором добавлялись. Если правило введено без определения номера, ядро назначит такой номер, что правило станет последним перед заданным по умолчанию правилом.Автоматические номера правил назначаются, увеличивая последний номер правила на 100. Если это не возможно (например, потому что номер получился бы больше максимально допустимого номера правила), используется номер последнего правила не по умолчанию.
- prob вероятность_сопоставления
- Сопоставление происходит только с заданной вероятностью (вещественное число в диапазоне от 0 до 1). Эта возможность может пригодиться для различных целей, например, для случайной потери пакетов.
- log [logamount количество]
- Если пакет соответствует правилу с ключевым словом log, сообщение
будет записано в файл windows\security\logs\wipfwYYYYMMDD.log.
Как только предел достигнут, регистрацию можно опять возобновить, очистив счетчик регистрации или счетчик пакетов для того правила, см. команду resetlog.
Note:
logging is done after all other packet matching conditions have been successfully verified, and before performing the final action (accept, deny, etc.) on the packet.
Действия правила
Правило может быть связано с одним из следующих действий, которые будут выполнены, если пакет соответствует условию правила.
- allow | accept | pass | permit
- Пропустить пакеты, соответствующие правилу. Просмотр правил заканчивается
- check-state
- Проверяет пакет динамическим набором правил. Если соответствие найдено, выполняется действие, связанное с правилом, которое сгенерировало это динамическое правило, иначе переход к следующему правилу. Правила сheck-state не имеют тела. Если не найдено никаких правил check-state, динамический набор правил проверяется в первом правиле keep-state или limit.
- count
- Обновить счетчики для всех пакетов соответствующих правилу. Поиск продолжается со следующего правила.
- deny | drop
- Отброс пакетов, соответствующих этому правилу. Поиск заканчивается.
- skipto номер_правила
- Пропускает все последующие правила с номерами меньше указанного. Поиск продолжается с первого правила, номер которого равен указанному или больше его.
Тело правила
Тело правила содержит нуль или больше образцов (типа определения адресов источника и назначения или портов, вариантов протокола, входящих или исходящих интерфейсов, и т.д.), которым пакет должен соответствовать для того, чтобы быть признанным. Тело правила должно вообще включать спецификацию адреса источника и назначения. Ключевое слово any может использоваться в различных местах, для определения того, что содержимое требуемого поля является безразличным.
Тело правила имеет следующий формат:
[протокол from источник to назначение] [опции]
Поля правила имеют следующее значение:
- протокол:
- IPv4 протокол указанный по номеру, или имени (полный список смотрите в
windows\system32\drivers\etc\protocol).
Ключевые слова ip или all означают соотвествие любому протоколу.
- источник и назначение: ip-адрес [порты]
- Отдельный ip-адрес, произвольно сопровождаемый спецификатором портов.
- ip-адрес
- Адрес указанный одним из следующих способов,
произвольно которым предшествует оператор not:
- any
- Соответствует любому IP адресу.
- числовой-ip | имя_хоста
- Соответствует отдельному адресу IPv4, указанному в точечной нотации или именем хоста. Имя хоста разрешается во время добавления правила к списку правил системы сетевой защиты.
- адрес/биты
- IP-адрес в виде четверки чисел через точку плюс размер
маски в битах, например, 1.2.3.4/24.
В данном случае соответствовать будут все IP-адреса в диапазоне от 1.2.3.0 до 1.2.3.255.
- адрес:маска
- IP-адрес в виде четверки чисел с маской через точку в
виде четверки чисел через точку, например,
1.2.3.4:255.255.240.0.
В данном случае соответствовать будут все IP-адреса в диапазоне от 1.2.0.0 до 1.2.15.255.
Можно потребовать, чтобы правилу соответствовали все адреса, кроме указанных, добавив перед адресом модификатор not. Этот модификатор не влияет на выбор по номерам портов.
- порты: {порт|порт-порт|порт:маска}[,порт[,...]]
- Дефис (-) позволяет задать диапазон портов (включая границы).
Двоеточие (:) позволяет задать порт и маску - пакет считается соответствующим правилу, если номер порта в нем соответствует указанному в правиле с точностью до битов, установленных в маске.
Имя сервиса может быть использовано вместо значения номера порта.
В диапазоне может быть указано только первое значение и длина списка портов, ограниченная 10.
Опции правила (образцы соответствия)
В пределах правил могут использоваться дополнительные образцы соответствия. В правиле могут присутствовать нуль или больше этих, так называемых вариантов.
ipfw add 100 allow ip from not 1.2.3.4 to any
Могут использоваться следующие образцы соответствия (перечисленные в алфавитном порядке):
- established
- Совпадают пакеты TCP, в которых установлен бит RST или ACK.
- fragment
- Совпадают пакеты, которые являются фрагментами, но не первым фрагментом дейтаграммы IP. Обратите внимание, что эти пакеты не будут иметь заголовков протокола (напр. TCP, UDP), пэтому варианты, которые контролируют их заголовки, никогда не будут соответствовать.
- icmptypes types
Совпадают ICMP пакеты, тип ICMP которых находится в списке types. Список может быть определен как любая комбинация диапазонов или индивидуальных типов отделенных запятыми. Поддерживаемые типы 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) - ответ на запрос об адресной маске.
- in | out
- Совпадают входящие или исходящие пакеты, соответственно.
- ipoptions spec
- Соответствует, если заголовок IP-пакета содержит перечисленный через
запятую список опций, указанный в spec. ssrr (strict source route, жесткая
маршрутизация от источника), lsrr (loose source route, свободная
маршрутизация от источника), rr (record packet route, запись маршрута пакета)
и ts (timestamp, отметка о времени). Отсутствие какой-либо опции может быть
обозначено знаком '!".
- keep-state
- После соответствия firewall создаст динамическое правило, поведение которого по умолчанию должно соответствовать двунаправленному трафику между источником и получателем; IP/порт использует тот же самый протокол; правило имеет ограниченный срок действия (определяемый набором переменных sysctl), время действия обновляется при обнаружении пакета, соответствующего правилу.
- limit {src-addr | src-port | dst-addr | dst-port} N
- Брандмауэр разрешает только N соединений с теми же самыми параметрами, которые определяются данным правилом. Может быть указан один или более адресов источника или получателя и порты.
- recv | xmit | via {ifX | if* | ipno | any}
Совпадают пакеты, полученные, переданные или проходящие через соответствующий интерфейс, указанный точным именем (ifX), именем устройства (if*), адресом IP или через любой интерфейс.
Ключевое слово via заставляет проверять интерфейс всегда. Если используется recv или xmit вместо via, то проверяется только получающий или передающий интерфейс (соответственно). Определяя оба, возможно установить соответствие пакетам, основанным и на получающем, и передающем интерфейсе, например:
ipfw add deny ip from any to any out recv ppp1 xmit eth1
Интерфейс recv может быть проверен на входящих или на исходящих пакетах, в то время как интерфейс xmit может быть проверен только на исходящих пакетах. Так требуется out (и in недопустим) всякий раз, когда используется xmit.
- setup
- Только для TCP-пакетов. Соответствует пакетам, которые имеют битовую установку SYN, но не имеют установки ACK. Это сокращенная форма ``tcpflags syn,!ack''.
- tcpflags spec
Только пакеты TCP. Соответствуют, если заголовок TCP содержит разделенный запятыми список флагов, указанных в spec. Поддерживаемые TCP флги:
fin, syn, rst, psh, ack and urg. Отсутствие отдельного флага может быть обозначено с '!'. Правило, которое содержит спецификацию tcpflags, никогда не может соответствовать фрагментированному пакету, который имеет ненулевое смещение. См. опцию frag для подробностей относительно соответствия фрагментированных пакетов.
- tcpoptions spec
Только пакеты TCP. Соответствует, если заголовок TCP содержит разделенный запятыми список вариантов, указанных в spec. Поддержываемые варианты TCP:
mss (максимальный размер сегмента), window (объявление окна tcp), sack (выборочный ack), ts (rfc1323 временная метка) и cc (rfc1644 t/tcp счетчик подключений). Отсутствие определенной опции может быть обозначено с '!'.
Важные моменты
При разработке правил надо учитывать следующие существенные моменты:
- Помните, что фильтруются как входящие, так и исходящие пакеты. Для большинства подключений необходим двунаправленный обмен пакетами.
- Помните о необходимости очень внимательно тестировать набор правил. При этом крайне желателен доступ к консоли.
- Не забывайте про интерфейс закольцовывания (loopback interface).
Система сетевой защиты состояния
Операция состояния - путь для системы сетевой защиты, динамически создающей правила для определенных потоков при обнаружении пакетов соответствующих данному образцу. Поддержка операций состояния доступна через варианты правил check-state, keep-state и limit.
Динамические правила создаются, когда пакет соответствует правилу keep-state или limit, вызывая создание динамического правила, которое будет соответствовать всем пакетам только с данным протоколом между парой адресов src-ip/src-port dst-ip/dst-port (src и dst используются здесь только для того, чтобы обозначить начальные адреса соответствия, но впоследствии они полностью эквивалентны). Динамические правила будут проверены при первом возникновении check-state, keep-state или limit, и их выполняемое действие будет таким же, как и в родительском правиле.
Обратите внимание, что в динамических правилах никакие другие дополнительные атрибуты кроме протокола и адреса IP и порта не проверяются.
Типичное использование динамических правил должно сохранить конфигурацию закрытой системы сетевой защиты, но позволить первому TCP SYN пакету из внутренней сети установить динамическое правило для потока так, чтобы пакеты, принадлежащие этому сеансу, прошли через систему сетевой защиты:
ipfw add check-state
ipfw add allow tcp from my-subnet to any setup keep-state
ipfw add deny tcp from any to any
Подобный подход может использоваться для UDP, где UDP пакет, исходящий из внутренней сети, установит динамическое правило, позволяющее прохождение ответа через систему сетевой защиты:
ipfw add check-state
ipfw add allow udp from my-subnet to any keep-state
ipfw add deny udp from any to any
Динамические правила устаревают после некоторого времени, которое зависит от состояния потока данных.
См. раздел ПРИМЕРЫ для большего количества примеров о том, как использовать динамические правила.
Примеры
Есть слишком много всевозможных использований ipfw, так что этот раздел даст только маленький набор примеров.
Базовая фильтрация пакетов
Эта команда добавляет установку, которая запрещает все tcp пакеты от cracker.evil.org на порт telnet wolf.tambov.su:
ipfw add deny tcp from cracker.evil.org to wolf.tambov.su telnet
Это правило запрещает пакеты с сети класса С на мой хост:
ipfw add deny ip from 123.45.67.0/24 to my.host.org
Первый и эффективный способ ограничить доступ (не использующий динамические правила) - использование следующих правил:
ipfw add allow tcp from any to any established
ipfw add allow tcp from net1 portlist1 to net2 portlist2
setup
ipfw add allow tcp from net3 portlist3 to net3
portlist3 setup
...
ipfw add deny tcp from any to
any
Первое правило даст соответствие для нормальных пакетов TCP, но оно не будет соответствовать начальным SYN пакетам, которые будут соответствовать правилу setup только для выбранных пар источник/адресат. Все другие SYN пакеты будут отброшены заключительным правилом deny.
Динамические правила
Чтобы защитить сайт от нападений, использующих поддельные TCP пакеты, более безопасно использовать динамические правила:
ipfw add check-state
ipfw add deny tcp from any to any established
ipfw add allow tcp from my-net to any setup keep-state
Это позволит системе сетевой защиты устанавливать динамические правила только для тех подключений, которые начинаются с правильного SYN пакета, исходящего из внутренней сети. Динамические правила проверяются при встрече с первым правилом check-state или keep-state. Правило check-state обычно должно помещаться в начале набора правил для минимизации работы по просмотру набора правил.
Чтобы ограничить количество подключений открываемых пользователем, Вы можете использовать следующий тип правил:
ipfw add allow tcp from my-net/24 to any setup limit src-addr 10
ipfw add allow tcp from any to me setup limit src-addr 4
Первое (в предположении, что это выполняется на шлюзе), позволит каждому компьютеру в /24 сети открывать не более 10 TCP подключений. Последнее может быть помещено на сервер, для гарантии того, что отдельный клиент не использует больше чем 4 одновременных подключений.
ОСТЕРЕГАЙТЕСЬ: динамические правила могут привести к нападениям типа отказа в обслуживании при помощи SYN-мусора, который открывает огромное количество динамических правил. Последствия таких нападений могут быть частично ограничены, действуя на набор переменных sysctl, которые управляют действиями системы сетевой защиты.
Это правило случайно отбрасывает входящие пакеты с вероятностью 5 %:
ipfw add prob 0.05 deny ip from any to any in
Вот хорошее использование команды list для просмотра поясняющего отчета и информации с отметками времени:
ipfw -at list
или в короткой форме без информации об временных отметках:
ipfw -a list
что является эквивалентным:
ipfw show
См. также
S. Floyd and V. Jacobson, Random Early Detection gateways for Congestion Avoidance, August 1993.
B. Braden, D. Clark, J. Crowcroft, B. Davie, S. Deering, D. Estrin, S. Floyd, V. Jacobson, G. Minshall, C. Partridge, L. Peterson, K. Ramakrishnan, S. Shenker, J. Wroclawski, and L. Zhang, Recommendations on Queue Management and Congestion Avoidance in the Internet, April 1998, RFC 2309.
Внимание!
Неправильная конфигурация системы сетевой защиты может перевести ваш компьютер в нестабильное состояние, возможно завершая поддержку сети и, тем самым, вызвав необходимость вмешательства с системной консоли для восстановления управления.
Авторы
- Юрген Анцилевич (Ugen J. S. Antsilevich)
- Пол-Хёнинг Камп (Poul-Henning Kamp)
- Алекс Нэш (Alex Nash)
- Арчи Коббс (Archie Cobbs)
- Луиджи Риццо (Luigi Rizzo)
Функциональный интерфейс (API) основан на коде, написанном Дэниэлем Буле (Daniel Boulet) для BSDI.
IPFW перенесен на Windows® Русланом Старицыным и Владом Гончаровым.