Freebsd 12 firewall настройка
В прошлой статье мы разобрали, что такое вообще PF, его основные возможности и создали простенький конфиг, использующий правила фильтрации и макросы. Сегодня разберемся с метками и научимся более продвинуто фильтровать трафик по различным условиям. Спасибо пользователям, комментировавшим предыдущую статью, за проявленный интерес.
В этот раз попробуем различные варианты более продвинутой фильтрации:
- Макросы в различных местах конфигурационного файла.
- Списки — набор параметров. PF раскроет его в отдельные правила.
- Правила, ограничивающие количество подключений с одного IP, их частоту.
- Таблицы. Это список IP адресов с которыми может сравнивать правило. Возможные варианты динамического заполнения. И проверку состояния наших таблиц.
Задача будет такая:
- Разрешить доступ с доверенных IP на любой порт
- Создать ban-list с загрузкой из файла
- Разрешить доступ с crm и api нашей компании на порт 8080 и 8443
- Разрешить исходящий доступ по порам 80 и 443 к CRM и API
- Создать простейшую защиту от брут-форса на порту 22 с внесением хостов в бан-лист на час
- Создать простейшую защиту от DDOS и DOS на портах 80 и 443, с внесением хостов в другой бан-лист
Таблицы
Таблицы — это одно из мощнейших средств PF. После создания в конфиге, с ними можно творить всё, что угодно. Загружать из файла, чистить, очищать от записей, старее заданного срока, ну и, конечно, добавлять и удалять записи. И всё это на лету без перезагрузки конфигурации файрвола.
Таблицы могут быть нескольких видов:
- const — этот флаг указывает на неизменность таблицы. Пользователь не может добавлять и удалять IP "на лету"
- counters — включает ведение статистики по каждому IP в таблице
- persist — указывает ядру хранить таблицу, даже если в ней нет записей
В этой статье будут показаны примеры таблиц без флагов и с флагом persist. Остальные флаги интуитивно поняты и используются куда реже.
Для использования в правиле файрвола:
Это правило разрешит всё, что приходит от IP адресов, перечисленных в таблице, на сетевой интерфейс и IP сервера.
Таблица с загрузкой из файла:
Используем в правиле:
Правило заблокирует любой трафик от на интерфейсе $If
Сама таблица будет иметь следующий вид:
Можно указать знак отрицания для исключения из таблицы. В данном случае будет соответствие IP 1.1.1.1, и сети 111.12.46.0/24, кроме IP 111.12.46.17. Наполнением этого файла можно заниматься вручную. Затем загрузить таблицу из файла снова:
В таблицу можно добавлять как IP адреса, так и доменные имена. Доменные имена разрешатся при загрузке. Для обновления адресов можно поставить загрузку таблицы в cron каждый час, к примеру. Однако, если хотя бы один адрес разрешить не удастся, обновление таблицы не удастся:
После загрузки можно посмотреть, что содержится в таблице:
Можно удобным образом добавить/удалить записи:
Конечно, эти записи не попадут магически в файл, и после перезагрузки таблицы их не будет.
Важно помнить о возможности проверки соответствия IP таблице. Можно проверить и доменное имя.
Задания в cron для обновления:
Таблицу, загружаемую из файла, со списком хостов:
Для примера, в таблице будет один хост:
И собственно правила:
Заключение
Мы рассмотрели возможности PF в части фильтрации входящего и исходящего трафика. Познакомились с макросами и таблицами. И создали неплохой конфигурационный файл для файрвола, который способен отразить большинство типовых атак на сервер. Описанные технологии наша команда использует для создания шлюза Интернет Контроль Сервер. Протестировать ИКС можно в течение 35 дней или бесплатно использовать версию до 9 пользователей.
Ну а в следующей статье познакомимся с якорями, метками и трансляцией адресов (NAT). Как и прежде, будем рады вашим комментариям и пожеланиям!
После начальной настройки сервера настоятельно рекомендуется выполнить некоторые дополнительные действия. Это руководство охватывает рекомендуемые, но необязательные конфигурации, среди которых:
- Создание простого брандмауэра, который блокирует большую часть трафика.
- Настройка часового пояса.
- NTP-синхронизация времени.
- Добавление swap-пространства (или пространства подкачки).
Прежде чем приступить к выполнению руководства, нужно настроить среду оболочки сервера FreeBSD, что подробно описано в руководстве «Начало работы с FreeBSD 10.1».
Настройка базового брандмауэра
Большая часть конфигурации этого брандмауэра находится в файле /etc/rc.conf. Для редактирования конфигурации нужно использовать команду sysrc, которая позволяет безопасно вносить изменения /etc/rc.conf. В этот файл нужно добавить несколько строк, чтобы включить брандмауэр ipfw и контролировать его работу. Начнем с основных правил; выполните следующую команду, чтобы приступить к работе:
sudo sysrc firewall_enable="YES"
Каждый раз, когда вы запускаете sysrc для редактирования конфигураций, команда отображает ваши изменения:
firewall_enable: NO -> YES
Первая команда включает брандмауэр ipfw, добавляет его в автозагрузку и позволяет запускать его с помощью обычных команд service.
sudo sysrc firewall_quiet="YES"
Эта строка отключает автоматический вывод ipfw. Вам эта опция может показаться вопросом предпочтений или требований сервера, но на самом деле она существенно влияет на работу брандмауэра.
Эта опция важна по двум факторам. Во-первых, скрипт конфигурации брандмауэра выполняется в текущей среде оболочки, не в фоновом режиме. Во-вторых, когда команда ipfw читает конфигурационный скрипт без флага quiet, она выводит каждую прочитанную строку на стандартный вывод. После вывода строки ipfw сразу же выполняет связанное с ней действие.
Большинство конфигурационных файлов брандмауэра сбрасывают текущие правила в начало скрипта. Если ipfw находит подобные строки без флага quiet, он немедленно сбрасывает все правила и возвращается к политике по умолчанию, которая в большинстве случаев блокирует все соединения. Если брандмауэр настраивается по SSH, соединение будет прервано, текущий сеанс закроется и брандмауэр перестанет обрабатывать правила, открывающие вам доступ к серверу – то есть вы заблокируете себя на собственном сервере. Флаг quiet помогает брандмауэру воспринимать и обрабатывать правила как набор, а не как отдельные, несвязанные правила.
После этих двух строк нужно добавить строки, управляющие поведением брандмауэра. Установите “workstation” в качестве типа брандмауэра:
sudo sysrc firewall_type="workstation"
Теперь брандмауэр настроен для защиты сервера с помощью stateful правил (с отслеживанием состояния соединений). Stateful брандмауэр отслеживает состояние сетевых подключений во времени и сохраняет информацию об этих подключениях в памяти в течение короткого интервала. В результате можно не только определить правила для поддержки конкретных соединений, но и использовать данные о предыдущих соединениях, которые получил брандмауэр, для оценки того, какие соединения можно установить.
Файл /etc/rc.conf также позволяет настраивать сервисы, доступ к которым необходим клиентам. Для этого нужны параметры firewall_myservices и firewall_allowservices.
sudo sysrc firewall_myservices="22/tcp 80/tcp 443/tcp"
Опция firewall_myservices содержит набор TCP-портов или сервисов (через пробел), которые должны быть доступны на вашем сервере.
Примечание: Сервисы можно указывать по имени. Все сервисы, чьи имена известны системе FreeBSD, перечислены в файле /etc/services. К примеру, показанную выше конфигурацию можно также задать следующим образом (результат будет таким же):
firewall_myservices="ssh http https"
Опция firewall_allowservices содержит список элементов, которые должны иметь доступ к перечисленным сервисам. Так вы можете ограничить доступ к вашим сервисам (из firewall_myservices) до определенных машин или диапазонов сети. Например, с помощью этой опции вы могли бы разместить на компьютере веб-контент для внутренней сети компании. Ключевое слово any значит, что доступ есть у всех IP-адресов.
sudo sysrc firewall_allowservices="any"
Опция firewall_logdeny вносит в лог /var/log/security все неудачные попытки доступа. Запустите:
sudo sysrc firewall_logdeny="YES"
Чтобы проверить все внесенные изменения, введите команду:
grep 'firewall' /etc/rc.conf
Эта часть файла /etc/rc.conf будет выглядеть так:
firewall_enable="YES"
firewall_quiet="YES"
firewall_type="workstation"
firewall_myservices="22 80 443"
firewall_allowservices="any"
firewall_logdeny="YES"
Примечание: Не забудьте отредактировать опцию firewall_myservices, добавив все сервисы, необходимые вашим клиентам.
Настройка часового пояса сервера
Правильно настроенный часовой пояс очень важен для производительности сервера и для настройки NTP-синхронизации (о которой речь пойдёт в следующем разделе).
Система FreeBSD поставляется с инструментом tzsetup, который отвечает за настройку часового пояса. Запустите с правами sudo следующую команду:
На экране появится окно меню, которое спросит, как настроены аппаратные часы, по Гринвичу (UTC)или по местному времени.
Is this machine’s CMOS clock set to UTC? If it is set to local time or you don’t know, please choose NO here!
Выберите «No». Затем программа предложит выбрать регион, в котором находится сервер.
Также нужно указать страну или субрегион.
В завершение выберите часовой пояс, в котором находится сервер. Подтвердите свой выбор.
Теперь сервер работает в указанном часовом поясе.
Настройка базового брандмауэра
Почти все конфигурации фаервола находятся в файле /etc/rc.conf. откройте этот файл:
sudo vi /etc/rc.conf
В этот файл нужно добавить код для включения и управления фаерволом ipfw. Добавьте несколько основных правил в конец файла:
Первая строка включает фаервол ipfw, отвечает за его автоматический запуск при загрузке системы и позволяет запускать его при помощи команды service.
Вторая строка отключает автоматический вывод ipfw. Это может сначала показаться вопросом предпочтений или требований сервера, но на самом деле это существенно влияет на функциональность брандмауэра.
Эта опция важна по двум факторам. Во-первых, сценарий конфигурации фаервола выполняется в текущей среде оболочки, не в фоновом режиме. Во-вторых, когда команда ipfw читает конфигурационный скрипт без флага quiet, она выводит каждую прочитанную строку в standard out. Выведя строку, ipfw сразу же выполняет соответствующее действие.
Большинство конфигурационных файлов брандмауэра сбрасывают текущие правила в начало сценария. Если фаервол ipfw находит такие строки без флага quiet, он немедленно сбрасывает все правила и возвращается к политике по умолчанию, которая, как правило, блокирует все соединения. Если брандмауэр настроен по SSH, соединение будет прервано, текущий сеанс оболочки закроется, и фаервол перестанет обрабатывать правила, открывающие вам доступ на сервер, то есть, вы будете заблокированы на собственном сервере. Флаг quiet помогает брандмауэру воспринимать и обрабатывать правила как набор (не как отдельные, несвязанные правила).
Затем нужно добавить строки, управляющие поведением фаервола:
. . .
firewall_type="workstation"
firewall_myservices="22 80"
firewall_allowservices="any"
firewall_logdeny="YES"
Первая строка задаёт workstation как тип фаервола (это довольно надёжное стандартное поведение). Опции firewall_myservices и firewall_allowservices позволяют без труда выбрать и настроить сервисы, доступ к которым необходим клиентам. Последняя опция вносит в логи все соединения, не прошедшие фаервол.
Опция firewall_allowservices содержит список компонентов и клиентов, которые должны иметь доступ к перечисленным ранее портам и сервисам. Ключевое слово any значит, что доступ есть у всех клиентов. При помощи этой опции можно также заблокировать доступ некоторым клиентам.
Опция firewall_logdeny вносит в лог /var/log/security все неудачные попытки доступа.
Итак, полностью код, который нужно добавить в /etc/rc.conf, имеет следующий вид:
. . .
firewall_enable="YES"
firewall_quiet="YES"
firewall_type="workstation"
firewall_myservices="22 80"
firewall_allowservices="any"
firewall_logdeny="YES"
Примечание: Не забудьте отредактировать опцию firewall_myservices, добавив все сервисы, необходимые вашим клиентам.
Сохраните и закройте файл.
Дополнительные параметры фильтрации
Теперь задача интереснее. Необходимо защитить наш сервер от перебора паролей ssh. Еще одна возможность PF — лимитировать количество соединений, соответствующих правилу, по различным параметрам.
persist — держать в памяти, даже если пустая. Если не указать такое поведение, PF удалит пустую таблицу.
В данном случае max-src-conn 10 — только 10 одновременных соединений с одного адреса, max-src-conn-rate 3/10 — только 3 новых соединения за 10 секунд, overload — добавлять в таблицу адреса источника нарушителей, flush — сбрасывать все соединения от нарушителя, созданные этим правилом.
По образу и подобию — разрешение пользователю ходить на веб-сервер.
Параметры этого правила надо очень аккуратно подбирать под ваш сервис. Synproxy — включает проксирование syn запросов, защиту от synflood атак. А flush global означает сброс всех соединений с источника-нарушителя, даже если они не относятся к этому правилу.
Устаревание записей в таблицах заблокированных обеспечиваются командами такого вида:
Эта команда удалит все записи, старше часа из соответствующей таблицы. Команды поставим в крон:
Таким образом каждый час таблицы будут вычищаться.
Заключение
Теперь сервер FreeBSD надежно настроен, дальнейшие конфигурации зависят только от целей использования сервера. Фаервол, NTP-синхронизация и swap-пространство предоставляют более подготовленную к разработке среду, а также упрощают дальнейшую установку и настройку программ и сервисов.
После начальной настройки сервера мы рекомендуем вам выполнить некоторые дополнительные действия. Этот мануал охватывает некоторые примеры опциональных, но очень полезных конфигураций, среди которых:
- настройка брандмауэра IPFW для блокировки большей части трафика.
- настройка часового пояса сервера (это очень важно для правильной работы ваших программ).
- NTP-синхронизация времени.
- Создание swap-пространства (или подкачки).
Прежде чем приступить к выполнению мануала, нужно настроить среду сервера FreeBSD. Этот этап подробно описан в мануале Начало работы с FreeBSD.
Настройка NTP-синхронизации
Теперь часовой пояс настроен. После этого на сервере нужно настроить NTP (Network Time Protocol).Этот протокол позволяет синхронизировать внутренние часы сервера. Это очень важно для поддержки чувствительных ко времени взаимодействий клиентов и серверов, а также для точного журналирования.
Чтобы включить NTP, нужно отредактировать файл /etc/rc.conf.
sudo vi /etc/rc.conf
Добавьте в файл строку:
Также нужно добавить в него строку для синхронизации часов с серверами NTP при загрузке системы. Это позволит свести к минимуму влияние дрейфа.
Без этой троки демон NTP не сможет запуститься, поскольку настройки часового пояса исказят время системы.
Сохраните и закройте файл.
Запустите сервис ntpd:
sudo service ntpd start
Этот сервис будет синхронизировать часы сервера с серверами NTP, перечисленными в /etc/ntp.conf.
Соединения UDP
Все перечисленные в firewall_myservices порты и сервисы доступны для соединений TCP. Если некоторые сервисы используют порты UDP, отредактируйте файл /etc/rc.firewall.
sudo vi /etc/rc.firewall
Ранее был настроен тип фаервола – workstation. Найдите в файле следующее:
В этом блоке есть раздел, обрабатывающий значения firewall_allowservices и firewall_myservices. Он выглядит так:
for i in $ ; do
for j in $ ; do
$ add pass tcp from $i to me $j
done
done
После этого раздела нужно указать все сервисы и порты, поддерживающие UDP-пакеты.
$ add pass udp from any to me port_num
В этой строке также можно использовать ключевое слово any, если соединение должно быть доступно всем клиентам; чтобы ограничиться отдельными клиентами, нужно указать IP-адрес или сетевой диапазон. Также в приведённой выше строке нужно заменить port_num номером порта или сервисом, которые должны поддерживать соединения UDP. К примеру, при наличии DNS-сервера можно добавить:
for i in $ ; do
for j in $ ; do
$ add pass tcp from $i to me $j
done
done
$ add pass udp from 192.168.2.0/24 to me 53
Это разрешит любому клиенту из диапазона 192.168.2.0/24 получить доступ к DNS-серверу на порте 53. Обратите внимание, что в таком случае нужно также открыть этот порт для подключений TCP.
Сохраните и закройте файл.
1: Настройка брандмауэра IPFW
Сначала нужно настроить простой брандмауэр для защиты сервера от вредоносного трафика.
Система FreeBSD поставляется со встроенной поддержкой трёх отдельных брандмауэров, каждый из которых имеет свои преимущества и недостатки: это pf, ipfw и ipfilter. Здесь мы рассмотрим настройку самого простого и быстрого из них – ipfw. Это надежный stateful брандмауэр, написанный и поддерживаемый как часть FreeBSD.
Управление и полезные настройки
Для включения ipfw в rc.conf необходимо добавить следующие строки:
ipfw с пустой конфигурацией по умолчанию блокирует все соединения. Чтобы не потерять доступ к серверу дополнительно нужно добавить в rc.conf
Эта строка укажет ipfw добавить в конфигурацию строку
Добавление правил происходит командой
Добавить простое правило, под номером 100, разрешающее весь трафик на всех интерфейсах
2: Настройка часового пояса сервера
Часовой пояс очень сильно влияет на производительность сервера, потому важно, чтобы он был настроен правильно. Это также нужно и для настройки NTP-синхронизации (о ней речь пойдёт в следующем разделе).
FreeBSD поставляется с инструментом tzsetup, который отвечает за настройку часового пояса. Запустите эту команду с правами sudo:
На экране появится окно, которое предложит выбрать регион, в котором находится сервер.
Затем нужно указать страну или субрегион.
Примечание: Для навигации по меню используйте клавиши PAGE UP и PAGE DOWN. Если у вас на клавиатуре их нет, вы можете использовать FN+DOWN или FN+UP.
Затем выберите часовой пояс, в котором находится сервер. Подтвердите свой выбор.
Теперь сервер работает в выбранном часовом поясе.
3: Настройка NTP-синхронизации
Теперь на сервере настроен часовой пояс. После этого нужно настроить NTP (Network Time Protocol). Этот протокол позволяет синхронизировать внутренние часы сервера с всемирным временем. Это очень важно для поддержки чувствительных ко времени взаимодействий клиентов и серверов, а также для точного логирования.
Чтобы включить NTP, нужно отредактировать /etc/rc.conf. Запустите следующую команду, чтобы добавить нужную настройку в файл:
sudo sysrc ntpd_enable="YES"
Также нужно добавить в него строку для синхронизации часов с удаленными NTP-серверами при загрузке системы. Это позволяет серверу превышать нормальный предел дрейфа при инициализации. Скорее всего, ваш сервер будет вне предела дрейфа при загрузке, потому что ваш часовой пояс применяется до запуска демона NTP, что сместит системное время.
sudo sysrc ntpd_sync_on_start="YES"
Без этой строки NTP не сможет запуститься, поскольку настройки часового пояса исказят системное время.
Сохраните и закройте файл.
Запустите сервис ntpd:
sudo service ntpd start
Этот сервис будет синхронизировать время сервера с серверами NTP, перечисленными в файле /etc/ntp.conf.
Запуск фаервола
Завершив настройку, запустите брандмауэр:
sudo service ipfw start
Теперь брандмауэр должен блокировать нежелательный трафик согласно ранее заданным настройкам, также он запускаться автоматически при каждой загрузке системы.
Также нужно настроить количество записей в логе для одного IP. Это позволит предотвратить переполнение логов одним IP-адресом. Для этого откройте файл /etc/sysctl.conf:
sudo vi /etc/sysctl.conf
В конец файла внесите следующую строку, которая ограничит количество записей до 5:
Сохраните и закройте файл. Данная настройка активируется после следующей перезагрузки.
Чтобы применить эту настройку в текущей сессии, используйте команду sysctl без аргументов.
sudo sysctl net.inet.ip.fw.verbose_limit=5
Такая команда применит данную настройку в текущей сессии.
Настройка swap-пространства
Чтобы проверить, есть ли на сервере swap-пространство, введите:
sudo swapinfo -g
Вывод может выглядеть так:
Device 1G-blocks Used Avail Capacity
/dev/gpt/swapfs 1 0 1 0%
Но некоторые приложения требуют большего объёма swap-пространства. Для этого используется swap-файл.
Сначала нужно выделить участок памяти для swap. Для этого используйте команду truncate.
В этом руководстве swap-файл будет находиться в /swapfile; укажите своё место для этого файла в системе. Этот swap-файл будет предоставлять 1 гигабайт для подкачки; чтобы задать другой объём памяти, отредактируйте значение флага –s.
sudo truncate -s 1G /swapfile
Выделив пространство, запретите доступ к файлу.
sudo chmod 0600 /swapfile
Затем смонтируйте файл и настройте его автоматическое монтирование при загрузке:
sudo sh -c 'echo "md99 none swap sw,file=/swapfile,late 0 0" >> /etc/fstab'
Эта команда добавит в файл /etc/fstab следующую строку:
md99 none swap sw,file=/swapfile,late 0 0
После этого включите swap-файл при помощи команды:
sudo swapon -aqL
Убедитесь, что swap-файл работает, запустив команду:
sudo swapinfo -g
Вывод будет выглядеть примерно так:
Device 1G-blocks Used Avail Capacity
/dev/gpt/swapfs 1 0 1 0%
/dev/md99 1 0 1 0%
Total 2 0 2 0%
Этот файл будет автоматически монтироваться при запуске системы.
Итоговая конфигурация
Не забывайте комментировать ваш конфигурационный файл, и он всегда будет радовать взгляд.
Макросы и списки
С макросами всё относительно просто. Это вставка куска строки в нужное (практически любое) место конфигурационного файла. В макросе можно держать имя интерфейса, IP адрес (или адреса), опции tcp, и так далее. IP адреса и имена интерфейса взяты из головы, все совпадения случайны.
После этого можно использовать их в правилах подобного вида:
После загрузки правила будут выглядеть так:
Как видим, был подставлен интерфейс и порты из макроса. Затем, для каждого порта было создано отдельное правило в соответствии со списком. Были установлены значения по умолчанию. flags это tcp флаги, установленные у пакета для соответствия правилу. S/SA — это пакеты с установленным флагом SYN. То есть, если упростить, первый пакет сессии.
Keep state — означает сохранение соединения в таблице состояний или сессий. Это означает, что только первый пакет из соединения пробежит по правилам файрвола. Все остальные пакеты этого соединения файрволл пропустит при соответствии таблице состояний (state table), не проводя проверок.
Важно для оптимизации конфига помнить опцию quick. Она указывает файрволу прекратить дальнейшую обработку этого пакета, и сразу применить текущее действие. К примеру:
Запуск брандмауэра
Завершив настройку, запустите брандмауэр:
sudo service ipfw start
Теперь брандмауэр будет блокировать нежелательный трафик согласно ранее заданным правилам, также он будет запускаться автоматически при каждой загрузке системы.
Теперь нужно настроить количество записей в логе для одного IP. Это предотвратит переполнение логов одним IP-адресом. Откройте файл /etc/sysctl.conf:
sudo vi /etc/sysctl.conf
В конец файла поместите следующую строку, которая ограничит количество записей до 5:
Сохраните и закройте файл. Данная настройка активируется после перезагрузки.
Чтобы применить эту настройку в текущей сессии, используйте команду sysctl без аргументов.
sudo sysctl net.inet.ip.fw.verbose_limit=5
Эта команда применит настройку в текущей сессии.
Заключение
Теперь ваш сервер FreeBSD готов к работе, дальнейшие конфигурации зависят только от целей использования сервера. Брандмауэр, NTP-синхронизация и swap-пространство предоставляют более подготовленную к разработке среду, а также упрощают дальнейшую установку и настройку программ и сервисов.
Привет всем, кому интересна ОС FreeBSD! После летне-отпускного отсутствия начинаю новый цикл статей. Надеюсь, будет занимательно и полезно.
Для тех, кто тут впервые, поясню, что являюсь разработчиком российского Интернет-шлюза Интернет Контроль Сервер, реализованного на базе FreeBSD. А потому, изнанка этой операционки, ее фишки и тонкости администрирования - то, с чем я сталкиваюсь ежедневно и делюсь с вами.
В предыдущей серии статей мы рассмотрели файрвол PF. Оценили возможности и настроили его для разных ролей. В новом цикле сделаем то же для файрвола IPFW. Как и с PF, начнем с краткого обзора и создания простой конфигурации для защиты веб сервера. В следующий статьях будем погружаться и усложнять конфигурацию постепенно, вводя новые типы правил и добавляя "мяса".
Ipfirewall - open source модуль, портированный на многие ОС. В этом списке FreeBSD, NetBSD, OpenBSD, SunOS, HP/UX и Solaris, Mac OS и даже Windows. Кроме того, часто используется для различных встраиваемых систем. Впервые появился в FreeBSD версии 2.0.
обработчик правил на уровне ядра, включающий систему учета пакетов
ipstealth (механизм редактирования TTL полей, защита от traceroute)
основанные на ALTQ средства управления QoS
механизмы управления пропускной способностью
основанная на таблице маршрутов система анти-спуффинга
встроенный NAT, PAT и LSNAT
поддержка IPv6 (с некоторыми ограничениями)
ipfw - пользовательская утилита для управления ipfirewall. С помощью этой утилиты происходит взаимодействие с модулем ядра. В дальнейшем я буду использовать ipfw и как имя утилиты, и как сокращение названия ipfirewall, для краткости и простоты, ну и просто потому, что так принято на просторах Интернета.
В ipfw конфигурация состоит из пронумерованных правил. Пакет проходит по правилам, начиная с меньшего номера к большему, до первого действия (к примеру allow или deny), после чего обработка прекращается. Чем-то похоже на iptables в Linux.
Поддержка соединений UDP (опционально)
Все порты и сервисы, перечисленные в firewall_myservices в файле /etc/rc.conf, доступны для соединений TCP. Если некоторые сервисы должны работать по UDP, отредактируйте файл /etc/rc.firewall.
sudo vi /etc/rc.firewall
Ранее мы настроили тип брандмауэра – “workstation”. Найдите в файле следующий раздел:
В этом блоке есть раздел, обрабатывающий установленные значения firewall_allowservices и firewall_myservices . Он выглядит так:
for i in $ ; do
for j in $ ; do
$ add pass tcp from $i to me $j
done
done
После этого раздела нужно указать все сервисы и порты, поддерживающие UDP.
$ add pass udp from any to me port_num
В редакторе vi нужно нажать i, чтобы перейти в режим INSERT и вставить свой код. Затем сохраните и закройте файл, для этого нажмите Esc, введите :wq и нажмите Enter. В строке выше вы можете оставить ключевое слово any, если соединение должно быть доступно для всех клиентов. Если нет, вы можете заменить его определенным IP-адресом или диапазоном сети. port_num нужно заменить номером порта или именем сервиса, которые должны поддерживать соединения UDP. Например, если вы используете DNS-сервер, ваша запись будет выглядеть примерно так:
for i in $ ; do
for j in $ ; do
$ add pass tcp from $i to me $j
done
done
$ add pass udp from 192.168.2.0/24 to me 53
Это разрешит любому клиенту из диапазона 192.168.2.0/24 получить доступ к DNS-серверу по порту 53. Обратите внимание, в таком случае нужно также открыть этот порт для TCP подключений.
Сохраните и закройте файл.
Заключение
Мы разобрались с тем, что такое ipfw и запустили его. Рассмотрели простейшие правила фильтрации и научились с ними работать. А так же создали простую, но вполне рабочую конфигурацию файрвола, способную защитить наш сервер от угроз извне.
В следующей статье мы рассмотрим дополнительные опции фильтрации, усовершенствуем конфигурацию для защиты нашего веб-сервера. А пока у вас есть отличная возможность потестировать Интернет Контроль Сервер, тем более что полнофункциональная демо-версия доступна в течение 35 дней, а версия до 9 пользователей вообще бесплатная.
В Рунете есть множество статей о настройке FreeBSD и PF, но все они разрозненны и несистематичны. А за любыми более-менее интересными вещами, такими, как маршрутизация средствами файрвола (Policy Based Routing), приходится читать оригинальную документацию, например, OpenBSD PF FAQ. Однако, есть отличия в синтаксисе команд для FreeBSD и OpenBSD. В этом цикле статей мы пробуем систематизировать и разобрать возможности PF от простого к сложному. Наверняка, эта вводная статья будет похожа на все остальные статьи о Packet Filter. Поэтому тем, кто уже знаком с базовыми возможностями, будет не интересно. Однако, без вступления не обойтись, а мясо будет в следующих статьях.
PF — Packet Filter — это межсетевой экран, изначально созданный в рамках проекта OpenBSD. В 2003 году был портирован во FreeBSD. В 2004 году был интегрирован в основную систему. Основные возможности:
- Фильтрация на основе адресов, портов, протоколов, интерфейсов
- NAT — Source NAT, подмена адреса отправителя. Destination nat, подмена адреса получателя, проброс порта
- Scrub — нормализация сетевого трафика. Помогает от некоторых видов dos атак, основанных на формировании специально подготовленных пакетов
- SYN-proxy — Защита от SYN-flood атак
- Балансировка соединений
- Отказоустойчивость — pfcync позволяет синхронизировать состояние файрволов на нескольних хостах, что, в сочетании с протоколом CARP, позволяет создать отказоустойчивый файрвол, который продолжит обрабатывать соединения после падения активной ноды
- Прозрачный файрвол (Без собственного IP-адреса, включая фильтр 2 уровня)
- Макросы — аналог переменных
- Таблицы — динамически изменяемые без перезагрузки конфигурации списки IP адресов
- Метки — позволяет метить пакеты, если простой фильтрации недостаточно
- Якоря (anchors) — наборы правил, похожи на таблицы IPTables в Linux
- Сбор статистики и вывод графиков с помощью утилиты pfstat
- Автоматическая оптимизация правил при загрузке
Управление и полезные команды
Для включения PF достаточно в файле «/etc/rc.conf» указать опции:
Основные команды управления файрволом:
Структура файла конфигурации и базовые настройки
Файл конфигурации состоит из разделов:
- Макросы
- Таблицы
- Опции
- Правила нормализации трафика (scrub)
- Очереди, приоритезация и контроль скорости
- NAT трансляции адресов
- Фильтрация пакетов
action — что следует сделать с пакетом
direction — in out, направление
log — попадёт ли пакет в pflog
quick — если пакет попал под это правило, то дальнейшей обработки не будет. Это правило будет последним для пакета
interface — название сетевого интерфейса
af — address family, inet или inet6, IPv4 или IPv6 соответственно
protocol — протокол 4 уровня, к примеру: tcp, udp, icmp
scr_addr, dst_addr — адреса источника и назначения
src_port, dst_port — порты
tcp_flags — флаги tcp
state — опции сохранения состояния. Например, keep state будет означать, что соединение сохранится в таблице состояний, и ответные пакеты могут проходить. Поведение по умолчанию.
Затем вводим команду проверки синтаксиса:
pfctl -nf pf.conf
Для проверки посмотрим правила фильтрации:
Как видно, макросы развернулись в отдельные правила по каждому порту, порядок изменен автоматически. В остальном всё так, как нужно.
Мы разобрались, что такое Packet Filter, узнали его основные возможности. Разобрались в структуре конфигурации PF и её основных секциях. Создали самую простую конфигурацию, которая, однако вполне функциональна, включает макросы, нормализацию пакетов и фильтрацию входящих и исходящих пакетов. В следующей статье разберем более подробно правила фильтрации, управление состояниями и флаги.
Наше решение, Интернет Контроль Сервер – это шлюз безопасности, построенный на базе FreeBSD. Данная система была выбрана ввиду своей стабильности, скорости сетевого стэка, встроенной в ядро поддержки ZFS и отсутствия заморочек с лицензиями. Кроме того, работа с FreeBSD достаточно приятна, хоть и не во всем проста. Но мы будем рады делиться с вами этим опытом!
Простейшая конфигурация
Возьмем простейший веб-сервер в вакууме. Нам нужно открыть порты 22, 80, 443 для доступа извне. Исходящие соединения разрешим все.
Для сохранения конфигурации и загрузки правил мы будем использовать shell скрипт, указанный в rc.conf опцией firewall_script.
Фактически, этот shell скрипт содержит набор команд ipfw. Что позволяет использовать в написании конфигурации все преимущества shell. Особенно пригодятся переменные. К примеру:
При запуске файрвола будет выполнен этот скрипт, и соответствующие правила будут загружены.
Настройка брандмауэра IPFW
Сначала нужно настроить простой фаервол для защиты сервера от ненадёжного трафика.
Система FreeBSD поставляется с поддержкой трёх фаерволов, каждый из которых имеет свои преимущества и недостатки; это pf, ipfw и ipfilter. Данное руководство охватывает настройку самого простого и быстрого из них – ipfw.
Структура правил, основные параметры
Общая структура правила не отличается особой сложностью:
Номер - порядковый номер правила, предпочтительно в конфигурации использовать номера не подряд, это позволит без проблем добавлять правила во время работы файрвола. Возможно добавление нескольких правил под одним номером. В этом случае они будут срабатывать в порядке добавления и ipfw delete удалит их все.
Действие назначенное совпавшему пакету. В этой статье мы рассмотрим
Эти действия равнозначны. Пропустить пакет, обработка завершается. Я буду использовать allow, для единообразия.
Так же равнозначны. Отбросить пакет. Буду использовать deny
Проверяет пакет по таблице динамических правил (соединений), никаких дополнительных опций не предполагает.
Протокол - 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.
4: Настройка swap-пространства
Чтобы проверить, есть ли на вашем сервере swap, введите:
sudo swapinfo -g
Вывод может выглядеть так:
Device 1G-blocks Used Avail Capacity
/dev/gpt/swapfs 1 0 1 0%
На этом сервере есть 1 Гб swap. Но некоторые приложения требуют большего объёма swap-пространства. Для этого используется swap-файл.
Сначала нужно выделить участок памяти для swap. Для этого используйте команду truncate.
В этом мануале swap-файл будет находиться в /swapfile; укажите своё место для этого файла в системе. Этот swap-файл выделит дополнительный 1 гигабайт для подкачки; чтобы задать другой объём, отредактируйте значение флага –s.
sudo truncate -s 1G /swapfile
Выделив пространство, заблокируйте доступ к файлу.
sudo chmod 0600 /swapfile
Затем смонтируйте файл и настройте его автоматическое монтирование при каждой загрузке:
echo "md99 none swap sw,file=/swapfile,late 0 0" | sudo tee -a /etc/fstab
Эта команда добавит в файл /etc/fstab строку:
md99 none swap sw,file=/swapfile,late 0 0
Теперь включите swap-файл при помощи команды:
sudo swapon -aqL
Убедитесь, что swap-файл работает, с помощью команды:
sudo swapinfo -g
Вы увидите дополнительное устройство (/dev/md99). Вывод будет выглядеть примерно так:
Device 1G-blocks Used Avail Capacity
/dev/gpt/swapfs 1 0 1 0%
/dev/md99 1 0 1 0%
Total 2 0 2 0%
Этот файл будет автоматически монтироваться при каждом запуске системы.
Читайте также: