# OpenVPN Site-to-Site туннель в pfSense - настройка

> Настройка OpenVPN site-to-site туннеля в pfSense - соединение офисов через SSL VPN, shared key и TLS режимы, маршрутизация между сетями

Source: https://opennix.org/docs/pfsense/vpn/openvpn/pfsense-openvpn-site-to-site/


OpenVPN site-to-site туннель обеспечивает постоянное зашифрованное соединение между двумя или более площадками, объединяя их локальные сети в единое адресное пространство. В отличие от IPsec, OpenVPN работает в пространстве пользователя поверх SSL/TLS и способен функционировать через TCP 443, что делает его предпочтительным вариантом при работе через сети с жёсткой фильтрацией (корпоративные прокси, гостиничный Wi-Fi, мобильные операторы, блокирующие ESP/IKE).

Данное руководство описывает два режима настройки site-to-site туннеля в pfSense: упрощённый Shared Key и масштабируемый TLS/PKI. Материал рассчитан на сетевых инженеров, имеющих опыт администрирования pfSense и понимание основ маршрутизации.

## Когда выбрать OpenVPN вместо IPsec

Выбор между OpenVPN и IPsec для site-to-site соединений зависит от конкретных условий эксплуатации.

| Критерий | OpenVPN | IPsec |
|---|---|---|
| NAT Traversal | Работает через любой NAT без дополнительной настройки | Требует NAT-T (UDP 4500), возможны проблемы с двойным NAT |
| Обход ограничений | Может работать через TCP 443 | Требует UDP 500/4500 и протокол ESP (IP 50) |
| Производительность | Ниже (userspace, одно ядро CPU) | Выше (kernel-level, аппаратное ускорение) |
| Совместимость | Требует OpenVPN на обеих сторонах | Стандартизирован, совместим с любым оборудованием |
| Простота настройки | Простая (особенно Shared Key) | Сложнее (Phase 1/Phase 2, множество параметров) |
| Масштабирование | Hub-and-spoke через TLS/PKI | Mesh-топология через VTI |

Рекомендация: при подключении площадок через ограничительные сети или при отсутствии совместимого IPsec-оборудования на удалённой стороне следует использовать OpenVPN. При необходимости максимальной производительности и совместимости с оборудованием третьих сторон - [IPsec site-to-site](/docs/pfsense/vpn/ipsec/pfsense-ipsec-site-to-site/).

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

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

1. **Публичные IP-адреса или Dynamic DNS** на обоих узлах. Минимум одна сторона должна иметь статический адрес или FQDN, доступный из интернета.
2. **Непересекающиеся подсети** за обоими узлами:
   - Площадка A (сервер): LAN `10.1.0.0/24`
   - Площадка B (клиент): LAN `10.2.0.0/24`
   - Tunnel Network: `10.8.1.0/30` (для point-to-point достаточно /30)
3. **Согласованные параметры** - обе стороны должны использовать одинаковые алгоритмы шифрования и протокол (UDP/TCP).

## Shared Key режим

Режим Shared Key (Pre-Shared Key) - простейший способ организации site-to-site туннеля между двумя площадками. Вместо PKI-инфраструктуры используется один статический ключ, известный обеим сторонам.

> **Внимание**:
>
> Разработчики OpenVPN объявили режим Shared Key устаревшим. В будущих версиях OpenVPN он будет удалён. Для новых инсталляций рекомендуется использовать TLS/PKI режим.

### Ограничения Shared Key

- Поддерживает только одно соединение peer-to-peer (два узла).
- Не масштабируется - для каждой пары площадок необходим отдельный экземпляр с уникальным портом.
- Компрометация ключа ставит под угрозу весь туннель.
- Нет Perfect Forward Secrecy (PFS).
- Несовместим с DCO (Data Channel Offload).

### Настройка серверной стороны (Площадка A)

Конфигурация выполняется в разделе **VPN > OpenVPN > Servers**.

![OpenVPN Server list](/img/pfsense/pfsense-openvpn-server-list.webp)
<p style="text-align: center;">Рис. 1. Список OpenVPN-серверов в pfSense</p>

1. Нажать **Add** для создания нового сервера.
2. Заполнить параметры:

| Поле | Значение | Пояснение |
|---|---|---|
| Server mode | Peer to Peer (Shared Key) | Режим точка-точка со статическим ключом |
| Device mode | tun - Layer 3 Tunnel Mode | L3-туннель с маршрутизацией |
| Interface | WAN | Интерфейс, принимающий подключения |
| Local port | 1195 | Порт 1194 может быть занят сервером Remote Access |
| Protocol | UDP on IPv4 only | UDP обеспечивает лучшую производительность |
| Shared Key | Автоматически сгенерировать | Ключ генерируется при первом сохранении |
| Data Encryption Algorithms | AES-256-GCM | Рекомендуемый алгоритм |
| Auth digest algorithm | SHA256 | Алгоритм HMAC |
| IPv4 Tunnel Network | `10.8.1.0/30` | Подсеть для туннельного интерфейса |
| IPv4 Remote Network(s) | `10.2.0.0/24` | Подсеть за удалённой стороной |
| Allow Compression | Refuse any non-stub compression | Сжатие отключено |

3. Нажать **Save**.
4. После сохранения открыть сервер повторно и скопировать содержимое поля **Shared Key** - оно потребуется для настройки клиентской стороны.

### Настройка клиентской стороны (Площадка B)

На pfSense площадки B перейти в **VPN > OpenVPN > Clients** и нажать **Add**.

| Поле | Значение | Пояснение |
|---|---|---|
| Server mode | Peer to Peer (Shared Key) | Должен совпадать с сервером |
| Device mode | tun - Layer 3 Tunnel Mode | Должен совпадать с сервером |
| Protocol | UDP on IPv4 only | Должен совпадать с сервером |
| Interface | WAN | Исходящий интерфейс |
| Server host or address | `198.51.100.1` | Публичный IP или FQDN площадки A |
| Server port | 1195 | Порт сервера |
| Shared Key | (вставить ключ с сервера) | Точная копия ключа с площадки A |
| Data Encryption Algorithms | AES-256-GCM | Должен совпадать с сервером |
| Auth digest algorithm | SHA256 | Должен совпадать с сервером |
| IPv4 Tunnel Network | `10.8.1.0/30` | Должен совпадать с сервером |
| IPv4 Remote Network(s) | `10.1.0.0/24` | Подсеть за серверной стороной |
| Allow Compression | Refuse any non-stub compression | Должен совпадать с сервером |

> **Внимание**:
>
> Все криптографические параметры (алгоритмы шифрования, HMAC, Shared Key) должны быть идентичны на обеих сторонах. Несовпадение приведёт к отказу в установлении туннеля без информативного сообщения об ошибке.

## TLS/PKI режим

Режим TLS/PKI (Peer to Peer SSL/TLS) использует сертификаты X.509 для аутентификации и обеспечивает масштабируемость, Perfect Forward Secrecy и совместимость с DCO. Это рекомендуемый режим для новых инсталляций.

### Подготовка сертификатов

Требуется создать:

1. **CA** - в разделе **System > Certificates > Authorities** (если CA ещё не создан).
2. **Серверный сертификат** - тип Server Certificate, привязанный к CA.
3. **Клиентский сертификат** - тип User Certificate для каждой удалённой площадки. Создаётся в **System > Certificates > Certificates** (не через User Manager, поскольку site-to-site не требует учётных записей пользователей).

Подробная инструкция по созданию сертификатов приведена в разделе [OpenVPN сервер удаленного доступа](/docs/pfsense/vpn/openvpn/pfsense-openvpn-remote-access/).

### Настройка серверной стороны

Конфигурация выполняется в разделе **VPN > OpenVPN > Servers**.

| Поле | Значение | Пояснение |
|---|---|---|
| Server mode | Peer to Peer (SSL/TLS) | Режим точка-точка с сертификатами |
| Device mode | tun - Layer 3 Tunnel Mode | |
| Interface | WAN | |
| Local port | 1195 | |
| Protocol | UDP on IPv4 only | |
| TLS Configuration | Включена | |
| Peer Certificate Authority | `OpenVPN-CA` | CA, подписавший сертификаты |
| Server certificate | `OpenVPN-Server-Cert` | Серверный сертификат |
| DH Parameter Length | 2048 | |
| Data Encryption Algorithms | AES-256-GCM | |
| IPv4 Tunnel Network | `10.8.1.0/24` | /24 при использовании нескольких клиентов |
| IPv4 Remote Network(s) | `10.2.0.0/24` | Подсети за удалёнными площадками |

Для режима TLS с несколькими клиентами (hub-and-spoke) поле **IPv4 Remote Network(s)** заполняется подсетями всех удалённых площадок через запятую.

### Настройка клиентской стороны

На pfSense удалённой площадки: **VPN > OpenVPN > Clients > Add**.

| Поле | Значение | Пояснение |
|---|---|---|
| Server mode | Peer to Peer (SSL/TLS) | |
| Device mode | tun - Layer 3 Tunnel Mode | |
| Protocol | UDP on IPv4 only | |
| Interface | WAN | |
| Server host or address | `198.51.100.1` | Публичный IP площадки A |
| Server port | 1195 | |
| TLS Configuration | Включена | |
| Peer Certificate Authority | `OpenVPN-CA` | Тот же CA |
| Client certificate | `Site-B-Cert` | Клиентский сертификат площадки B |
| Data Encryption Algorithms | AES-256-GCM | |
| IPv4 Tunnel Network | `10.8.1.0/24` | Совпадает с сервером |
| IPv4 Remote Network(s) | `10.1.0.0/24` | Подсеть за серверной стороной |

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

Корректная маршрутизация - ключевой элемент работающего site-to-site туннеля. OpenVPN использует два механизма передачи информации о маршрутах.

### Поле Remote Network(s) vs iroute

- **IPv4 Remote Network(s)** в настройках сервера - создаёт маршрут на уровне операционной системы, указывающий, что трафик к указанным подсетям следует направлять в OpenVPN-интерфейс.
- **iroute** в Client Specific Overrides - сообщает процессу OpenVPN, какой клиент обслуживает конкретную подсеть. Без iroute OpenVPN не знает, через какое туннельное соединение отправлять пакеты.

В режиме TLS с несколькими клиентами необходимо настроить **оба** механизма:

1. В настройках сервера указать все удалённые подсети в **IPv4 Remote Network(s)**.
2. Для каждого клиента создать запись в **Client Specific Overrides** с директивой `iroute`:

```
iroute 10.2.0.0 255.255.255.0;
```

В режиме Shared Key iroute не используется - маршрутизация определяется полем **Remote Network(s)** на обеих сторонах.

### Статические маршруты на внутренних устройствах

Устройства в локальных сетях обеих площадок должны иметь маршрут к подсетям удалённой стороны через pfSense. Если pfSense является шлюзом по умолчанию, маршруты создаются автоматически. В противном случае необходимо добавить статические маршруты на маршрутизаторах или L3-коммутаторах.

## Multi-site hub-and-spoke

Топология hub-and-spoke позволяет подключить несколько удалённых площадок (spoke) к центральному офису (hub) через единый экземпляр OpenVPN-сервера в режиме TLS/PKI.

### Архитектура

```
          ┌──────────────┐
          │   Hub (HQ)   │
          │  10.1.0.0/24 │
          │  OpenVPN     │
          │  Server      │
          └──────┬───────┘
                 │
        ┌────────┼────────┐
        │        │        │
   ┌────▼───┐ ┌──▼────┐ ┌─▼──────┐
   │ Spoke1 │ │ Spoke2│ │ Spoke3 │
   │10.2.0/24│ │10.3.0/24│ │10.4.0/24│
   └────────┘ └───────┘ └────────┘
```

### Настройка Hub

На центральном pfSense создаётся один сервер OpenVPN в режиме **Peer to Peer (SSL/TLS)** с параметрами:

- **IPv4 Tunnel Network**: `10.8.1.0/24` - достаточно для адресации всех spoke.
- **IPv4 Remote Network(s)**: `10.2.0.0/24, 10.3.0.0/24, 10.4.0.0/24` - все подсети spoke.

Для каждого spoke создаётся запись в **Client Specific Overrides**:

Spoke 1 (Common Name: `spoke1-cert`):
```
iroute 10.2.0.0 255.255.255.0;
```

Spoke 2 (Common Name: `spoke2-cert`):
```
iroute 10.3.0.0 255.255.255.0;
```

Spoke 3 (Common Name: `spoke3-cert`):
```
iroute 10.4.0.0 255.255.255.0;
```

### Взаимодействие между spoke

По умолчанию spoke-площадки не могут взаимодействовать напрямую - весь трафик проходит через hub. Для этого необходимо:

1. Включить опцию **Inter-client communication** на сервере (или добавить `client-to-client` в Custom options).
2. На каждом spoke добавить маршруты к подсетям других spoke через VPN (поле **IPv4 Remote Network(s)**).

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

### Правила на WAN

Аналогично серверу Remote Access - разрешить входящие подключения на порт сервера:

| Поле | Значение |
|---|---|
| Action | Pass |
| Interface | WAN |
| Protocol | UDP |
| Source | IP удалённой площадки (или Any) |
| Destination | WAN address |
| Destination Port | 1195 |
| Description | Allow OpenVPN S2S |

При известном фиксированном IP удалённой площадки рекомендуется указать его в поле Source для ограничения поверхности атаки.

### Правила на интерфейсе OpenVPN

Разрешить трафик между подсетями площадок:

| Поле | Значение |
|---|---|
| Action | Pass |
| Interface | OpenVPN |
| Protocol | Any |
| Source | Подсеть удалённой площадки |
| Destination | LAN net |
| Description | Site B to LAN |

Для ограничения доступа следует создать правила, разрешающие только необходимые протоколы и порты. Подробнее - в разделе [Правила файрвола в pfSense](/docs/pfsense/firewall/pfsense-firewall-rules/).

## Сравнение с IPsec

Выбор между OpenVPN и IPsec site-to-site зависит от конкретного сценария.

### Когда OpenVPN предпочтительнее

- **NAT-проблемы** - удалённая площадка находится за двойным NAT, или провайдер блокирует протокол ESP.
- **TCP-фолбэк** - необходимость работы через TCP 443 при блокировке UDP.
- **Простота настройки** - Shared Key режим требует минимального количества параметров.
- **Однородное оборудование** - на обеих сторонах установлен pfSense или другая система с поддержкой OpenVPN.
- **Динамические IP** - OpenVPN корректно работает при смене IP-адресов с обеих сторон (при использовании DDNS).

### Когда IPsec предпочтительнее

- **Производительность** - IPsec обрабатывается на уровне ядра с аппаратным ускорением (AES-NI). Для каналов свыше 500 Mbit/s IPsec значительно эффективнее.
- **Совместимость** - подключение к оборудованию третьих сторон (Cisco, Juniper, облачные провайдеры), не поддерживающему OpenVPN.
- **Стандартизация** - корпоративные политики могут требовать использования стандартизированных протоколов (IKEv2, ESP).
- **Mesh-топология** - IPsec с VTI обеспечивает более гибкую маршрутизацию между множеством площадок.

Подробнее о настройке IPsec - в разделе [IPsec Site-to-Site VPN](/docs/pfsense/vpn/ipsec/pfsense-ipsec-site-to-site/).

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

### Туннель поднялся, но трафик не проходит

1. **Проверить маршруты** - на обеих сторонах выполнить **Diagnostics > Routes** и убедиться в наличии маршрутов к удалённым подсетям через OpenVPN-интерфейс.
2. **Проверить iroute** - в режиме TLS с несколькими клиентами убедиться, что для каждого клиента настроена директива `iroute` в Client Specific Overrides.
3. **Проверить правила файрвола** - на интерфейсе OpenVPN должны присутствовать правила, разрешающие трафик из удалённой подсети.
4. **Проверить обратную маршрутизацию** - устройства на удалённой площадке должны иметь маршрут обратно к локальной подсети через pfSense.

### Туннель не устанавливается

1. **Проверить логи OpenVPN** - **Status > System Logs > OpenVPN** на обеих сторонах.
2. **Убедиться в доступности порта** - **Diagnostics > Packet Capture** на WAN, фильтр по порту сервера.
3. **Проверить совпадение параметров** - алгоритмы шифрования, HMAC, протокол, tunnel network должны быть идентичны.
4. **Проверить сертификаты** (режим TLS) - оба сертификата должны быть подписаны одним CA, сроки действия не истекли.
5. **Проверить Shared Key** (режим PSK) - ключ должен быть скопирован полностью, без пробелов в начале/конце.

### Проблемы с MTU

Симптомы: мелкие пакеты (ping, DNS) проходят, крупные (HTTP, SMB) - нет. Решение:

1. Добавить в Custom options на обеих сторонах:

```
fragment 1400;
mssfix 1400;
```

2. Если туннель проходит через сети с пониженным MTU (PPPoE, MPLS), уменьшить значение до 1300.
3. Альтернативно - установить **MSS Clamping** в правилах файрвола pfSense.

### Периодические разрывы соединения

1. **Проверить keepalive** - убедиться, что параметры ping/ping-restart согласованы на обеих сторонах. Рекомендуемые значения: `ping 10; ping-restart 60`.
2. **Проверить rekeying** - если при смене ключей туннель разрывается, увеличить `reneg-sec` или убедиться, что обе стороны поддерживают одинаковые алгоритмы.
3. **Проверить ISP** - некоторые провайдеры сбрасывают долгоживущие UDP-сессии. Переключение на TCP может решить проблему.

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

- [OpenVPN сервер удалённого доступа](/docs/pfsense/vpn/openvpn/pfsense-openvpn-remote-access/) - настройка OpenVPN для подключения удалённых сотрудников
- [Экспорт клиентских конфигураций](/docs/pfsense/vpn/openvpn/pfsense-openvpn-client-export/) - генерация конфигурационных файлов через пакет openvpn-client-export
- [IPsec Site-to-Site VPN](/docs/pfsense/vpn/ipsec/pfsense-ipsec-site-to-site/) - альтернативный вариант site-to-site через IPsec
- [Правила файрвола в pfSense](/docs/pfsense/firewall/pfsense-firewall-rules/) - управление правилами для VPN-трафика

