# Правила файрвола pfSense - создание и управление ими

> Создание и управление правилами файрвола pfSense - порядок обработки, действия, протоколы, интерфейсы, floating rules и отслеживание состояний

Source: https://opennix.org/docs/pfsense/firewall/pfsense-firewall-rules/


Файрвол pfSense построен на основе pf (packet filter) - системы фильтрации пакетов, заимствованной из OpenBSD. pf выполняет фильтрацию с сохранением состояния соединений (stateful inspection): после разрешения первого пакета соединения все последующие пакеты этого же соединения пропускаются автоматически на основании записи в таблице состояний (state table). Это означает, что правило файрвола необходимо создавать только для инициирующего направления трафика - ответный трафик обрабатывается без явного правила.

Материал ориентирован на администраторов, имеющих опыт работы с межсетевыми экранами Cisco ASA, FortiGate или MikroTik, и переходящих на pfSense. Для каждого ключевого отличия приведены пояснения, упрощающие миграцию.

## Принципы обработки правил

### Трёхуровневая иерархия правил

pfSense обрабатывает правила файрвола в строго определённом порядке. Правила делятся на три класса, которые оцениваются последовательно:

1. **Floating rules** - обрабатываются первыми. Применяются к одному или нескольким интерфейсам одновременно и поддерживают фильтрацию в обоих направлениях.
2. **Правила групп интерфейсов** - обрабатываются вторыми. Применяются ко всем интерфейсам, входящим в группу (включая вкладки VPN).
3. **Правила интерфейсов** - обрабатываются последними. Применяются только к конкретному интерфейсу.

Порядок имеет практическое значение: если правило группы интерфейсов заблокировало трафик, правило на вкладке конкретного интерфейса не может его отменить - пакет уже обработан на предыдущем уровне.

### Принцип first match wins

Внутри каждого уровня правила обрабатываются последовательно сверху вниз. Первое совпавшее правило определяет судьбу пакета - дальнейшая проверка не выполняется. Пакеты, не совпавшие ни с одним правилом, отбрасываются неявным правилом запрета (implicit deny).

> **Внимание**:
>
> Floating rules с отключённым флагом Quick работают по обратному принципу - last match wins. Это исключение рассмотрено в разделе [Floating rules](#floating-rules).

### Привязка к интерфейсу и направление

Правила на вкладках интерфейсов фильтруют только **входящий** трафик на соответствующем интерфейсе. Трафик от хостов LAN обрабатывается правилами LAN, трафик из интернета - правилами WAN. Фильтрация исходящего трафика на уровне интерфейса не выполняется - для этого используются floating rules.

### Сравнение с другими платформами

| Характеристика | pfSense (pf) | Cisco ASA | FortiGate | MikroTik RouterOS |
|---|---|---|---|---|
| Модель обработки | First match wins | First match wins (ACL) | Policy ID, first match wins | Chains (filter/nat/mangle) |
| Привязка правил | Per-interface, inbound | Per-interface, inbound | Zone-based (zone pairs) | Per-chain, configurable |
| Неявное правило | Deny (silent) | Deny (implicit) | Deny (policy ID 0) | Accept (default policy) |
| Stateful | Да (по умолчанию) | Да (по умолчанию) | Да (по умолчанию) | Требует `connection-state` matcher |
| Floating/Global rules | Да (floating) | Global ACL | Global policy | Forward chain |

Администраторам MikroTik следует обратить особое внимание на различие моделей: в MikroTik RouterOS политика по умолчанию - Accept (пропускать), в pfSense - Deny (запрещать). При миграции необходимо убедиться, что все разрешающие правила созданы явно.

### Автоматически генерируемые правила

pfSense автоматически создаёт несколько служебных правил, которые не отображаются в веб-интерфейсе как обычные правила:

- **Anti-lockout rule** - предотвращает блокировку административного доступа. Разрешает трафик из любого источника внутренней сети к IP-адресу LAN-интерфейса на порты управления (по умолчанию - веб-интерфейс и SSH). Отключается в **System > Advanced > Admin Access**.
- **Anti-spoofing (uRPF)** - проверяет обратный маршрут для каждого пакета по RFC 3704 (Unicast Reverse Path Forwarding). Пакеты с адресами источника, несовместимыми с таблицей маршрутизации, отбрасываются.
- **Block private networks** - блокирует RFC 1918 адреса на WAN-интерфейсе (при включённой опции в настройках интерфейса).
- **Block bogon networks** - блокирует пакеты с адресами из незанятого и зарезервированного адресного пространства. Список bogon-сетей обновляется ежемесячно с серверов Netgate.

## Интерфейс управления правилами

Управление правилами файрвола осуществляется через **Firewall > Rules**. Каждый сетевой интерфейс представлен отдельной вкладкой. Дополнительно присутствует вкладка **Floating** для правил, применяемых к нескольким интерфейсам.

![Список правил файрвола pfSense](/img/pfsense/pfsense-firewall-rules-list.webp)
<p style="text-align: center;">Рис. 1. Список правил файрвола на вкладке LAN</p>

На странице списка правил отображаются:

- **Порядковый номер и действие** - значок действия (Pass, Block, Reject) с индикацией цветом
- **Интерфейс** - интерфейс, к которому привязано правило
- **Протокол** - TCP, UDP, ICMP или другой протокол IP
- **Источник и назначение** - адреса, сети или алиасы
- **Порт** - порт назначения (для TCP/UDP/SCTP)
- **Gateway** - шлюз для policy routing (при наличии)
- **Описание** - текстовое описание правила

Правила можно перемещать перетаскиванием для изменения порядка, дублировать, отключать без удаления и группировать с помощью разделителей (separators).

## Создание правила

Для создания нового правила необходимо перейти на вкладку нужного интерфейса в **Firewall > Rules** и нажать одну из кнопок добавления (добавить в начало или в конец списка).

![Редактирование правила файрвола pfSense](/img/pfsense/pfsense-firewall-rule-edit.webp)
<p style="text-align: center;">Рис. 2. Форма редактирования правила файрвола</p>

### Action (действие)

![Выбор действия правила файрвола](/img/pfsense/pfsense-firewall-rule-action.webp)
<p style="text-align: center;">Рис. 3. Выбор действия правила</p>

Поле **Action** определяет, что произойдёт с пакетом при совпадении с правилом:

| Действие | Поведение | Когда использовать |
|---|---|---|
| **Pass** | Пакет пропускается. Создаётся запись в таблице состояний (при включённом state tracking). | Разрешающие правила для легитимного трафика |
| **Block** | Пакет отбрасывается без уведомления отправителя. | Запрет трафика без раскрытия информации о файрволе |
| **Reject** | Пакет отбрасывается с отправкой уведомления отправителю: TCP RST для TCP-пакетов, ICMP Unreachable для остальных протоколов. | Запрет трафика внутри доверенных сетей - ускоряет обнаружение ошибок конфигурации на стороне клиента |

> **Внимание**:
>
> Действие Reject не следует использовать на WAN-интерфейсе. Отправка уведомлений об отклонении пакетов в интернет раскрывает наличие файрвола и может использоваться для разведки сетевой инфраструктуры.

### Interface (интерфейс)

Определяет интерфейс, на котором действует правило. Правило фильтрует трафик, **входящий** на указанный интерфейс. Это ключевой момент: для разрешения трафика из LAN в интернет правило создаётся на вкладке LAN, а не WAN.

### Address Family (семейство адресов)

Определяет, к какому типу IP-пакетов применяется правило:

- **IPv4** - только IPv4-трафик
- **IPv6** - только IPv6-трафик
- **IPv4+IPv6** - оба типа трафика в одном правиле

При использовании алиасов в полях Source или Destination система автоматически применяет только те записи алиаса, которые соответствуют выбранному семейству адресов.

### Protocol (протокол)

Определяет протокол IP-пакета:

- **TCP**, **UDP**, **SCTP** - транспортные протоколы с возможностью указания портов
- **TCP/UDP** - совпадение с TCP или UDP в одном правиле
- **ICMP** - с возможностью выбора конкретных типов ICMP-сообщений (Echo Request, Destination Unreachable и др.)
- **Any** - любой протокол
- Другие протоколы IP: ESP, AH, GRE, IPEncap, IGMP и т.д.

### Source и Destination (источник и назначение)

Каждое поле поддерживает несколько типов значений:

- **Any** - любой адрес
- **Single host or alias** - один IP-адрес или алиас
- **Network** - подсеть в нотации CIDR (например, 192.168.1.0/24)
- **Адрес интерфейса** - LAN address, WAN address и т.д. (динамически подставляется текущий адрес интерфейса)
- **PPPoE/L2TP clients** - диапазон адресов клиентов PPPoE или L2TP
- **This firewall (self)** - только для Destination; совпадает с любым адресом, назначенным файрволу

Опция **Invert Match** инвертирует условие: правило совпадает со всеми адресами, кроме указанных.

### Port (порт)

Для протоколов TCP, UDP и SCTP доступна настройка портов источника и назначения:

- Одиночный порт: `443`
- Диапазон: `1024-65535`
- Алиас портов: `WebPorts` (содержащий набор портов)

> **Внимание**:
>
> Фильтрация по порту источника используется крайне редко. В подавляющем большинстве случаев достаточно указать только порт назначения.

### Gateway (шлюз)

По умолчанию файрвол использует системную таблицу маршрутизации для определения следующего узла (next hop). Явное указание шлюза в правиле реализует **policy routing** - принудительную маршрутизацию трафика через указанный шлюз или группу шлюзов (gateway group).

Типичные сценарии применения:

- Направление трафика определённых хостов через конкретный WAN-интерфейс в конфигурации Multi-WAN
- Маршрутизация трафика через VPN-шлюз для определённых подсетей
- Балансировка нагрузки между несколькими WAN-каналами

### Logging (журналирование)

Включение опции **Log** активирует запись событий совпадения правила в журнал файрвола. Журнал доступен в **Status > System Logs > Firewall**. Рекомендуется включать журналирование для правил блокировки критичного трафика и при диагностике проблем.

Избыточное журналирование создаёт нагрузку на систему и затрудняет анализ. На производственных системах следует журналировать только те правила, для которых это действительно необходимо.

### Description (описание)

Текстовое описание правила длиной до 52 символов. Рекомендуется указывать назначение правила и номер заявки (тикета), если правило создано по запросу. Описание не влияет на обработку трафика, но существенно упрощает аудит и сопровождение набора правил.

### Дополнительные параметры

При раскрытии секции **Advanced Options** становятся доступны расширенные настройки:

- **Source OS** - пассивное определение операционной системы отправителя по характеристикам TCP SYN-пакетов (p0f fingerprinting)
- **TCP Flags** - совпадение по конкретным TCP-флагам (SYN, ACK, FIN, RST, URG, PSH)
- **Schedule** - привязка правила к расписанию (правило активно только в указанное время)
- **Таgging** - маркировка пакетов строковым тегом для последующего совпадения в floating rules
- **Max states / Max source nodes** - ограничение количества состояний (глобально и по IP-адресу источника)
- **Max connections per host / Max new connections per second** - ограничение скорости установления соединений (только TCP)
- **VLAN Priority (802.1p)** - совпадение и установка приоритета PCP для QoS

## Floating rules

Floating rules - расширенные правила файрвола, которые предоставляют возможности, недоступные на вкладках обычных интерфейсов. Управление floating rules осуществляется на вкладке **Firewall > Rules > Floating**.

![Floating rules pfSense](/img/pfsense/pfsense-firewall-floating-rules.webp)
<p style="text-align: center;">Рис. 4. Вкладка Floating rules</p>

### Отличия от правил интерфейсов

| Характеристика | Правила интерфейсов | Floating rules |
|---|---|---|
| Привязка | Один интерфейс | Один, несколько или все интерфейсы |
| Направление | Только входящий (inbound) | Входящий, исходящий или оба |
| Порядок обработки | После floating и group rules | Первыми (наивысший приоритет) |
| Действие Match | Недоступно | Доступно (для traffic shaping) |
| Reply-to | Автоматически добавляется | Не добавляется автоматически |

### Направление (Direction)

Floating rules поддерживают три варианта направления:

- **in** - только входящий трафик на выбранных интерфейсах
- **out** - только исходящий трафик на выбранных интерфейсах
- **any** - трафик в обоих направлениях

### Флаг Quick

Флаг **Quick** определяет способ обработки совпадений:

- **Quick включён** (по умолчанию) - стандартный принцип first match wins. При совпадении пакет немедленно обрабатывается согласно действию правила.
- **Quick отключён** - принцип last match wins. Пакет продолжает проверяться по оставшимся правилам, и действие определяется последним совпавшим правилом.

Отключение Quick используется редко и предназначено для сложных сценариев, требующих переопределения действия на более поздних этапах обработки.

### Действие Match

Действие **Match** уникально для floating rules. Оно не пропускает и не блокирует пакет, а только помечает его для целей traffic shaping - назначения в очередь ALTQ или применения limiter. Это основное применение floating rules в конфигурациях QoS.

### Типичные сценарии использования

- **Traffic shaping (ALTQ)** - наиболее частое применение. Floating rules назначают трафик в очереди приоритезации.
- **Фильтрация исходящего трафика** - единственный способ фильтрации пакетов, покидающих интерфейс (outbound direction).
- **Фильтрация трафика самого файрвола** - контроль трафика, генерируемого процессами файрвола (DNS-запросы, NTP, обновления пакетов).
- **Мультиинтерфейсные правила** - применение одного правила к нескольким интерфейсам одновременно вместо дублирования правил на каждой вкладке.

> **Внимание**:
>
> Floating rules не добавляют автоматически директиву `reply-to` для входящего трафика. В конфигурациях Multi-WAN это может привести к асимметричной маршрутизации ответного трафика. Для Multi-WAN сценариев предпочтительно использовать правила на вкладках интерфейсов.

## Отслеживание состояний

pfSense по умолчанию работает как stateful firewall. При совпадении разрешающего правила (Pass) создаётся запись в таблице состояний (state table). Все последующие пакеты того же соединения обрабатываются на основании этой записи без повторной проверки правил.

![Таблица состояний pfSense](/img/pfsense/pfsense-firewall-states.webp)
<p style="text-align: center;">Рис. 5. Таблица состояний (Diagnostics > States)</p>

### Типы состояний (State Type)

| Тип | Описание | Применение |
|---|---|---|
| **Keep State** | Стандартное отслеживание состояний. По умолчанию для всех правил. | Большинство сценариев |
| **Sloppy State** | Менее строгая проверка последовательности пакетов. Допускает пропущенные пакеты. | Асимметричная маршрутизация, кластерные конфигурации |
| **Synproxy State** | Файрвол проксирует TCP-хендшейк: устанавливает соединение с клиентом от своего имени, затем устанавливает соединение с сервером. | Защита от SYN flood-атак на публичные сервисы |
| **None** | Отслеживание состояний отключено. Каждый пакет проверяется по правилам. | Специальные случаи; требует парных правил для ответного трафика |

### Таблица состояний и таймауты

Таблица состояний хранит информацию обо всех активных соединениях. Каждая запись содержит:

- Адреса и порты источника и назначения
- Интерфейс, на котором создано состояние
- Текущее состояние TCP-соединения (SYN_SENT, ESTABLISHED, FIN_WAIT и т.д.)
- Время создания и время последнего пакета
- Количество переданных байт и пакетов

Состояния удаляются по истечении таймаута неактивности. Значения таймаутов по умолчанию настраиваются в **System > Advanced > Firewall & NAT**. pfSense поддерживает адаптивные таймауты: при заполнении таблицы состояний выше порогового значения таймауты автоматически сокращаются для освобождения ресурсов.

Просмотр текущей таблицы состояний доступен в **Diagnostics > States**. Здесь можно фильтровать состояния по интерфейсу, IP-адресу, порту и удалять отдельные записи вручную.

### Ограничение количества состояний

В параметрах правила доступны ограничения:

- **Maximum state entries** - максимальное количество состояний, создаваемых данным правилом
- **Maximum source nodes** - максимальное количество уникальных IP-адресов источника
- **Maximum established connections per host** - максимальное количество установленных соединений для одного IP
- **Maximum new connections per second** - ограничение скорости установления новых TCP-соединений (защита от DDoS)

## Группировка и организация правил

При увеличении количества правил их организация становится критически важной. pfSense предоставляет несколько механизмов для упорядочивания набора правил.

### Разделители (Separators)

Разделители - цветные полосы с текстовыми заголовками, которые визуально группируют правила на вкладке интерфейса. Разделители не влияют на обработку трафика и служат исключительно для навигации. Для добавления разделителя следует нажать кнопку разделителя в верхней части списка правил.

Рекомендуемая структура разделителей:

```
--- Management Access ---
  SSH, HTTPS к файрволу
--- Internal Services ---
  DNS, NTP, DHCP
--- Server Farm ---
  Правила доступа к серверам
--- User Access ---
  Доступ пользователей к ресурсам
--- Deny All (explicit) ---
  Явное правило запрета с журналированием
```

### Описания правил

Каждое правило должно содержать осмысленное описание. Рекомендуется включать:

- Назначение правила (что разрешает/запрещает)
- Номер тикета или запроса на изменение
- Дату создания (для временных правил)

### Стратегия порядка следования

Рекомендуемый порядок правил на вкладке интерфейса:

1. Правила блокировки известных угроз (blacklists)
2. Правила доступа к управлению файрволом
3. Правила для внутренних сервисов (DNS, NTP, DHCP)
4. Правила доступа к серверам
5. Правила доступа пользователей к интернету
6. Явное правило запрета с включённым журналированием (для аудита отклонённого трафика)

Явное правило запрета в конце списка не является обязательным - implicit deny выполнит ту же функцию. Однако явное правило с журналированием позволяет фиксировать весь отклонённый трафик, что полезно для диагностики и аудита.

## Устранение неполадок

### Чтение журнала файрвола

Журнал файрвола доступен в **Status > System Logs > Firewall**. Каждая запись содержит:

- Действие (Pass или Block)
- Интерфейс, на котором сработало правило
- Правило, вызвавшее запись (ID правила или описание)
- Адреса и порты источника и назначения
- Протокол и флаги

Для эффективного анализа рекомендуется использовать фильтры по интерфейсу, действию и IP-адресу.

### Просмотр загруженных правил через консоль

Для просмотра текущих правил, загруженных в ядро pf, используется команда `pfctl`:

```bash
# View all loaded rules with rule numbers
pfctl -sr

# View rules with verbose output (includes labels and counters)
pfctl -vsr

# View current state table
pfctl -ss

# View state table filtered by host
pfctl -ss | grep 192.168.1.100

# View state table statistics
pfctl -si
```

Команды выполняются в консоли файрвола: через SSH, последовательную консоль или **Diagnostics > Command Prompt** в веб-интерфейсе.

### Таблица состояний

При подозрении, что трафик блокируется устаревшей записью в таблице состояний:

1. Перейти в **Diagnostics > States**
2. Найти записи для проблемного IP-адреса или порта
3. Удалить устаревшие состояния кнопкой удаления
4. При массовой очистке использовать **Diagnostics > States > Reset States**

> **Внимание**:
>
> Сброс всех состояний прервёт все активные соединения через файрвол, включая собственную сессию администратора. Выполнять эту операцию следует только в согласованное окно обслуживания.

### Захват пакетов

Для детальной диагностики доступен встроенный инструмент захвата пакетов в **Diagnostics > Packet Capture**:

1. Выбрать интерфейс, на котором требуется перехват
2. Указать фильтр по протоколу, адресу и порту
3. Запустить захват и воспроизвести проблемный трафик
4. Остановить захват и скачать файл pcap для анализа в Wireshark

Дополнительно захват пакетов возможен из командной строки:

```bash
# Capture packets on LAN interface for specific host
tcpdump -i em1 host 192.168.1.100 -n -vv

# Capture only TCP SYN packets (new connections)
tcpdump -i em1 'tcp[tcpflags] & tcp-syn != 0' -n

# Save capture to file for later analysis
tcpdump -i em1 host 192.168.1.100 -w /tmp/capture.pcap
```

### Типичные проблемы и решения

| Симптом | Вероятная причина | Решение |
|---|---|---|
| Трафик блокируется при наличии разрешающего правила | Правило расположено ниже блокирующего правила | Переместить разрешающее правило выше блокирующего |
| Правило не совпадает с трафиком | Правило создано на неверном интерфейсе | Проверить, что правило создано на интерфейсе, на который **входит** трафик |
| Ответный трафик не проходит | Устаревшая запись в таблице состояний | Очистить состояния для проблемного соединения |
| Floating rule не работает | Не установлен флаг Quick | Включить Quick для немедленного применения действия |
| Anti-lockout rule не защищает | Доступ через интерфейс, отличный от LAN | Anti-lockout действует только на LAN; для других интерфейсов требуется явное правило доступа |

## Связанные разделы

- [Алиасы](/docs/pfsense/firewall/pfsense-firewall-aliases/) - группировка адресов и портов для упрощения управления правилами
- [Расписания](/docs/pfsense/firewall/pfsense-firewall-schedules/) - применение правил по расписанию
- [Лучшие практики](/docs/pfsense/firewall/pfsense-firewall-best-practices/) - рекомендации по организации набора правил и политике безопасности
- [NAT и проброс портов](/docs/pfsense/nat/) - трансляция адресов и проброс портов, взаимодействие NAT-правил с правилами файрвола
- [Установка pfSense](/docs/pfsense/installation/pfsense-installation-guide/) - установка и первоначальная настройка pfSense
- [Интеграция pfSense с Wazuh](/docs/pfsense/pfsense-wazuh-integration/) - мониторинг событий файрвола в SIEM-системе Wazuh

