# 1:1 NAT в pfSense - статическая трансляция адресов

> Настройка 1:1 NAT в pfSense - полная двусторонняя трансляция публичного адреса на внутренний сервер, отличия от проброса портов и типичные сценарии

Source: https://opennix.org/docs/pfsense/nat/pfsense-one-to-one-nat/


1:1 NAT (one-to-one NAT) в pfSense реализует полную двустороннюю трансляцию между внешним и внутренним IP-адресом. В отличие от проброса портов, при котором транслируются только указанные порты, 1:1 NAT устанавливает биективное соответствие адресов: весь входящий трафик на внешний адрес перенаправляется на внутренний хост, а весь исходящий трафик от этого хоста транслируется в назначенный внешний адрес. Механизм основан на BINAT (bidirectional NAT) подсистемы pf из OpenBSD.

1:1 NAT применяется в сценариях, когда внутреннему серверу требуется полное присутствие на выделенном публичном IP-адресе без ограничений по портам. Типичные случаи: почтовые серверы, VPN-шлюзы, SIP-серверы и хосты в DMZ с выделенным адресом.

## Отличия от проброса портов

Проброс портов (port forward) и 1:1 NAT решают схожую задачу - предоставление доступа к внутренним ресурсам извне, - однако принципиально различаются по области применения.

При пробросе портов транслируется конкретная пара протокол/порт (или диапазон портов). Внутренний хост остаётся доступен извне только по явно указанным портам. Это минимизирует поверхность атаки: администратор контролирует, какие именно сервисы открыты.

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

| Характеристика | Проброс портов | 1:1 NAT |
|---|---|---|
| Гранулярность | Конкретные порты или диапазоны | Все порты и протоколы |
| Количество правил для одного сервера | По одному на каждый сервис | Одно правило на весь хост |
| Контроль доступа | Встроен в правило NAT | Требует отдельных правил файрвола |
| Поверхность атаки | Минимальная | Зависит от правил файрвола |
| Требование VIP | Нет (используется WAN IP) | Да (требуется выделенный IP) |
| Исходящий трафик | Транслируется в WAN IP | Транслируется в назначенный VIP |
| Приоритет обработки | Выше (обрабатывается первым) | Ниже (обрабатывается после port forward) |

> **Внимание**:
>
> Если для одного внешнего адреса настроены и проброс порта, и 1:1 NAT, проброс порта получит приоритет для совпавших портов. Остальной трафик обработает 1:1 NAT. Этот факт необходимо учитывать при планировании конфигурации.

## Когда использовать 1:1 NAT

1:1 NAT следует применять в следующих случаях:

- **Выделенный публичный IP для сервера** - сервер должен быть доступен по всем портам на собственном публичном адресе (почтовый сервер, игровой сервер, PBX).
- **DMZ с несколькими серверами** - каждый сервер в DMZ получает отдельный публичный IP из выделенного блока адресов.
- **Совместимость протоколов** - некоторые протоколы (SIP, FTP active mode, отдельные VPN-реализации) работают некорректно через проброс портов из-за встраивания IP-адреса в тело пакета. 1:1 NAT решает эту проблему, поскольку транслирует адрес на всех уровнях.
- **Упрощение конфигурации** - вместо десятков правил проброса для одного сервера создаётся одно правило 1:1 NAT и набор правил файрвола.
- **Трансляция подсетей** - 1:1 NAT позволяет транслировать целые подсети с совпадающей маской (например, `/28` на `/28`), что удобно при миграции адресных пространств.

Не следует использовать 1:1 NAT, если:

- Для сервера достаточно открыть один-два порта - проброс портов проще и безопаснее.
- Внешний адрес совпадает с основным WAN IP, а на файрволе работают VPN-сервисы (OpenVPN, IPsec), требующие использования WAN-адреса.
- Необходим NAT только для входящего трафика без изменения исходящего адреса.

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

### Виртуальные IP-адреса (VIP)

Для настройки 1:1 NAT с дополнительным публичным IP-адресом необходимо предварительно создать Virtual IP (VIP) на WAN-интерфейсе. VIP сообщает pfSense, что файрвол должен принимать трафик, адресованный этому дополнительному IP-адресу.

Создание VIP:

1. Перейти в **Firewall > Virtual IPs**.
2. Нажать **Add**.
3. Заполнить параметры:
   - **Type** - IP Alias (для одиночного адреса) или Other (для маршрутизируемых подсетей).
   - **Interface** - WAN (или соответствующий внешний интерфейс).
   - **Address(es)** - публичный IP-адрес с маской подсети (обычно `/32` для одиночного адреса).
   - **Description** - назначение адреса (например, "Mail server public IP").
4. Нажать **Save**, затем **Apply Changes**.

> **Внимание**:
>
> Тип VIP **CARP** используется в конфигурациях высокой доступности (HA). Для 1:1 NAT на автономном файрволе рекомендуется тип **IP Alias**. Тип **Proxy ARP** также допустим, однако IP Alias предпочтительнее, поскольку создаёт адрес непосредственно на интерфейсе, что обеспечивает корректную работу сервисов, привязанных к интерфейсу.

### Маршрутизация

Провайдер должен маршрутизировать дополнительные публичные адреса на WAN-интерфейс файрвола. Без корректной маршрутизации со стороны провайдера 1:1 NAT не будет функционировать - пакеты к внешнему адресу не достигнут файрвола.

Для маршрутизируемых подсетей (/29, /28 и т.д.), предоставленных провайдером, тип VIP следует выбирать в зависимости от способа доставки: IP Alias для адресов, находящихся в одной подсети с WAN-интерфейсом, или Other для адресов, маршрутизируемых через шлюз.

## Настройка 1:1 NAT

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

1. Перейти в **Firewall > NAT**, вкладка **1:1**.
2. Нажать **Add** для создания нового правила.

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

3. Заполнить параметры правила:

| Поле | Описание | Пример значения |
|---|---|---|
| **Interface** | Внешний интерфейс, на котором принимается трафик | WAN |
| **External subnet IP** | Публичный IP-адрес (VIP), назначенный для трансляции | 203.0.113.10 |
| **Internal IP** | Внутренний IP-адрес целевого хоста или подсеть с маской | 10.0.1.50 или 10.0.1.0/24 |
| **Destination** | Ограничение трансляции по адресу назначения (опционально) | Any |
| **Description** | Описание назначения правила | Mail server 1:1 NAT |
| **NAT Reflection** | Режим NAT reflection (использовать системный или переопределить) | Use system default |
| **Negate** | Исключить совпавший трафик из трансляции (инверсия правила) | Не отмечен |

4. Нажать **Save**, затем **Apply Changes**.

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

### Трансляция подсетей

1:1 NAT поддерживает трансляцию целых подсетей при условии совпадения масок. Например, для трансляции блока `/28`:

- **External subnet IP** - `203.0.113.16/28`
- **Internal IP** - `10.0.1.16/28`

В этом случае `203.0.113.17` транслируется в `10.0.1.17`, `203.0.113.18` в `10.0.1.18` и так далее. Последние октеты адресов совпадают, что упрощает документирование и диагностику.

### Ограничение по назначению

Поле **Destination** позволяет ограничить область действия 1:1 NAT. По умолчанию трансляция применяется ко всему трафику (Any). Если указать конкретный адрес или подсеть в поле Destination:

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

Это полезно в сценариях, когда сервер должен использовать разные внешние адреса для трафика к разным направлениям.

## Правила файрвола

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

### Создание правил для 1:1 NAT

Правила создаются на вкладке WAN в **Firewall > Rules**. В качестве адреса назначения следует указывать **внутренний** IP-адрес хоста, поскольку трансляция NAT выполняется до обработки правил файрвола.

Пример набора правил для почтового сервера `10.0.1.50` с 1:1 NAT:

| Действие | Протокол | Источник | Порт назначения | Назначение |
|---|---|---|---|---|
| Pass | TCP | Any | 25 (SMTP) | 10.0.1.50 |
| Pass | TCP | Any | 465 (SMTPS) | 10.0.1.50 |
| Pass | TCP | Any | 993 (IMAPS) | 10.0.1.50 |
| Pass | TCP | Any | 443 (HTTPS) | 10.0.1.50 |

> **Внимание**:
>
> Не создавайте правило "Allow all" на WAN для адреса 1:1 NAT. В отличие от проброса портов, при 1:1 NAT разрешающее правило без ограничений по портам откроет все порты внутреннего сервера для доступа из интернета, включая SSH, RDP, базы данных и другие сервисы, не предназначенные для публичного доступа.

### Распространённые ошибки

1. **Указание внешнего адреса в правиле файрвола** - при 1:1 NAT в правилах WAN необходимо указывать внутренний IP-адрес в поле Destination, поскольку трансляция происходит до фильтрации.
2. **Отсутствие правил файрвола** - без явных разрешающих правил весь входящий трафик блокируется неявным правилом deny, несмотря на настроенный 1:1 NAT.
3. **Конфликт с пробросом портов** - если для того же внешнего IP настроен проброс порта, он перехватит трафик на указанных портах раньше 1:1 NAT.

## Сравнение с пробросом портов

Выбор между 1:1 NAT и пробросом портов зависит от требований конкретного сценария.

| Критерий | 1:1 NAT | Проброс портов |
|---|---|---|
| Количество открытых портов | Все (ограничиваются правилами файрвола) | Только явно указанные |
| Требуется VIP | Да | Нет (можно использовать WAN IP) |
| Исходящий адрес хоста | Транслируется в назначенный VIP | Транслируется в WAN IP (outbound NAT) |
| Сложность настройки | Одно правило NAT + правила файрвола | Одно правило NAT на каждый порт/сервис |
| Рекомендуется для | Серверов с множеством сервисов, DMZ | Единичных сервисов (веб, SSH, RDP) |
| Безопасность по умолчанию | Требует тщательной настройки правил файрвола | Ограничена указанными портами |
| Совместимость с VPN на файрволе | Ограничена (нельзя использовать WAN IP) | Полная |
| Поддержка подсетей | Да | Нет |

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

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

### 1:1 NAT не работает

**Трафик не достигает внутреннего сервера:**

1. Проверить наличие VIP - **Firewall > Virtual IPs**. Без VIP файрвол не принимает трафик на дополнительном адресе.
2. Проверить маршрутизацию от провайдера - выполнить `ping` и `traceroute` к внешнему адресу с внешнего хоста. Пакеты должны доходить до WAN-интерфейса файрвола.
3. Проверить правила файрвола на WAN - убедиться, что существует разрешающее правило с внутренним IP в поле Destination.
4. Проверить журнал файрвола - **Status > System Logs > Firewall**. Заблокированные пакеты отображаются с указанием правила, вызвавшего блокировку.

**Исходящий трафик сервера использует неверный внешний адрес:**

1. Проверить, что правило 1:1 NAT не имеет ограничений в поле Destination, если требуется трансляция всего исходящего трафика.
2. Проверить порядок правил - 1:1 NAT имеет приоритет над outbound NAT. Если правило outbound NAT обрабатывает трафик раньше, возможно наличие конфликта конфигурации.
3. Проверить с помощью внешнего сервиса (например, `curl ifconfig.me` с сервера) - отображаемый адрес должен совпадать с External subnet IP из правила 1:1 NAT.

**NAT reflection не работает:**

При обращении к внешнему адресу из внутренней сети:

1. Проверить настройки NAT reflection в **System > Advanced > Firewall & NAT**, раздел Network Address Translation.
2. Для 1:1 NAT reflection должен быть включён режим **NAT + proxy** или **Pure NAT**.
3. Убедиться, что в правиле 1:1 NAT не установлено переопределение reflection в значение "Disable".

### Диагностические команды

```bash
# Check if VIP responds to ARP
arping -I em0 203.0.113.10

# Verify NAT translation in packet filter
pfctl -s nat

# Check state table for specific host
pfctl -ss | grep 10.0.1.50

# Test connectivity from WAN perspective
tcpdump -i em0 host 203.0.113.10 -n
```

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

### Cisco ASA

В Cisco ASA статическая трансляция настраивается командой `static` (версии до 8.3) или объектами NAT (версии 8.3+).

**ASA 8.3+ (Object NAT):**

```
object network MAIL-SERVER
 host 10.0.1.50
 nat (DMZ,OUTSIDE) static 203.0.113.10
```

Эквивалент в pfSense:

1. Создать VIP `203.0.113.10` на WAN-интерфейсе.
2. Создать правило 1:1 NAT: External `203.0.113.10`, Internal `10.0.1.50`, Interface WAN.
3. Создать правила файрвола на WAN для разрешённых портов.

Ключевое отличие: в ASA ACL применяется к интерфейсу и использует реальные (после трансляции) адреса начиная с версии 8.3. В pfSense правила файрвола всегда оперируют внутренними адресами, поскольку трансляция выполняется до фильтрации.

### FortiGate

В FortiGate аналогом 1:1 NAT является VIP (Virtual IP) с типом "static-nat" без ограничения портов.

```
config firewall vip
    edit "MAIL-SERVER-VIP"
        set extip 203.0.113.10
        set mappedip 10.0.1.50
        set extintf "wan1"
    next
end

config firewall policy
    edit 10
        set srcintf "wan1"
        set dstintf "dmz"
        set srcaddr "all"
        set dstaddr "MAIL-SERVER-VIP"
        set service "SMTP" "SMTPS" "IMAPS" "HTTPS"
        set action accept
    next
end
```

В pfSense конфигурация разделена на три элемента: VIP, правило 1:1 NAT и правила файрвола. В FortiGate VIP объединяет функции VIP и NAT-правила pfSense.

### MikroTik RouterOS

В MikroTik RouterOS 1:1 NAT реализуется комбинацией двух правил NAT: `dst-nat` для входящего и `src-nat` для исходящего трафика.

```
/ip firewall nat
add chain=dstnat dst-address=203.0.113.10 action=dst-nat to-addresses=10.0.1.50
add chain=srcnat src-address=10.0.1.50 action=src-nat to-addresses=203.0.113.10
```

В pfSense оба направления трансляции объединены в одном правиле 1:1 NAT. Это упрощает конфигурацию и исключает несогласованность между правилами входящей и исходящей трансляции.

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

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

- [Проброс портов](/docs/pfsense/nat/pfsense-port-forwarding/) - перенаправление входящего трафика на внутренние серверы по конкретным портам
- [Исходящий NAT](/docs/pfsense/nat/pfsense-outbound-nat/) - управление трансляцией адресов исходящего трафика
- [Правила файрвола](/docs/pfsense/firewall/pfsense-firewall-rules/) - создание правил фильтрации, необходимых для работы 1:1 NAT
- [Обзор NAT в pfSense](/docs/pfsense/nat/) - порядок обработки NAT, поведение по умолчанию и взаимодействие механизмов трансляции

