Настройка файрвола IPFW в FreeBSD 14.1
Сервер FreeBSD должен быть защищён от внешних сетевых атак, в качестве межсетевого экрана (firewall) будет использоватся IPFW. Файрвол IPFW уже встроен в операционную систему FreeBSD, и он позволяет фильтровать, перенаправлять, логировать входящий и исходящий трафик по протоколам, IP адресам и портам. В статье будет показана базовая настройка и конфигурация Firewall IPFW.
1. Включение IPFW
Открываем файл /etc/rc.conf
nano /etc/rc.conf
Добавляем строки:
firewall_enable="YES" # Включить IPFW
firewall_script="/etc/ipfw.rules" # Файл с правилами IPFW
Добавляем следующую строку, если необходимо логировать какие-то правила. Запись событий будет происходить в лог-файл /var/log/security журнала безопасности.
firewall_logging="YES"
В результате фрагмент файла rc.conf с параметрами сетевой карты и включенным файрволом должен выглядеть следующим образом
По умолчанию в IPFW весь трафик запрещен, поэтому при его запуске или после перезагрузки, без настройки файла правил, будет невозможно подключится через SSH.
Настраиваем файл правил IPFW до его запуска или временно изменяем поведение IPFW на “разрешить все по умолчанию”.
Для этого в файл /boot/loader.conf добавляем строку
net.inet.ip.fw.default_to_accept="1"
Теперь по умолчанию последнее правило IPFW будет разрешать любой трафик на всех сетевых картах. После завершения настройки рекомендую убрать добавленную строку.
2. Синтаксис правил IPFW
Правила IPFW имеют примерно следующий синтаксис:
add <номер правила> [allow/deny] [ip/tcp/udp/…] from [any/me/<IP-адрес>] <порт> to [any/me/<IP-адрес>] <порт> {Опции}
Работу правила лучше объяснить на примере, например открываем 80 порт для веб-сервера
add 00400 allow tcp from any to me 80 in via em0 setup keep-state
Добавляется правило с номером 00400 (необязательный параметр) которое разрешает TCP пакеты с любого IP адреса до IP адреса сервера с 80 портом входящие через сетевую карту em0 и устанавливаются опции setup и keep-state. Опция setup сопоставляет TCP-пакеты, у которых установлен бит SYN, но отсутствует бит ACK, keep-state создает динамическое правило двунаправленного трафика.
3. Конфигурации и настройки IPFW
Создаем файл конфигурации /etc/ipfw.rules
nano /etc/ipfw.rules
Чем меньше правил, тем выше производительность IPFW. Объединяй по возможности несколько правил в одно.
3.1. Основная конфигурация с открытыми портами веб-сервера и SSH
Файл конфигурации IPFW в базовой настройке с использованием динамических правил:
#!/bin/sh
# Очищаем список правил IPFW
ipfw -q -f flush
# Команда добавления правила, -q — режим без вывода сообщений
cmd="ipfw -q add"
# Переменная для сетевой карты интернета
net="em0"
# Разрешить любой трафик внутри loopback интерфейса
$cmd 00010 allow all from any to any via lo0
# Запретить любой трафик извне до локальных адресов
$cmd 00011 deny ip from any to 127.0.0.0/8
$cmd 00012 deny ip from 127.0.0.0/8 to any
# Разрешить трафик динамических правил создаваемых при помощи keep-state
$cmd 00100 check-state
# Запретить прием неизвестных фрагментированных пакетов
$cmd 00110 deny all from any to any frag in via $net
# Запретить пакеты ACK, которые не соответствуют таблице динамических правил
$cmd 00120 deny tcp from any to any established in via $net
# Разрешить доступ к SSH серверу по 22 порту
$cmd 00510 allow tcp from any to me 22 in via $net setup keep-state
# Разрешить доступ к веб-серверу по 80 и 443 портам (HTTP/HTTPS)
$cmd 00520 allow tcp from any to me 80,443 in via $net setup keep-state
# Разрешить ходить серверу в любое место
$cmd 00900 allow ip from me to any out via $net keep-state
При данной конфигурации основное получается следующее:
- разрешены входящие TCP пакеты на 22 порт (SSH), а для “исходящих пакетов” от SSH создаются динамические правила;
- разрешены входящие TCP пакеты на 80, 443 портах (Веб-Сервер), а для “исходящих пакетов” от веб-сервера создаются динамические правила;
- разрешен любой исходящий трафик с сервера, для двунаправленного трафика создается динамическое правило;
- весь остальной трафик запрещен, если не установлена net.inet.ip.fw.default_to_accept="1" переменная.
3.2. Расширенная конфигурация с усилением безопасности основной
Файл конфигурации IPFW с усиленной безопасностью, ограничением количества динамических правил и логированием запрещенного исходящего трафика:
#!/bin/sh
# Очищаем список правил IPFW
ipfw -q -f flush
# Команда добавления правила, -q — режим без вывода сообщений
cmd="ipfw -q add"
# Переменная для сетевой карты интернета
net="em0"
# Разрешить любой трафик внутри loopback интерфейса
$cmd 00010 allow all from any to any via lo0
# Запретить любой трафик извне до локальных адресов
$cmd 00011 deny ip from any to 127.0.0.0/8
$cmd 00012 deny ip from 127.0.0.0/8 to any
# Разрешить трафик динамических правил создаваемых при помощи keep-state
$cmd 00100 check-state
# Запретить прием неизвестных фрагментированных пакетов
$cmd 00110 deny all from any to any frag in via $net
# Запретить пакеты ACK, которые не соответствуют таблице динамических правил
$cmd 00120 deny tcp from any to any established in via $net
### Разрешение входящих подключений из интернета:
# Разрешить доступ к SSH серверу по 22 порту
$cmd 00510 allow tcp from any to me 22 in via $net setup keep-state
# Разрешить доступ к веб-серверу по 80 и 443 портам (HTTP/HTTPS) с ограничением
# количества динамических правил для одного IP-адреса с одинаковым набором параметров
$cmd 00520 allow tcp from any to me 80,443 in via $net setup limit src-addr 10
### Разрешение исходящего трафика только в определенные места:
# Разрешить серверу ходить до DNS серверов
$cmd 00910 allow udp from me to any 53 out via $net keep-state
$cmd 00915 allow tcp from me to any 53 out via $net setup keep-state
# Можно указать конкретный DNS сервер, например 1.1.1.1
#$cmd 00910 allow udp from me to 1.1.1.1 53 out via $net keep-state
# Разрешить синхронизацию времени с сервером NTP
$cmd 00920 allow udp from me to any 123 out via $net keep-state
# Разрешить пинг исходящий с сервера
$cmd 00940 allow icmp from me to any out via $net keep-state
# Разрешить серверу ходить на веб-сайты
$cmd 00950 allow tcp from me to any 80,443 out via $net setup keep-state
# Или можно указать конкретные IP-адреса веб-сайтов, например:
# сайты для обновления FreeBSD, пакетов и так далее...
# Запретить и записать в лог-файл остальной исходящий трафик
$cmd 00999 deny log ip from me to any out via $net
В данной конфигурации для входящих подключений из интернета получается:
- разрешены входящие TCP пакеты на 22 порт (SSH), а для “исходящих пакетов” от SSH создаются динамические правила;
- разрешены входящие TCP пакеты на 80, 443 портах, а для “исходящих пакетов” от веб-сервера создаются динамические правила, но с ограничением на количество “подключений с одного IP-адреса” равное 10 (это защитит от атак переполнения динамических правил);
Для исходящих подключений с сервера получается:
- разрешен исходящий трафик с сервера только до серверов DNS, NTP, HTTP, HTTPS и отправлять ping, для двунаправленного трафика создается динамическое правило;
- запрещен остальной исходящий трафик с сервера и он заносится в лог-файл /var/log/security журнала безопасности.
Идея такой настройки заключается в следующем: необходимо разрешить только избранные IP-адреса веб-сайтов, тогда если на сервер попадет какое-то вредоносное ПО по сбору данных, спам рассылками и аналогичное, то когда будет попытка передачи, трафик будет заблокирован с внесением соответствующей записи в лог. Это не защитит от целенаправленно не автоматического способа передачи информации, так как передать трафик можно по DNS порту или аналогичному который не запрещен правилами файрвола.
3.3. Конфигурация без создания динамических правил для входящих соединений
Чтобы не нагружать файрвол созданием динамических правил для входящего трафика, можно изменить конфигурацию на работу со статическими правилами.
На пример, доступ к веб-серверу с использованием динамических правил выглядит следующим образом:
ipfw add allow tcp from any to me 80,443 in via em0 setup keep-state
Без динамических правил доступ к веб-серверу будет выглядеть следующим образом:
ipfw add allow tcp from any to me 80,443 in via em0
ipfw add allow tcp from me 80,443 to any out via em0
Обязательно необходимо убрать или перенести ниже строку запрета пакетов ACK, иначе входящие TCP пакеты установленного соединения HTTP, HTTPS будет заблокированы.
Я не тестировал и не знаю насколько статические правила будут эффективнее динамических . По логике, если большой трафик на веб-сервер, то статические правила уменьшат нагрузку на сервер. Во всех примерах и документациях из интернета используются динамические правила создаваемые keep-state опцией.
Файл конфигурации IPFW без использования динамических правил для входящих соединений:
#!/bin/sh
# Очищаем список правил IPFW
ipfw -q -f flush
# Команда добавления правила, -q — режим без вывода сообщений
cmd="ipfw -q add"
# Переменная для сетевой карты интернета
net="em0"
# Разрешить любой трафик внутри loopback интерфейса
$cmd 00010 allow all from any to any via lo0
# Запретить любой трафик извне до локальных адресов
$cmd 00011 deny ip from any to 127.0.0.0/8
$cmd 00012 deny ip from 127.0.0.0/8 to any
# Запретить прием неизвестных фрагментированных пакетов
$cmd 00050 deny all from any to any frag in via $net
# Разрешить доступ к SSH серверу по 22 порту
$cmd 00100 allow tcp from any to me 22 in via $net
$cmd 00101 allow tcp from me 22 to any out via $net
# Разрешить доступ к веб-серверу по 80 и 443 портам (HTTP/HTTPS)
$cmd 00200 allow tcp from any to me 80,443 in via $net
$cmd 00201 allow tcp from me 80,443 to any out via $net
# Разрешить трафик динамических правил создаваемых для исходящих подключений
$cmd 00400 check-state
# Запретить пакеты ACK, которые не соответствуют таблице динамических правил
$cmd 00410 deny tcp from any to any established in via $net
# Разрешить ходить серверу в любое место
$cmd 00500 allow ip from me to any out via $net keep-state
4. Запуск и перезапуск IPFW
Будь внимателен. Если есть ошибка или неточность в правилах, можно потерять доступ по SSH.
Запускаем службу IPFW
service ipfw start
Когда будут внесены какие-то изменения в файл с правилами межсетевого экрана и маршрутизации, необходимо перезапустить IPFW.
Перезапускаем службу IPFW
service ipfw restart
5. Команды IPFW
Вывести статистику по работе правил IPFW
ipfw -a -d -t list
- -a — количество совпавших пакетов и переданных байт;
- -d — вывести динамические правила;
- -t — время когда сработало правило последний раз;
- -e — динамические правила с истекшим сроком действия.
Удалить правило с указанным номером, например 00500
ipfw delete 00500