# OpenVPN сервер удаленного доступа в pfSense - руководство

> Настройка OpenVPN сервера удаленного доступа в pfSense - создание CA и сертификатов, настройка сервера, правила файрвола и подключение клиентов

Source: https://opennix.org/docs/pfsense/vpn/openvpn/pfsense-openvpn-remote-access/


OpenVPN - наиболее распространённое решение для организации удалённого доступа сотрудников к корпоративной сети через pfSense. Протокол работает в пространстве пользователя, использует SSL/TLS для шифрования и способен функционировать через TCP 443, что позволяет устанавливать соединения даже из сетей с жёсткими ограничениями на исходящий трафик. В pfSense настройка OpenVPN-сервера удалённого доступа выполняется двумя способами: через встроенный визард (мастер настройки) или вручную с полным контролем над каждым параметром.

Данное руководство описывает оба подхода: от подготовки инфраструктуры сертификатов до диагностики типичных проблем подключения. Материал рассчитан на сетевых инженеров с опытом администрирования pfSense и базовым пониманием принципов SSL/TLS.

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

OpenVPN в режиме SSL/TLS требует инфраструктуру открытых ключей (PKI): центр сертификации (CA), серверный сертификат и индивидуальные сертификаты для каждого пользователя. Все операции с сертификатами выполняются через веб-интерфейс pfSense.

### Создание центра сертификации (CA)

Центр сертификации создаётся в разделе **System > Certificates > Authorities**.

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

| Поле | Значение | Пояснение |
|---|---|---|
| Descriptive name | `OpenVPN-CA` | Произвольное имя для идентификации |
| Method | Create an internal Certificate Authority | Создание нового CA |
| Key type | RSA | Рекомендуемый тип ключа |
| Key length | 4096 | Минимально рекомендуемая длина - 2048 |
| Digest Algorithm | SHA256 | Не следует использовать SHA1 |
| Lifetime | 3650 | Срок действия CA в днях (10 лет) |
| Common Name | `OpenVPN-CA` | Уникальное имя CA |
| Country, State, City, Org | По необходимости | Заполняются по требованиям организации |

3. Нажать **Save**.

### Создание серверного сертификата

Серверный сертификат создаётся в разделе **System > Certificates > Certificates**.

1. Нажать **Add/Sign**.
2. Заполнить параметры:

| Поле | Значение | Пояснение |
|---|---|---|
| Method | Create an internal Certificate | Создание нового сертификата |
| Descriptive name | `OpenVPN-Server-Cert` | Имя для идентификации |
| Certificate authority | `OpenVPN-CA` | Ранее созданный CA |
| Key type | RSA | Должен совпадать с типом ключа CA |
| Key length | 2048 | Минимально допустимая длина |
| Digest Algorithm | SHA256 | Совпадает с CA |
| Certificate Type | Server Certificate | Критически важно - клиентский сертификат не подойдёт |
| Lifetime | 825 | Рекомендуемый срок (Apple ограничивает до 825 дней) |
| Common Name | `vpn.example.com` | FQDN или IP-адрес сервера |

3. Нажать **Save**.

### Создание пользовательских сертификатов

Для каждого пользователя VPN необходим индивидуальный сертификат. Создание выполняется в разделе **System > User Manager**.

1. Открыть существующего пользователя или создать нового.
2. В секции **User Certificates** нажать **Add**.
3. Выбрать **Method**: Create an internal Certificate.
4. Указать **Certificate authority**: `OpenVPN-CA`.
5. Установить **Certificate Type**: User Certificate.
6. Нажать **Save**.

> **Внимание**:
>
> Каждому пользователю следует выдавать индивидуальный сертификат. Использование одного сертификата для нескольких пользователей лишает возможности отозвать доступ конкретному сотруднику без влияния на остальных.

## Настройка через визард

OpenVPN Wizard - наиболее быстрый способ развернуть сервер удалённого доступа. Визард автоматически создаёт CA, серверный сертификат, экземпляр сервера и базовые правила файрвола.

Визард запускается через **VPN > OpenVPN > Wizards**.

![OpenVPN Wizard](/img/pfsense/pfsense-openvpn-wizard.webp)
<p style="text-align: center;">Рис. 1. Стартовая страница OpenVPN Wizard в pfSense</p>

### Шаг 1 - Тип аутентификации

Визард предлагает выбор backend-сервера аутентификации:

- **Local User Access** - аутентификация через локальную базу pfSense. Подходит для небольших организаций (до 20 пользователей).
- **LDAP** - аутентификация через Active Directory или OpenLDAP. Рекомендуется при наличии существующей каталожной службы.
- **RADIUS** - аутентификация через RADIUS-сервер (FreeRADIUS, NPS). Обеспечивает наибольшую гибкость, включая поддержку OTP.

### Шаг 2 - Сертификаты

При выборе **Local User Access** визард предложит создать CA и серверный сертификат. Если CA уже существует, допускается использование ранее созданного.

### Шаг 3 - Параметры сервера

Визард предлагает заполнить основные параметры сервера OpenVPN:

| Параметр | Рекомендация |
|---|---|
| Interface | WAN |
| Protocol | UDP on IPv4 only |
| Local Port | 1194 |
| Tunnel Network | `10.8.0.0/24` |
| Local Network(s) | Подсети, к которым разрешён доступ через VPN |
| Concurrent Connections | По количеству пользователей |
| DNS Server 1-4 | DNS-серверы, передаваемые клиентам |

### Шаг 4 - Правила файрвола

Визард предлагает автоматически создать:

- **Firewall Rule** - правило на интерфейсе WAN для входящих подключений на порт 1194/UDP.
- **OpenVPN Rule** - правило на виртуальном интерфейсе OpenVPN, разрешающее трафик из VPN-подсети в локальную сеть.

Рекомендуется разрешить визарду создать оба правила, а затем скорректировать их при необходимости.

> **Внимание**:
>
> Визард не создаёт правила для разрешения трафика между VPN-клиентами (client-to-client). Если взаимодействие клиентов требуется, необходимо настроить его вручную.

## Ручная настройка сервера

Ручная настройка выполняется в разделе **VPN > OpenVPN > Servers**. Нажать **Add** для создания нового экземпляра сервера.

![OpenVPN Server edit](/img/pfsense/pfsense-openvpn-server-edit.webp)
<p style="text-align: center;">Рис. 2. Параметры OpenVPN-сервера в pfSense</p>

### General Information

| Поле | Значение | Пояснение |
|---|---|---|
| Disabled | Не установлен | Снятие флага активирует сервер |
| Server mode | Remote Access (SSL/TLS + User Auth) | Наиболее безопасный режим: двойная проверка (сертификат + логин/пароль) |
| Backend for authentication | Local Database | Или LDAP/RADIUS при интеграции с каталожными службами |
| Device mode | tun - Layer 3 Tunnel Mode | Рекомендуемый режим; tap необходим только для L2-бриджинга |
| Interface | WAN | Интерфейс, на котором сервер принимает подключения |
| Local port | 1194 | Стандартный порт OpenVPN |
| Protocol | UDP on IPv4 only | UDP обеспечивает лучшую производительность; TCP используется при блокировке UDP |

### Cryptographic Settings

| Поле | Значение | Пояснение |
|---|---|---|
| TLS Configuration | Включена | Дополнительный уровень защиты TLS-канала |
| TLS Key | Автоматически сгенерировать | Генерация ключа при первом сохранении |
| TLS Key Usage Mode | TLS Authentication | Обеспечивает HMAC-подпись начальных TLS-пакетов |
| Peer Certificate Authority | `OpenVPN-CA` | Ранее созданный CA |
| Server certificate | `OpenVPN-Server-Cert` | Серверный сертификат |
| DH Parameter Length | 2048 | Группа Диффи-Хеллмана; 4096 для повышенной безопасности |
| ECDH Curve | Не задана (использовать по умолчанию) | Применяется при использовании ECDH |
| Data Encryption Algorithms | AES-256-GCM, AES-128-GCM, CHACHA20-POLY1305 | Клиент и сервер согласуют наилучший вариант |
| Fallback Data Encryption Algorithm | AES-256-CBC | Используется для совместимости со старыми клиентами |
| Auth digest algorithm | SHA256 | Используется при шифровании CBC; GCM-режимы имеют встроенную аутентификацию |

### Tunnel Settings

| Поле | Значение | Пояснение |
|---|---|---|
| IPv4 Tunnel Network | `10.8.0.0/24` | Подсеть для VPN-клиентов; не должна пересекаться с существующими сетями |
| IPv6 Tunnel Network | (пусто) | Заполняется при использовании IPv6 |
| Redirect IPv4 Gateway | Не установлен | Установить для Full Tunnel (весь трафик через VPN) |
| IPv4 Local Network(s) | `10.1.0.0/24, 10.2.0.0/24` | Подсети, доступные через VPN; несколько сетей через запятую |
| IPv4 Remote Network(s) | (пусто) | Используется в site-to-site; для Remote Access не заполняется |
| Concurrent connections | 10 | Максимальное количество одновременных подключений |
| Allow Compression | Refuse any non-stub compression | Сжатие отключено из соображений безопасности (атака VORACLE) |
| Push Compression | Не установлен | |
| Topology | Subnet | Рекомендуемая топология; net30 устарела |
| Type-of-Service | Не установлен | Включать только при необходимости QoS |

### Client Settings

| Поле | Значение | Пояснение |
|---|---|---|
| Dynamic IP | Включено | Позволяет клиентам менять IP без переподключения |
| Topology | Subnet - One IP address per client | |
| DNS Default Domain | `corp.example.com` | Доменный суффикс для VPN-клиентов |
| DNS Server 1-4 | `10.1.0.1` | DNS-серверы, передаваемые через push-опции |
| NTP Server 1-2 | `10.1.0.1` | Серверы точного времени |
| Force DNS cache update | Включено | Обновление DNS-кэша на Windows-клиентах |

### Advanced Configuration

В поле **Custom options** допускается указание директив OpenVPN, не представленных в интерфейсе:

```
push "dhcp-option DOMAIN-SEARCH corp.example.com";
push "dhcp-option DOMAIN-SEARCH dev.example.com";
auth-gen-token 0 external-auth;
reneg-sec 3600;
```

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

Для корректной работы OpenVPN-сервера удалённого доступа необходимы правила на двух интерфейсах.

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

Разрешение входящих подключений к серверу OpenVPN:

| Поле | Значение |
|---|---|
| Action | Pass |
| Interface | WAN |
| Address Family | IPv4 |
| Protocol | UDP |
| Source | Any |
| Destination | WAN address |
| Destination Port | 1194 |
| Description | Allow OpenVPN |

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

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

После создания сервера в pfSense появляется виртуальный интерфейс OpenVPN. По умолчанию на нём отсутствуют разрешающие правила - весь трафик из VPN-туннеля будет блокироваться.

Минимальное правило для доступа к локальной сети:

| Поле | Значение |
|---|---|
| Action | Pass |
| Interface | OpenVPN |
| Address Family | IPv4 |
| Protocol | Any |
| Source | OpenVPN tunnel network (`10.8.0.0/24`) |
| Destination | LAN net |
| Description | VPN clients to LAN |

> **Внимание**:
>
> Правило `Source: Any / Destination: Any` на интерфейсе OpenVPN разрешит VPN-клиентам неограниченный доступ ко всем ресурсам, включая управление pfSense. Следует ограничивать доступ конкретными подсетями и портами в соответствии с принципом наименьших привилегий.

## Split Tunnel и Full Tunnel

Режим туннелирования определяет, какой трафик клиента проходит через VPN.

### Split Tunnel (раздельное туннелирование)

В режиме Split Tunnel через VPN передаётся только трафик, предназначенный для корпоративных подсетей, указанных в поле **IPv4 Local Network(s)**. Весь остальной трафик (интернет, публичные ресурсы) проходит через локальный шлюз клиента.

Преимущества:

- Снижение нагрузки на VPN-канал и корпоративный интернет-шлюз.
- Сохранение доступа к локальным ресурсам (принтеры, IoT-устройства).
- Уменьшение задержки при работе с публичными сервисами.

### Full Tunnel (полное туннелирование)

В режиме Full Tunnel весь клиентский трафик, включая интернет-трафик, маршрутизируется через VPN. Для активации установить флаг **Redirect IPv4 Gateway** в настройках сервера.

Преимущества:

- Весь трафик проходит через корпоративную систему фильтрации и инспекции.
- Защита клиентов от атак в недоверенных сетях (публичный Wi-Fi).
- Единообразное применение политик безопасности.

Дополнительно необходимо настроить DNS-серверы через push-опции, чтобы предотвратить утечку DNS-запросов:

```
push "dhcp-option DNS 10.1.0.1";
push "block-outside-dns";
```

Директива `block-outside-dns` работает только на Windows-клиентах и предотвращает использование DNS-серверов, полученных от локальной сети.

### Комбинированный подход

Для отдельных пользователей допускается переопределение режима через **Client Specific Overrides**. Например, сотрудники ИБ-отдела могут использовать Full Tunnel, а остальные - Split Tunnel.

## Client Specific Overrides

Механизм Client Specific Overrides позволяет задать индивидуальные параметры для конкретных VPN-клиентов. Настройка выполняется в разделе **VPN > OpenVPN > Client Specific Overrides**.

### Назначение фиксированного IP-адреса

Для привязки постоянного IP-адреса к конкретному пользователю:

1. Создать запись в Client Specific Overrides.
2. В поле **Common Name** указать CN из сертификата пользователя (обычно совпадает с именем пользователя).
3. В поле **Advanced** указать:

```
ifconfig-push 10.8.0.100 255.255.255.0;
```

### Предоставление доступа к дополнительным подсетям

Для маршрутизации трафика из подсети за клиентом (например, при работе из домашнего офиса с локальной сетью):

```
iroute 192.168.100.0 255.255.255.0;
push "route 192.168.100.0 255.255.255.0";
```

> **Внимание**:
>
> Директива `iroute` действует только внутри OpenVPN и должна сопровождаться соответствующим маршрутом на уровне сервера (поле **IPv4 Remote Network(s)** или `push "route ..."`), а также правилом файрвола, разрешающим трафик в указанную подсеть.

### Переопределение DNS и шлюза

Для конкретного пользователя допускается переопределение DNS-серверов и режима туннелирования:

```
push "dhcp-option DNS 10.1.0.53";
push "redirect-gateway def1";
push "block-outside-dns";
```

## Многофакторная аутентификация

Базовая аутентификация по сертификату и паролю обеспечивает два фактора: владение (сертификат) и знание (пароль). Для дополнительного усиления рекомендуется добавить одноразовые пароли (TOTP).

### TOTP через FreeRADIUS

1. Установить пакет **FreeRADIUS** через **System > Package Manager**.
2. Настроить RADIUS-сервер на интерфейсе localhost (127.0.0.1), порт 1812.
3. Создать пользователей с OTP-профилями - каждый пользователь получает секрет для генерации TOTP (совместим с Google Authenticator, Microsoft Authenticator).
4. В настройках OpenVPN-сервера установить **Backend for authentication** на RADIUS и указать параметры FreeRADIUS.

При аутентификации пользователь вводит пароль в формате `<password><TOTP-code>` (конкатенация основного пароля и шестизначного кода).

### LDAP с двухфакторной аутентификацией

При использовании LDAP (Active Directory) двухфакторная аутентификация реализуется через:

- **Duo Security** - пакет доступен в pfSense, обеспечивает push-уведомления.
- **RADIUS-прокси** - LDAP-аутентификация через RADIUS-сервер, поддерживающий TOTP (например, privacyIDEA, LinOTP).

## DCO - Data Channel Offload

Data Channel Offload (DCO) - механизм, перемещающий обработку данных OpenVPN из пространства пользователя в ядро операционной системы. Это устраняет накладные расходы на переключение контекста между ядром и процессом OpenVPN, значительно повышая пропускную способность.

### Характеристики DCO

| Аспект | Без DCO | С DCO |
|---|---|---|
| Обработка данных | Userspace (OpenVPN process) | Kernel |
| Пропускная способность | 200-400 Mbit/s (зависит от CPU) | 800-2000 Mbit/s |
| Загрузка CPU | Высокая | Низкая |
| Совместимость | Все режимы | Ограничения (см. ниже) |

### Ограничения DCO

DCO несовместим со следующими конфигурациями:

- Режим **tap** (только tun).
- Сжатие (compression) - должно быть отключено.
- Шифры без аутентификации (CBC без HMAC).
- Опция `--fragment`.
- Режим **Peer-to-Peer (Shared Key)**.

Для активации DCO необходимо установить флаг **Data Channel Offload** в параметрах сервера. При несовместимости конфигурации pfSense отобразит предупреждение.

> **Внимание**:
>
> При активации DCO на существующем сервере все текущие подключения будут разорваны. Клиенты должны поддерживать DCO (OpenVPN 2.6+). Планируйте переключение на период технологического окна.

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

### Клиент не может подключиться

1. **Проверить правило файрвола на WAN** - убедиться, что порт 1194/UDP открыт. Проверка: **Diagnostics > Packet Capture** на интерфейсе WAN, фильтр по порту 1194.
2. **Проверить журналы OpenVPN** - **Status > System Logs > OpenVPN**. Ключевые сообщения:
   - `TLS Error: TLS handshake failed` - проблема с сертификатами или несовпадение TLS-ключей.
   - `AUTH_FAILED` - неверный логин/пароль или заблокированная учётная запись.
   - `Connection reset, restarting` - проблема маршрутизации или NAT.
3. **Проверить время на сервере и клиенте** - расхождение более 5 минут приведёт к отказу проверки сертификатов.
4. **Проверить CRL (Certificate Revocation List)** - если CRL настроен, убедиться, что сертификат клиента не отозван.

### TLS Handshake Failed

Наиболее частые причины:

- **Несовпадение TLS-ключа** - ключ на сервере и клиенте должен быть идентичным. Пересоздать конфигурацию клиента через пакет openvpn-client-export.
- **Истёк сертификат CA или сервера** - проверить сроки действия в **System > Certificates**.
- **Несовпадение алгоритмов шифрования** - убедиться, что клиент поддерживает хотя бы один из алгоритмов, указанных в **Data Encryption Algorithms**.
- **MTU-проблемы** - фрагментация TLS-пакетов. Добавить в Custom options: `fragment 1400; mssfix 1400`.

### Подключение установлено, но нет доступа к ресурсам

1. **Проверить правила на интерфейсе OpenVPN** - убедиться, что трафик из VPN-подсети разрешён.
2. **Проверить маршруты** - на клиенте выполнить `route print` (Windows) или `ip route` (Linux) и убедиться в наличии маршрутов к корпоративным подсетям.
3. **Проверить поле Local Network(s)** - если подсеть не указана, маршрут к ней не будет передан клиенту.
4. **Проверить обратную маршрутизацию** - устройства в корпоративной сети должны иметь маршрут к VPN-подсети (`10.8.0.0/24`) через pfSense. Если pfSense является шлюзом по умолчанию - маршрут существует автоматически.

### Утечка DNS-запросов

При Full Tunnel клиенты могут продолжать использовать локальные DNS-серверы:

1. Убедиться, что в настройках сервера заданы **DNS Server 1-4**.
2. Добавить `push "block-outside-dns"` в Custom options (только Windows).
3. На macOS и Linux утечка DNS предотвращается через скрипты обновления resolv.conf, включённые в конфигурацию клиента.

![OpenVPN Status](/img/pfsense/pfsense-openvpn-status.webp)
<p style="text-align: center;">Рис. 3. Страница Status > OpenVPN - активные подключения и статистика</p>

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

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

