# Проброс портов в pfSense - настройка Port Forward NAT

> Настройка проброса портов в pfSense - перенаправление входящего трафика на внутренние серверы, связь с правилами файрвола и NAT reflection

Source: https://opennix.org/docs/pfsense/nat/pfsense-port-forwarding/


Проброс портов (port forwarding) - основной механизм предоставления доступа из внешней сети к сервисам на внутренних хостах. При получении пакета на WAN-интерфейс pfSense проверяет таблицу правил проброса и при совпадении заменяет адрес назначения на IP-адрес внутреннего сервера. Это разновидность DNAT (Destination NAT) - трансляции адреса назначения.

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

## Предварительные требования

Перед настройкой проброса портов необходимо убедиться в выполнении следующих условий:

- **Статический или предсказуемый WAN-адрес**. Проброс работает по адресу назначения на WAN-интерфейсе. При динамическом WAN-адресе (DHCP от провайдера) проброс функционирует, но при смене адреса внешние клиенты теряют доступ. В таких случаях следует настроить Dynamic DNS (DynDNS) для автоматического обновления DNS-записи.
- **Статический IP-адрес целевого сервера**. Внутренний сервер, на который перенаправляется трафик, должен иметь фиксированный IP-адрес. Допускается использование DHCP-резервации (static mapping) вместо ручной настройки IP на сервере.
- **Сервис запущен и слушает порт**. Целевой сервис должен быть запущен и привязан к ожидаемому порту. Локальный файрвол сервера (iptables, Windows Firewall) не должен блокировать входящие соединения.
- **Порт не заблокирован провайдером**. Некоторые провайдеры блокируют входящие соединения на стандартные порты (80, 443, 25). Следует уточнить у провайдера наличие ограничений или использовать нестандартные порты.

## Создание проброса порта

Правила проброса портов настраиваются в разделе **Firewall > NAT > Port Forward**. Для создания нового правила следует нажать кнопку **Add** (стрелка вверх - добавление в начало списка, стрелка вниз - в конец).

![Список правил проброса портов](/img/pfsense/pfsense-nat-port-forward-list.webp)
<p style="text-align: center;">Рис. 1. Список правил проброса портов (Firewall > NAT > Port Forward)</p>

### Параметры правила проброса

Форма создания правила проброса содержит следующие поля:

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

**Interface** - интерфейс, на котором перехватывается входящий трафик. В большинстве случаев указывается WAN. При наличии нескольких WAN-интерфейсов необходимо создавать отдельное правило для каждого. Для проброса между внутренними сетями (например, DMZ -> LAN) указывается соответствующий внутренний интерфейс.

**Protocol** - протокол транспортного уровня. Доступные варианты:

| Протокол | Применение |
|---|---|
| TCP | Веб-серверы, SSH, почта, большинство сервисов |
| UDP | DNS, VoIP (SIP/RTP), игровые серверы |
| TCP/UDP | Сервисы, использующие оба протокола (DNS, некоторые игры) |
| SCTP | Специализированные протоколы сигнализации (SS7, Diameter) |
| GRE | Туннели GRE (PPTP passthrough) |
| ESP | IPsec (при необходимости проброса ESP без использования встроенного IPsec) |

**Destination** - адрес назначения во входящем пакете, по которому выполняется сопоставление. Типичные значения:

- **WAN address** - основной адрес WAN-интерфейса. Используется в подавляющем большинстве случаев.
- **Virtual IP (VIP)** - виртуальный IP-адрес, настроенный на WAN-интерфейсе. Используется при наличии нескольких публичных адресов.
- **Any** - любой адрес назначения. Применяется в редких сценариях (например, перехват DNS-запросов).

**Destination port range** - порт или диапазон портов назначения. Можно указать один порт, именованный порт (HTTP, HTTPS, SSH) или диапазон (From/To). При пробросе диапазона портов размер диапазона на стороне назначения и перенаправления должен совпадать.

**Redirect target IP** - IP-адрес внутреннего сервера, на который перенаправляется трафик. Поддерживается указание одного адреса или алиаса. При использовании алиаса pfSense выполняет балансировку нагрузки между адресами алиаса (round-robin).

**Redirect target port** - порт на внутреннем сервере. Может отличаться от порта назначения. Например, входящий трафик на WAN:8080 можно перенаправить на внутренний сервер 192.168.1.10:80. При пробросе диапазона портов указывается начальный порт целевого диапазона.

**Description** - текстовое описание правила. Рекомендуется указывать назначение проброса и имя целевого сервера (например, "Web server - HTTP/HTTPS to srv-web-01").

**No XMLRPC Sync** - отключение синхронизации правила между нодами в кластере высокой доступности (CARP). Применяется, когда правило специфично для одной ноды.

**NAT Reflection** - режим отражения NAT для данного правила. Подробнее рассмотрено в разделе [NAT Reflection](#nat-reflection).

**Filter Rule Association** - связь с правилом файрвола. Подробнее рассмотрено в разделе [Связь с правилами файрвола](#svyaz-s-pravilami-fayrvola).

### Пример: проброс HTTPS на веб-сервер

Задача: обеспечить доступ из интернета к веб-серверу 192.168.1.10 по HTTPS (порт 443).

| Параметр | Значение |
|---|---|
| Interface | WAN |
| Protocol | TCP |
| Destination | WAN address |
| Destination port range | HTTPS (443) |
| Redirect target IP | 192.168.1.10 |
| Redirect target port | 443 |
| Description | HTTPS to srv-web-01 |
| Filter Rule Association | Add associated filter rule |

После сохранения правила необходимо нажать **Apply Changes** для применения конфигурации.

## Связь с правилами файрвола

Проброс порта выполняет только трансляцию адреса назначения. Для фактического пропуска трафика необходимо правило файрвола, разрешающее соединение. pfSense предлагает четыре варианта связи с правилом файрвола:

### Add associated filter rule

pfSense автоматически создаёт связанное правило файрвола на интерфейсе, указанном в правиле проброса. При изменении параметров проброса (порт, протокол, адрес назначения) связанное правило обновляется автоматически. Это рекомендуемый вариант для большинства случаев.

Связанное правило отображается на вкладке правил соответствующего интерфейса с пометкой (NAT) и иконкой якоря. Редактирование порта и адреса назначения в связанном правиле заблокировано - эти параметры управляются правилом проброса.

### Add unassociated filter rule

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

### Pass

Трафик пропускается без создания отдельного правила файрвола. pfSense использует ключевое слово `pass` в правиле pf, совмещая трансляцию и фильтрацию в одной записи. Этот режим работает только при наличии одного шлюза - при нескольких WAN-интерфейсах с policy routing результат непредсказуем.

> **Внимание**:
>
> Режим Pass не позволяет ограничить доступ по IP-адресу источника. Весь трафик, совпавший с правилом проброса, будет пропущен. Для ограничения доступа следует использовать Add associated filter rule или Add unassociated filter rule.

### None

Правило файрвола не создаётся. Администратор должен вручную создать правило на соответствующей вкладке интерфейса. Используется в сложных сценариях, когда одно правило файрвола обслуживает несколько правил проброса.

### Типичные ошибки

- **Правило проброса создано, но правило файрвола отсутствует.** При выборе None и отсутствии ручного правила трафик блокируется.
- **Связанное правило перемещено вручную.** Связанные правила привязаны к правилу проброса по ID. Перемещение или удаление связанного правила нарушает привязку.
- **Дублирование правил файрвола.** При переключении между типами ассоциации старое правило может остаться. Следует проверить вкладку правил интерфейса на наличие дубликатов.

## NAT Reflection

NAT reflection (NAT hairpin, loopback NAT) позволяет хостам внутренней сети обращаться к проброшенным сервисам по внешнему (публичному) адресу. Без NAT reflection клиент из LAN, обращающийся к публичному IP, не получит ответ, поскольку пакет от внутреннего сервера вернётся напрямую, минуя трансляцию.

Настройка глобального режима NAT reflection выполняется в **System > Advanced > Firewall & NAT** в секции **Network Address Translation**.

![Настройки NAT reflection](/img/pfsense/pfsense-nat-reflection.webp)
<p style="text-align: center;">Рис. 3. Глобальные настройки NAT reflection (System > Advanced > Firewall & NAT)</p>

### Режимы NAT reflection

pfSense поддерживает три режима NAT reflection:

**Disable** - NAT reflection отключено. Внутренние клиенты не могут обращаться к проброшенным сервисам по внешнему адресу. Для доступа необходимо использовать внутренний IP-адрес сервера или настроить split DNS (разделённый DNS).

**NAT + Proxy** - pfSense выступает прокси-сервером для отражённых соединений. Пакет от клиента LAN перехватывается, pfSense устанавливает новое соединение к целевому серверу от своего имени и ретранслирует данные. Преимущества:

- Работает без дополнительных маршрутов.
- Целевой сервер видит IP-адрес pfSense как источник, что упрощает маршрутизацию ответа.
- Поддерживает проброс на порт, отличный от входящего.

Недостатки:

- Увеличивает нагрузку на pfSense (каждое соединение обрабатывается в пользовательском пространстве).
- Не поддерживает UDP.
- Ограниченная производительность при большом числе одновременных соединений.

**Pure NAT** - pfSense выполняет трансляцию на уровне ядра без прокси. Пакет от клиента LAN проходит через правила NAT аналогично внешнему трафику. Преимущества:

- Высокая производительность (обработка на уровне pf).
- Поддерживает TCP и UDP.
- Поддерживает диапазоны портов.

Недостатки:

- Требует включения опции **Enable automatic outbound NAT for Reflection** в настройках NAT reflection.
- Целевой сервер видит реальный IP-адрес клиента LAN. Если сервер отвечает напрямую клиенту (минуя pfSense), ответ отбрасывается, поскольку клиент ожидает ответ от публичного IP. Решение - добавить маршрут на сервере или включить автоматический outbound NAT для reflection.

### Выбор режима

| Критерий | NAT + Proxy | Pure NAT |
|---|---|---|
| Протокол | Только TCP | TCP и UDP |
| Производительность | Ниже (userspace proxy) | Выше (kernel-level pf) |
| Настройка | Минимальная | Требуется automatic outbound NAT |
| Видимость клиента | Сервер видит IP pfSense | Сервер видит IP клиента |
| Диапазоны портов | Не поддерживает | Поддерживает |

Для большинства инсталляций рекомендуется режим **Pure NAT** с включённой опцией **Enable automatic outbound NAT for Reflection**. Режим NAT + Proxy следует применять только при невозможности использования Pure NAT (например, при сложной маршрутизации, исключающей корректную обработку на уровне ядра).

### Переопределение на уровне правила

Каждое правило проброса содержит поле **NAT Reflection**, позволяющее переопределить глобальный режим. Доступные значения:

- **Use system default** - используется глобальная настройка.
- **Enable (NAT + Proxy)** - принудительно включает NAT + Proxy для данного правила.
- **Enable (Pure NAT)** - принудительно включает Pure NAT.
- **Disable** - отключает NAT reflection для данного правила.

Переопределение полезно, когда для одного сервиса требуется режим, отличный от глобального (например, глобально включён Pure NAT, но для конкретного TCP-сервиса необходим NAT + Proxy).

### Альтернатива: split DNS

Альтернативой NAT reflection является split DNS (разделённый DNS, split-horizon DNS). При этом подходе внутренний DNS-сервер (DNS Resolver или DNS Forwarder в pfSense) возвращает внутренний IP-адрес сервера для запросов из LAN, а внешний DNS - публичный IP.

Split DNS предпочтительнее NAT reflection по следующим причинам:

- Отсутствие дополнительной нагрузки на pfSense.
- Трафик между клиентом и сервером не проходит через файрвол (при нахождении в одной подсети).
- Корректная работа с любыми протоколами.

Настройка split DNS в pfSense выполняется через **Services > DNS Resolver > Host Overrides**.

## Продвинутые сценарии

### Проброс диапазона портов

При необходимости проброса диапазона портов (например, для FTP passive mode, RTP или игровых серверов) указывается диапазон в поле **Destination port range** и начальный порт в поле **Redirect target port**. Размер диапазона определяется полем Destination port range - размер целевого диапазона вычисляется автоматически.

Пример: проброс портов 10000-10100 на внутренний сервер 192.168.1.20, начиная с порта 10000.

| Параметр | Значение |
|---|---|
| Destination port range | 10000 - 10100 |
| Redirect target IP | 192.168.1.20 |
| Redirect target port | 10000 |

### Перенаправление на другой порт

Входящий порт не обязан совпадать с целевым. Это позволяет скрыть стандартные порты или разместить несколько однотипных сервисов за одним публичным адресом.

Пример: публикация двух веб-серверов по одному WAN-адресу.

| Правило | WAN порт | Целевой IP | Целевой порт |
|---|---|---|---|
| Web server 1 | 443 | 192.168.1.10 | 443 |
| Web server 2 | 8443 | 192.168.1.11 | 443 |

Для публикации нескольких HTTPS-сервисов на стандартном порту 443 рекомендуется использовать reverse proxy (HAProxy, доступен как пакет pfSense) вместо проброса портов.

### Множественные WAN-интерфейсы

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

При использовании Virtual IP (CARP, IP Alias, Other) в качестве адреса назначения правило проброса привязывается к интерфейсу, на котором настроен VIP.

### Проброс VoIP/SIP

Проброс SIP-трафика требует особого внимания из-за особенностей протокола:

- SIP использует порт 5060 (TCP/UDP) для сигнализации и динамические порты (RTP, обычно 10000-20000) для медиа.
- Необходимо пробросить как порт SIP, так и диапазон RTP.
- При наличии SIP ALG (Application Layer Gateway) в pfSense или на вышестоящем оборудовании его следует отключить, поскольку ALG часто нарушает работу SIP.
- Рекомендуется настроить на SIP-устройстве явный STUN-сервер и корректный External IP.

Пример набора правил для SIP-сервера 192.168.1.30:

| Правило | Протокол | WAN порт | Целевой порт |
|---|---|---|---|
| SIP signaling | UDP | 5060 | 5060 |
| RTP media | UDP | 10000-20000 | 10000 |

### No RDR (NOT)

Опция **No RDR (NOT)** в правиле проброса инвертирует действие: вместо перенаправления pfSense явно запрещает перенаправление для совпавших пакетов. Это применяется для создания исключений - например, чтобы трафик от определённого источника не перенаправлялся, а обрабатывался локально.

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

При неработающем пробросе портов следует последовательно проверить каждый элемент цепочки.

### Контрольный список диагностики

1. **Провайдер не блокирует порт?**
   Некоторые провайдеры блокируют входящие соединения на порты 25, 80, 443. Проверить можно внешним сканером портов (при обращении напрямую на WAN-адрес) или уточнить у провайдера. При блокировке использовать нестандартный внешний порт.

2. **Правило проброса существует и активно?**
   Перейти в **Firewall > NAT > Port Forward** и убедиться, что правило присутствует, не отключено (отключённые правила отображаются серым) и параметры корректны.

3. **Правило файрвола существует?**
   Перейти на вкладку правил соответствующего интерфейса (обычно WAN) и убедиться, что существует правило, разрешающее трафик к целевому IP и порту. При использовании Add associated filter rule правило отмечено иконкой якоря.

4. **Целевой сервер запущен и слушает порт?**
   Подключиться к серверу из LAN напрямую по внутреннему IP и целевому порту. Если подключение не устанавливается - проблема на стороне сервера, а не pfSense.

5. **Локальный файрвол сервера не блокирует трафик?**
   Windows Firewall, iptables, firewalld или другой хостовой файрвол может блокировать входящие соединения. Временно отключить для диагностики или создать разрешающее правило.

6. **NAT reflection настроен (при тестировании из LAN)?**
   Тестирование проброса из внутренней сети работает только при включённом NAT reflection или настроенном split DNS. Для диагностики рекомендуется тестировать с внешнего устройства (мобильный телефон через сотовую сеть).

7. **Нет конфликтов с другими правилами?**
   Правило проброса на порт, совпадающий с локальным сервисом pfSense (например, порт 443 - веб-интерфейс), перехватит трафик. Убедиться, что порт управления pfSense не совпадает с пробрасываемым портом, или перенести веб-интерфейс на другой порт (**System > Advanced > Admin Access**).

8. **Маршрут по умолчанию на целевом сервере указывает на pfSense?**
   Если шлюз по умолчанию целевого сервера - не pfSense, ответные пакеты уходят в другой маршрутизатор и не проходят обратную трансляцию NAT. Убедиться, что default gateway сервера - IP-адрес pfSense на соответствующем интерфейсе.

### Диагностика через журналы

Журнал файрвола (**Status > System Logs > Firewall**) фиксирует заблокированные пакеты. Если входящий пакет заблокирован на WAN - отсутствует или некорректно правило файрвола. Фильтрация журнала по WAN-адресу и порту назначения позволяет быстро обнаружить проблему.

Для расширенной диагностики используется **Diagnostics > Packet Capture**: захват трафика на WAN-интерфейсе по целевому порту покажет, поступают ли пакеты на pfSense. Захват на LAN-интерфейсе покажет, передаётся ли трафик после трансляции.

### Диагностика через командную строку

```bash
# Check NAT state table for active translations
pfctl -s state | grep <target_port>

# View NAT rules loaded in pf
pfctl -s nat

# Verify the port forward rule is present
pfctl -s nat | grep rdr
```

## Миграция с других платформ

### Cisco ASA

В Cisco ASA входящий NAT настраивается командой `object` + `nat`:

```text
object network WEB-SERVER
 host 192.168.1.10
 nat (inside,outside) static interface service tcp 443 443
```

Эквивалент в pfSense: правило проброса порта с Interface = WAN, Destination = WAN address, Destination port = 443, Redirect target IP = 192.168.1.10, Redirect target port = 443.

В ASA 8.2 и ранее использовался синтаксис `static (inside,outside)`. Логика трансляции при миграции не меняется, меняется только способ задания.

### FortiGate

FortiGate использует Virtual IP (VIP) для входящего NAT:

```text
config firewall vip
    edit "WEB-SERVER"
        set extintf "wan1"
        set mappedip "192.168.1.10"
        set portforward enable
        set extport 443
        set mappedport 443
    next
end
```

В FortiGate VIP и policy - раздельные объекты. В pfSense правило проброса может автоматически создать связанное правило файрвола (Add associated filter rule), что упрощает конфигурацию. При миграции следует перенести как VIP (в правило проброса), так и policy (в правило файрвола).

### MikroTik RouterOS

MikroTik использует `dst-nat` в таблице NAT:

```text
/ip firewall nat add chain=dstnat dst-address=<WAN_IP> protocol=tcp \
    dst-port=443 action=dst-nat to-addresses=192.168.1.10 to-ports=443
```

В MikroTik правило NAT и правило файрвола (forward chain) - независимые сущности. При миграции на pfSense следует учитывать, что pfSense может автоматически связать правило проброса с правилом файрвола.

Дополнительное различие: в MikroTik правила NAT обрабатываются в chain dstnat до маршрутизации, аналогично pfSense. Однако в MikroTik политика по умолчанию - Accept, тогда как в pfSense - Deny. При миграции необходимо убедиться, что все необходимые разрешающие правила файрвола созданы.

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

- [NAT в pfSense](/docs/pfsense/nat/) - обзор NAT, порядок обработки трансляций, типы NAT
- [Правила файрвола](/docs/pfsense/firewall/pfsense-firewall-rules/) - создание и управление правилами фильтрации, порядок обработки
- [Алиасы файрвола](/docs/pfsense/firewall/pfsense-firewall-aliases/) - группировка адресов и портов для использования в правилах проброса
- [VPN в pfSense](/docs/pfsense/vpn/) - настройка VPN, требующая корректного NAT (static port, NAT exemption)

