- Автор темы
- Администратор
- Модер.
- Команда форума
- #1
Ipfirewall - open source модуль, портированный на многие ОС. В этом списке FreeBSD, NetBSD, OpenBSD, SunOS, HP/UX и Solaris, Mac OS и даже Windows. Кроме того, часто используется для различных встраиваемых систем. Впервые появился в FreeBSD версии 2.0.
Основные возможности:
В ipfw конфигурация состоит из пронумерованных правил. Пакет проходит по правилам, начиная с меньшего номера к большему, до первого действия (к примеру allow или deny), после чего обработка прекращается. Чем-то похоже на iptables в Linux.
ipfw с пустой конфигурацией по умолчанию блокирует все соединения. Чтобы не потерять доступ к серверу дополнительно нужно добавить в rc.conf
Эта строка укажет ipfw добавить в конфигурацию строку
Полезные команды:
ipfw list # вывод всех правил
ipfw -d list # вывести все правила, включая динамические
ipfw -de list # вывести все правила, включая динамические, в том числе истёкшие
ipfw -t list # вывести все правила, второй колонкой - время последнего совпадения
ipfw -a list # вывести все правила, второй и третьей колонкой будут счетчики входящих и исходящих совпадений
Добавление правил происходит командой
ipfw add <правило>
Добавить простое правило, под номером 100, разрешающее весь трафик на всех интерфейсах
И удаление:
<Номер> <Действие> <Протокол> from <Источник> to <Назначение> \
[порт] [in | out] [via IF] \
[keep-state | limit {src-addr | src-port | dst-addr | dst-port}]
Номер - порядковый номер правила, предпочтительно в конфигурации использовать номера не подряд, это позволит без проблем добавлять правила во время работы файрвола. Возможно добавление нескольких правил под одним номером. В этом случае они будут срабатывать в порядке добавления и ipfw delete удалит их все.
Действие назначенное совпавшему пакету. В этой статье мы рассмотрим
allow | accept | pass | permit
Эти действия равнозначны. Пропустить пакет, обработка завершается. Я буду использовать allow, для единообразия.
deny | drop
Так же равнозначны. Отбросить пакет. Буду использовать deny
check-state
Проверяет пакет по таблице динамических правил (соединений), никаких дополнительных опций не предполагает.
Протокол - tcp, udp, icmp, или любой другой протокол, описанный в /etc/protocols
Источник и Назначение - ip адреса, без комментариев. Кючевое слово all означает любой адрес. Ключевое слово me означает локальный адрес хоста.
Порт - номер порта для tcp и udp. Можно использовать имена сервисов, описанные в /etc/services
in|out - означают совпадение с входящими или исходящими пакетами.
via IF - совпадение с трафиком только одного интерфейса IF.
keep-state - ключевое слово, указывающее о необходимости создания динамического правила, которое разрешит обмен пакетами между источником и назначением.
limit - разрешать только N соединений, соответствующих правилу. Создаёт динамические правила подобно keep-state. Нельзя в одном правиле использовать limit и keep-state.
Для сохранения конфигурации и загрузки правил мы будем использовать shell скрипт, указанный в rc.conf опцией firewall_script.
Фактически, этот shell скрипт содержит набор команд ipfw. Что позволяет использовать в написании конфигурации все преимущества shell. Особенно пригодятся переменные. К примеру:
Основные возможности:
- обработчик правил на уровне ядра, включающий систему учета пакетов
- механизм логирования
- механизм форвардинга
- ipstealth (механизм редактирования TTL полей, защита от traceroute)
- основанные на ALTQ средства управления QoS
- механизмы управления пропускной способностью
- основанная на таблице маршрутов система анти-спуффинга
- встроенный NAT, PAT и LSNAT
- поддержка IPv6 (с некоторыми ограничениями)
В ipfw конфигурация состоит из пронумерованных правил. Пакет проходит по правилам, начиная с меньшего номера к большему, до первого действия (к примеру allow или deny), после чего обработка прекращается. Чем-то похоже на iptables в Linux.
Управление и полезные настройки
Для включения ipfw в rc.conf необходимо добавить следующие строки:
Код:
firewall_enable="YES"
firewall_script="/etc/ipfw_conf.sh"
firewall_logging="YES"
Код:
firewall_type="open"
Код:
65535 allow ip from any to any
ipfw list # вывод всех правил
ipfw -d list # вывести все правила, включая динамические
ipfw -de list # вывести все правила, включая динамические, в том числе истёкшие
ipfw -t list # вывести все правила, второй колонкой - время последнего совпадения
ipfw -a list # вывести все правила, второй и третьей колонкой будут счетчики входящих и исходящих совпадений
Добавление правил происходит командой
ipfw add <правило>
Добавить простое правило, под номером 100, разрешающее весь трафик на всех интерфейсах
Код:
ipfw add 00100 allow ip from any to any
Код:
ipfw delete 00100
Структура правил, основные параметры
Общая структура правила не отличается особой сложностью:<Номер> <Действие> <Протокол> from <Источник> to <Назначение> \
[порт] [in | out] [via IF] \
[keep-state | limit {src-addr | src-port | dst-addr | dst-port}]
Номер - порядковый номер правила, предпочтительно в конфигурации использовать номера не подряд, это позволит без проблем добавлять правила во время работы файрвола. Возможно добавление нескольких правил под одним номером. В этом случае они будут срабатывать в порядке добавления и ipfw delete удалит их все.
Действие назначенное совпавшему пакету. В этой статье мы рассмотрим
allow | accept | pass | permit
Эти действия равнозначны. Пропустить пакет, обработка завершается. Я буду использовать allow, для единообразия.
deny | drop
Так же равнозначны. Отбросить пакет. Буду использовать deny
check-state
Проверяет пакет по таблице динамических правил (соединений), никаких дополнительных опций не предполагает.
Протокол - tcp, udp, icmp, или любой другой протокол, описанный в /etc/protocols
Источник и Назначение - ip адреса, без комментариев. Кючевое слово all означает любой адрес. Ключевое слово me означает локальный адрес хоста.
Порт - номер порта для tcp и udp. Можно использовать имена сервисов, описанные в /etc/services
in|out - означают совпадение с входящими или исходящими пакетами.
via IF - совпадение с трафиком только одного интерфейса IF.
keep-state - ключевое слово, указывающее о необходимости создания динамического правила, которое разрешит обмен пакетами между источником и назначением.
limit - разрешать только N соединений, соответствующих правилу. Создаёт динамические правила подобно keep-state. Нельзя в одном правиле использовать limit и keep-state.
Простейшая конфигурация
Возьмем простейший веб-сервер в вакууме. Нам нужно открыть порты 22, 80, 443 для доступа извне. Исходящие соединения разрешим все.Для сохранения конфигурации и загрузки правил мы будем использовать shell скрипт, указанный в rc.conf опцией firewall_script.
Фактически, этот shell скрипт содержит набор команд ipfw. Что позволяет использовать в написании конфигурации все преимущества shell. Особенно пригодятся переменные. К примеру:
Код:
# cat /etc/ipfw-conf.sh
#
ipfw -q -f flush # очистка всех правил -q подавляет вывод информации
# значения по умолчанию
eif="em0" # выходной интерфейс
edns="8.8.8.8" # IP адрес DNS
cmd="ipfw -q add " # команда
ks="keep-state" # опция, которая добавляет сохранение состояний
# разрешаем всё на локальной петле
$cmd 00010 allow all from any to any via lo0
# если состояние сохрано, пропускаем
$cmd 00020 check-state
# запрещаем неизвестные фрагментированные пакеты
$cmd 00030 deny all from any to any frag
# запрешаем все tcp ack, не проходящие по динамическим правилам
# то есть если не было SYN, ACK не будет принят.
$cmd 00040 deny tcp from any to any established in via $eif
#разрешаем входящие на порты веб-сервера
$cmd 000100 allow tcp from any to me 80 in via $eif $ks
$cmd 000110 allow tcp from any to me 443 in via $eif $ks
#разрешаем входящие на порт ssh
$cmd 000120 allow tcp from any to me 22 in via $eif $ks
#разрешаем исходящие соединения
$cmd 000900 allow all from me to any out via $eif $ks
#остальное логгируем и запрещаем
$cmd 001000 deny log all from any to any
При запуске файрвола будет выполнен этот скрипт, и соответствующие правила будут загружены.