====== Утилиты для работы с pf ====== **pftop -a** <- Вывести подробный мониторинг текущих сессий \\ **pfctl -a '*' -sr** <- Вывести из оперативной памяти список всех правил с таблицами\\ **pfctl -nf /path/to/filewall.conf** <- Проверить на наличие синтаксических ошибок конфигурационный файл с правилами для pf\\ **pfctl -f /path/to/filewall.conf** <- Загрузить правила из файла\\ **pfctl -e** <- Включить фаервол\\ **pfctl -d** <- Отключить фаервол\\ ====== Основы работы с pf ====== 1. У pf есть одна особенность в его работе, перед другими фаерволами и это то, что он применяет действие в отношение пакета по его последнему совпадению с правилами а не до первого совпавшего, как в остальных. Т.е. если у вас сначала идёт запрещающее правило а после разрешающее, то будет выполнено последнее совпавшее, т.е. разрешить. \\ 2. Так же вам необходимо иметь поддержку утилит для работы с pf (описано в [[http://bom-bom.nadejnei.net/doku.php?id=%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D1%80%D1%82%D0%BE%D0%B2_%D1%80%D0%B5%D0%BB%D0%B8%D0%B7%D0%B0_%D0%B8_%D1%8F%D0%B4%D1%80%D0%B0_freebsd|Сюды]])\\ 3. Так же pf поддерживает подключаемые таблицы с IP адресами\\ 4. Для включения фаервола, необходимо приписать его в **/etc/rc.conf**: \\ Прописываем в конфиг такие строки \\ **pf_enable="YES"**\\ **pf_rules="/etc/firewall/pf.conf"** <- пусть к файлу может быть любой\\ **pf_flags=""** \\ **pflog_enable="YES"** <- включаем поддержку ведения логов (по желанию)\\ **pflog_logfile="/var/log/firewall/pflog"** <- путь к лог файлам\\ **pflog_flags=""** \\ **gateway_enable="YES"** <- включать только, если за нашим хостом находится локальная сеть (необходимо для поддержки NAT)\\ Создаём файл с правилами, **touch /etc/firewall/pf.conf** и включаем pf, **kldload pf.ko && /etc/rc.d/pf start && /etc/rc.d/pflog start**\\ Теперь у нас всё готово для начала того, что бы писать правила для нашего фаервола ! \\ ====== Правила ====== Открываем наш конфиг **vim /etc/firewall/pf.conf**\\ **home_net="172.16.17.0/24"** <- Создаём переменную, где описываем нашу внутреннюю сеть\\ **v_ext="ext0"** <- Наш внешний интерфейс, который смотрит в мир\\ **v_17="vlan17"** <- Интерфейс, за которым находится 17я сеть\\ **v_16="vlan16"** \\ **ms="modulate state"** <- описываем состояние \\ **kp="keep state"** \\ **icmp_types="{echoreq unreach}"** <- описываем желаемые типы ICMP\\ **director="172.16.17.17"** \\ **admin="172.16.16.2"** \\ **tcp4="inet proto tcp"** <- описываем желаемые протоколы\\ **udp4="inet proto udp"** \\ **icmp="inet proto icmp"** \\ **esp ="inet proto esp"** \\ **set optimization aggressive** \\ **set skip on lo0** \\ **set block-policy drop** \\ **set limit { states 500000, src-nodes 500000, frags 50000 }** \\ **set limit { table-entries 500000, tables 500000 }** \\ **scrub in on ext0 all fragment reassemble** \\ **scrub in all** \\ **antispoof log quick for ext0 inet** \\