# Настройка WireGuard VPN в pfSense - полное руководство

> Пошаговая настройка WireGuard в pfSense - создание туннеля, генерация ключей, добавление пиров, назначение интерфейса и правила файрвола.

Source: https://opennix.org/docs/pfsense/vpn/wireguard/pfsense-wireguard-setup/


WireGuard - современный VPN-протокол, реализованный как модуль ядра и обеспечивающий производительность, сопоставимую с аппаратно-ускоренным IPsec, при значительно меньшей сложности конфигурации. Протокол использует фиксированный набор криптографических примитивов (Curve25519, ChaCha20, Poly1305, BLAKE2s), что исключает необходимость согласования параметров шифрования и устраняет целый класс ошибок, связанных с выбором слабых алгоритмов.

В pfSense начиная с версии 2.7 WireGuard доступен как встроенный пакет. В данном руководстве описан полный цикл настройки: от создания туннеля до подключения клиентов на различных платформах и организации site-to-site соединения между двумя площадками.

## Преимущества WireGuard

WireGuard проектировался с акцентом на простоту и производительность. Основные преимущества протокола:

- **Минимальная кодовая база** - около 4000 строк кода ядра, что существенно упрощает аудит безопасности по сравнению с IPsec (~400 000 строк) или OpenVPN (~100 000 строк).
- **Высокая производительность** - работа на уровне ядра исключает переключение контекста между пространствами пользователя и ядра, что даёт пропускную способность до 1 Гбит/с и выше на современном оборудовании.
- **Быстрое установление соединения** - обмен ключами занимает один round-trip (1-RTT), в то время как IKEv2 требует минимум два обмена.
- **Современная криптография** - фиксированный набор алгоритмов исключает downgrade-атаки и ошибки конфигурации.
- **Встроенный роуминг** - протокол автоматически обновляет endpoint при смене IP-адреса клиента, что важно для мобильных устройств.
- **Минимальная поверхность атаки** - WireGuard не отвечает на пакеты от неавторизованных источников (stealth-режим), что делает сервер невидимым для сканеров портов.

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

Перед выбором WireGuard в качестве VPN-протокола необходимо учитывать его ограничения.

### Отсутствие аутентификации по имени пользователя и паролю

WireGuard не поддерживает аутентификацию по логину/паролю. Идентификация пиров выполняется исключительно по криптографическим ключам. Для организаций, требующих централизованного управления учётными записями через LDAP или RADIUS, это может быть существенным ограничением. В таких случаях следует рассматривать [OpenVPN с аутентификацией через RADIUS](/docs/pfsense/vpn/openvpn/pfsense-openvpn-remote-access/).

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

WireGuard не имеет встроенного механизма динамического назначения IP-адресов (аналога DHCP). Каждому пиру необходимо вручную назначить адрес из выделенной подсети туннеля. При большом количестве клиентов это требует ведения учёта назначенных адресов.

### Отсутствие управления сессиями

Протокол не имеет концепции сессий или соединений. Нет возможности отследить, подключён ли клиент в данный момент, за исключением проверки времени последнего handshake на странице **Status > WireGuard**. Принудительное отключение клиента возможно только путём удаления его публичного ключа из конфигурации пира.

### Ограниченное логирование

WireGuard выполняет минимальное логирование на уровне ядра. Информация о попытках подключения, ошибках аутентификации и деталях трафика ограничена. Для средств с повышенными требованиями к аудиту (PCI DSS, HIPAA) это может потребовать дополнительных мер мониторинга.

### Привязка к порту

WireGuard принимает трафик на указанном UDP-порту на всех интерфейсах файрвола, а не только на выбранном. Это необходимо учитывать при планировании правил фильтрации.

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

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

1. **pfSense версии 2.7.0 или новее** - WireGuard доступен как встроенный пакет. Для проверки версии: **System > General Setup**.
2. **Установленный пакет WireGuard** - установка выполняется через **System > Package Manager > Available Packages**. Следует найти `WireGuard` и нажать **Install**.
3. **Статический публичный IP-адрес** или настроенный Dynamic DNS на WAN-интерфейсе pfSense (для сценария удалённого доступа).
4. **Выделенная подсеть для туннеля** - рекомендуется использовать адресацию из диапазона RFC 1918, не пересекающуюся с существующими сетями. Пример: `10.10.10.0/24`.
5. **Открытый UDP-порт** на вышестоящем оборудовании (если pfSense расположен за NAT).

## Создание туннеля

Туннель WireGuard создаётся в разделе **VPN > WireGuard > Tunnels**.

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

| Поле | Значение | Пояснение |
|---|---|---|
| Enable | Установлен | Активация туннеля |
| Description | `WG-RemoteAccess` | Произвольное описание назначения туннеля |
| Listen Port | `51820` | Стандартный порт WireGuard (допустимо изменить) |
| Interface Keys | Generate | Генерация ключевой пары (приватный + публичный) |
| Interface Addresses | `10.10.10.1/24` | Адрес pfSense внутри туннеля |

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

![Настройка туннеля WireGuard](/img/pfsense/pfsense-wireguard-tunnel-edit.webp)
<p style="text-align: center;">Рис. 1. Создание туннеля WireGuard в веб-интерфейсе pfSense</p>

После сохранения система автоматически сгенерирует ключевую пару. Публичный ключ (Public Key) отобразится на странице туннеля - его необходимо скопировать для последующей передачи клиентам.

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

### Выбор порта

Стандартный порт WireGuard - `51820/UDP`. При необходимости использования нескольких туннелей каждому следует назначить уникальный порт. Если WireGuard должен работать из сетей с жёсткими ограничениями исходящего трафика, допустимо использовать порт `443/UDP`, однако это может конфликтовать с HTTPS-трафиком при наличии HAProxy или подобных сервисов.

### Адресация туннеля

Для адресации внутри туннеля рекомендуется выделить отдельную подсеть, не пересекающуюся с другими сетями:

| Сценарий | Рекомендуемая подсеть | Маска |
|---|---|---|
| Удалённый доступ (до 254 клиентов) | `10.10.10.0` | `/24` |
| Site-to-site (два узла) | `10.10.10.0` | `/30` |
| Несколько туннелей | `10.10.10.0`, `10.10.20.0`, ... | `/24` |

## Добавление пиров

Пиры добавляются в разделе **VPN > WireGuard > Peers**. Каждый клиент или удалённый узел является отдельным пиром.

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

| Поле | Значение | Пояснение |
|---|---|---|
| Enable | Установлен | Активация пира |
| Tunnel | `WG-RemoteAccess` | Выбор ранее созданного туннеля |
| Description | `Laptop-Admin` | Описание клиента |
| Dynamic Endpoint | Установлен | Для клиентов с динамическим IP (remote access) |
| Public Key | (ключ клиента) | Публичный ключ, сгенерированный на стороне клиента |
| Pre-Shared Key | (опционально) | Дополнительный уровень защиты (пост-квантовая безопасность) |
| Allowed IPs | `10.10.10.2/32` | Адрес клиента внутри туннеля |
| Keep Alive | `25` | Интервал keepalive в секундах (для клиентов за NAT) |

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

![Настройка пира WireGuard](/img/pfsense/pfsense-wireguard-peer-edit.webp)
<p style="text-align: center;">Рис. 2. Добавление пира WireGuard в pfSense</p>

### Обмен ключами

Обмен публичными ключами между сервером и клиентом выполняется вручную по защищённому каналу:

1. Сервер (pfSense) генерирует ключевую пару при создании туннеля. Публичный ключ сервера передаётся клиенту.
2. Клиент генерирует собственную ключевую пару (средствами клиентского приложения WireGuard). Публичный ключ клиента вводится в поле **Public Key** при добавлении пира на pfSense.

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

### Поле Allowed IPs

Поле **Allowed IPs** определяет, какие IP-адреса допускаются от данного пира и на какие адреса маршрутизируется трафик через туннель. Корректная настройка этого поля критически важна:

| Сценарий | Значение Allowed IPs | Описание |
|---|---|---|
| Удалённый доступ (один клиент) | `10.10.10.2/32` | Только адрес клиента в туннеле |
| Site-to-site | `10.10.10.2/32, 192.168.2.0/24` | Адрес пира + удалённая подсеть |
| Full tunnel (весь трафик через VPN) | `0.0.0.0/0` | Весь IPv4-трафик клиента |
| Full tunnel (IPv4 + IPv6) | `0.0.0.0/0, ::/0` | Весь трафик клиента |

### Pre-Shared Key (PSK)

Использование PSK добавляет симметричный уровень шифрования поверх Curve25519. Это обеспечивает дополнительную защиту в случае компрометации асимметричного алгоритма (пост-квантовая стойкость). PSK генерируется командой:

```bash
wg genpsk
```

Сгенерированный ключ вводится в поле **Pre-Shared Key** как на стороне pfSense (в настройках пира), так и в конфигурации клиента.

## Назначение интерфейса

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

1. Перейти в **Interfaces > Assignments**.
2. В выпадающем списке **Available network ports** выбрать интерфейс `tun_wgN` (где N - номер туннеля).
3. Нажать **Add**.
4. Нажать на имя назначенного интерфейса (например, **OPT1**) для перехода к его настройке.
5. Заполнить параметры:

| Поле | Значение | Пояснение |
|---|---|---|
| Enable | Установлен | Активация интерфейса |
| Description | `WIREGUARD` | Имя интерфейса (будет отображаться в правилах файрвола) |
| IPv4 Configuration Type | None | Адресация уже настроена на уровне туннеля |
| IPv6 Configuration Type | None | Если IPv6 не используется |

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

> **Внимание**:
>
> Параметр **IPv4 Configuration Type** следует оставить в значении **None**, поскольку IP-адрес уже назначен на уровне туннеля WireGuard. Назначение адреса одновременно на уровне интерфейса и туннеля может привести к конфликтам маршрутизации.

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

Для корректной работы WireGuard необходимо создать два набора правил: на интерфейсе WAN (для приёма входящих подключений) и на интерфейсе WireGuard (для контроля трафика внутри туннеля).

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

Разрешает входящие UDP-подключения на порт WireGuard.

Перейти в **Firewall > Rules > WAN** и нажать **Add**.

| Поле | Значение |
|---|---|
| Action | Pass |
| Interface | WAN |
| Address Family | IPv4 |
| Protocol | UDP |
| Source | Any |
| Destination | WAN Address |
| Destination Port Range | `51820` (или выбранный порт туннеля) |
| Description | `Allow WireGuard VPN` |

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

Контролируют, какой трафик разрешён клиентам VPN внутри туннеля.

Перейти в **Firewall > Rules > WIREGUARD** (имя назначенного интерфейса) и нажать **Add**.

**Вариант 1 - разрешить весь трафик** (для тестирования):

| Поле | Значение |
|---|---|
| Action | Pass |
| Interface | WIREGUARD |
| Address Family | IPv4 |
| Protocol | Any |
| Source | WIREGUARD net |
| Destination | Any |
| Description | `Allow all WireGuard traffic` |

**Вариант 2 - разрешить только доступ к LAN** (рекомендуется для производственной среды):

| Поле | Значение |
|---|---|
| Action | Pass |
| Interface | WIREGUARD |
| Address Family | IPv4 |
| Protocol | Any |
| Source | WIREGUARD net |
| Destination | LAN net |
| Description | `Allow WireGuard to LAN` |

Дополнительно можно добавить правило, разрешающее доступ к DNS-серверу pfSense:

| Поле | Значение |
|---|---|
| Action | Pass |
| Interface | WIREGUARD |
| Protocol | TCP/UDP |
| Source | WIREGUARD net |
| Destination | WIREGUARD Address |
| Destination Port Range | `53` |
| Description | `Allow DNS from WireGuard` |

Подробнее о настройке правил фильтрации: [Правила файрвола в pfSense](/docs/pfsense/firewall/pfsense-firewall-rules/).

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

### Стандартная маршрутизация (split tunnel)

По умолчанию WireGuard в режиме split tunnel маршрутизирует через VPN только трафик к подсетям, указанным в **Allowed IPs** на стороне клиента. Весь остальной трафик клиента идёт через его обычное интернет-соединение.

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

### Full tunnel (весь трафик через VPN)

Для направления всего трафика клиента через VPN необходимо:

1. **На стороне клиента**: в конфигурации WireGuard установить `AllowedIPs = 0.0.0.0/0, ::/0`.
2. **На pfSense**: убедиться, что правила файрвола на интерфейсе WireGuard разрешают трафик в Интернет (Destination: Any).
3. **NAT**: настроить Outbound NAT для подсети WireGuard. Перейти в **Firewall > NAT > Outbound**, переключиться в режим **Hybrid** или **Manual** и добавить правило:

| Поле | Значение |
|---|---|
| Interface | WAN |
| Address Family | IPv4 |
| Protocol | Any |
| Source | `10.10.10.0/24` (подсеть туннеля) |
| Destination | Any |
| Translation Address | WAN Address |

### Статические маршруты

При организации site-to-site туннеля может потребоваться добавление статических маршрутов, если pfSense не является шлюзом по умолчанию для подсети за WireGuard.

Перейти в **System > Routing > Static Routes** и добавить маршрут:

| Поле | Значение |
|---|---|
| Destination network | `192.168.2.0/24` (удалённая подсеть) |
| Gateway | Шлюз WireGuard интерфейса |

> **Внимание**:
>
> При настройке маршрутизации через WireGuard необходимо убедиться, что значение **Default gateway** в разделе **System > Routing** не установлено в **Automatic**. В противном случае pfSense может назначить WireGuard-интерфейс шлюзом по умолчанию, что приведёт к потере доступа к Интернету.

## Подключение клиентов

Для подключения к WireGuard-серверу на pfSense клиенту необходимы:

- Публичный ключ сервера (pfSense)
- Публичный IP-адрес или доменное имя сервера
- Порт WireGuard на сервере
- Назначенный IP-адрес клиента внутри туннеля
- Pre-Shared Key (если используется)

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

Конфигурация клиента WireGuard имеет унифицированный формат для всех платформ:

```ini
[Interface]
PrivateKey = <private_key_client>
Address = 10.10.10.2/32
DNS = 10.10.10.1

[Peer]
PublicKey = <public_key_pfsense>
PresharedKey = <psk_if_used>
AllowedIPs = 10.10.10.0/24, 192.168.1.0/24
Endpoint = vpn.example.com:51820
PersistentKeepalive = 25
```

Параметры конфигурации:

| Параметр | Описание |
|---|---|
| `PrivateKey` | Приватный ключ клиента (сгенерированный на клиенте) |
| `Address` | IP-адрес клиента в туннеле (должен совпадать с Allowed IPs на сервере) |
| `DNS` | DNS-сервер для использования при активном туннеле |
| `PublicKey` | Публичный ключ сервера (pfSense) |
| `PresharedKey` | Pre-Shared Key (опционально) |
| `AllowedIPs` | Подсети, маршрутизируемые через туннель |
| `Endpoint` | Адрес и порт сервера WireGuard |
| `PersistentKeepalive` | Интервал keepalive в секундах (обязателен за NAT) |

### Windows

1. Загрузить клиент WireGuard с официального сайта: [wireguard.com/install](https://www.wireguard.com/install/).
2. Установить приложение.
3. Нажать **Add Tunnel > Add empty tunnel** или **Import tunnel(s) from file**.
4. При ручном создании - вставить конфигурацию в текстовое поле. Приватный ключ генерируется автоматически при создании пустого туннеля.
5. Нажать **Save**, затем **Activate**.

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

### macOS

1. Установить WireGuard из Mac App Store или через Homebrew:

```bash
brew install wireguard-tools
```

2. **Графический клиент (App Store)**: импортировать конфигурационный файл `.conf` или создать туннель вручную через интерфейс приложения.

3. **Командная строка**: создать конфигурационный файл и активировать туннель:

```bash
# Generate key pair
wg genkey | tee privatekey | wg pubkey > publickey

# Create configuration
sudo mkdir -p /etc/wireguard
sudo nano /etc/wireguard/wg0.conf

# Activate tunnel
sudo wg-quick up wg0

# Check status
sudo wg show
```

### Linux

1. Установить WireGuard:

```bash
# Debian / Ubuntu
sudo apt install wireguard

# CentOS / RHEL 8+
sudo dnf install wireguard-tools

# Fedora
sudo dnf install wireguard-tools
```

2. Сгенерировать ключевую пару:

```bash
wg genkey | tee /etc/wireguard/privatekey | wg pubkey > /etc/wireguard/publickey
chmod 600 /etc/wireguard/privatekey
```

3. Создать конфигурационный файл `/etc/wireguard/wg0.conf`:

```ini
[Interface]
PrivateKey = <content_of_privatekey>
Address = 10.10.10.2/32
DNS = 10.10.10.1

[Peer]
PublicKey = <public_key_pfsense>
PresharedKey = <psk_if_used>
AllowedIPs = 10.10.10.0/24, 192.168.1.0/24
Endpoint = vpn.example.com:51820
PersistentKeepalive = 25
```

4. Управление туннелем:

```bash
# Activate
sudo wg-quick up wg0

# Deactivate
sudo wg-quick down wg0

# Enable autostart
sudo systemctl enable wg-quick@wg0

# Check status
sudo wg show
```

### iOS

1. Установить приложение WireGuard из App Store.
2. Нажать **+** и выбрать один из вариантов:
   - **Create from QR code** - отсканировать QR-код с конфигурацией (предпочтительный способ).
   - **Create from file or archive** - импортировать файл `.conf`.
   - **Create from scratch** - ввести параметры вручную.
3. Активировать туннель переключателем.

### Android

1. Установить приложение WireGuard из Google Play.
2. Нажать **+** и выбрать:
   - **Scan from QR code** - отсканировать QR-код.
   - **Import from file or archive** - импортировать файл `.conf`.
   - **Create from scratch** - ручной ввод параметров.
3. Активировать туннель.

### Генерация QR-кода

Для мобильных клиентов удобнее всего использовать QR-код. Генерация выполняется на Linux или macOS:

```bash
# Install qrencode
sudo apt install qrencode    # Debian/Ubuntu
brew install qrencode         # macOS

# Generate QR code from configuration file
qrencode -t ansiutf8 < /path/to/client.conf

# Save QR code as PNG
qrencode -t png -o client-qr.png < /path/to/client.conf
```

> **Внимание**:
>
> QR-код содержит приватный ключ клиента. После сканирования кода клиентом файл PNG следует удалить. Не следует передавать QR-код через незащищённые каналы (email, мессенджеры без end-to-end шифрования).

## Site-to-Site

WireGuard позволяет организовать туннель между двумя площадками с pfSense для объединения удалённых сетей. В отличие от IPsec, настройка site-to-site на WireGuard значительно проще и не требует согласования множества криптографических параметров.

### Схема сети

```
Площадка A                          Площадка B
┌─────────────────┐                ┌─────────────────┐
│ LAN: 10.1.0.0/24│                │ LAN: 10.2.0.0/24│
│ WG:  10.10.10.1 │────WireGuard───│ WG:  10.10.10.2 │
│ WAN: 203.0.113.1│                │ WAN: 198.51.100.1│
└─────────────────┘                └─────────────────┘
```

### Настройка площадки A

1. **Создать туннель** (**VPN > WireGuard > Tunnels**):
   - Listen Port: `51820`
   - Interface Address: `10.10.10.1/30`
   - Сгенерировать ключевую пару.

2. **Добавить пир** (**VPN > WireGuard > Peers**):

| Поле | Значение |
|---|---|
| Tunnel | Туннель площадки A |
| Public Key | Публичный ключ площадки B |
| Endpoint | `198.51.100.1` |
| Endpoint Port | `51820` |
| Allowed IPs | `10.10.10.2/32, 10.2.0.0/24` |
| Keep Alive | `25` |

3. **Назначить интерфейс** и создать правила файрвола (аналогично описанному выше).

### Настройка площадки B

Конфигурация площадки B зеркальна:

1. **Туннель**: Listen Port `51820`, Interface Address `10.10.10.2/30`.
2. **Пир**: Public Key площадки A, Endpoint `203.0.113.1:51820`, Allowed IPs `10.10.10.1/32, 10.1.0.0/24`.
3. **Интерфейс и файрвол**: аналогичны площадке A.

### Маршрутизация между площадками

На каждой площадке необходимо добавить статический маршрут к удалённой подсети:

**Площадка A** (**System > Routing > Static Routes**):

| Поле | Значение |
|---|---|
| Destination | `10.2.0.0/24` |
| Gateway | Шлюз WireGuard |

**Площадка B**:

| Поле | Значение |
|---|---|
| Destination | `10.1.0.0/24` |
| Gateway | Шлюз WireGuard |

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

### Проверка связности

```bash
# With the site A check the connectivity with site B LAN
ping 10.2.0.1

# Check the WireGuard tunnel status
# On pfSense: Status > WireGuard
# Check latest handshake timestamp and transferred data
```

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

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

| Характеристика | WireGuard | IPsec (IKEv2) | OpenVPN |
|---|---|---|---|
| Работа на уровне | Ядро | Ядро | Пространство пользователя |
| Производительность | Высокая (1+ Гбит/с) | Высокая (с AES-NI) | Средняя (300-500 Мбит/с) |
| Время установления | 1-RTT (~100 мс) | 4 сообщения IKEv2 | TLS handshake (~500 мс) |
| Кодовая база | ~4 000 строк | ~400 000 строк | ~100 000 строк |
| Аутентификация | Ключи | PSK / Сертификаты / EAP | Сертификаты / LDAP / RADIUS |
| Динамические IP клиентов | Нет | Да (Mode Config) | Да (встроенный DHCP) |
| NAT traversal | Встроенный | NAT-T (UDP 4500) | TCP 443 (обход ограничений) |
| Логирование | Минимальное | Подробное | Подробное |
| Совместимость | Linux, Windows, macOS, iOS, Android | Все платформы, сетевое оборудование | Все платформы |
| Управление сессиями | Нет | Да | Да |
| Поддержка в pfSense | Пакет (с 2.7) | Встроенная | Встроенная |

### Когда выбрать WireGuard

- Требуется максимальная производительность при минимальном overhead.
- Небольшое количество клиентов (до 50) с возможностью ручного управления ключами.
- Не требуется аутентификация по логину/паролю или интеграция с LDAP/RADIUS.
- Важна простота настройки и аудируемость конфигурации.

### Когда выбрать IPsec

- Интеграция с оборудованием третьих сторон (Cisco, FortiGate, MikroTik).
- Требуется совместимость с облачными VPN-шлюзами (AWS VPN, Azure VPN Gateway).
- Необходима поддержка нескольких Phase 2 для разных подсетей.
- Подробнее: [IPsec Site-to-Site VPN](/docs/pfsense/vpn/ipsec/pfsense-ipsec-site-to-site/).

### Когда выбрать OpenVPN

- Требуется аутентификация через LDAP/RADIUS.
- Клиенты подключаются из сетей с жёсткими ограничениями (доступен только TCP 443).
- Необходимо детальное логирование и управление сессиями.
- Подробнее: [OpenVPN сервер удалённого доступа](/docs/pfsense/vpn/openvpn/pfsense-openvpn-remote-access/).

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

### Handshake не устанавливается

Наиболее распространённая проблема - отсутствие завершённого handshake. Проверить состояние можно на странице **Status > WireGuard**.

![Статус WireGuard](/img/pfsense/pfsense-wireguard-status.webp)
<p style="text-align: center;">Рис. 3. Страница Status > WireGuard в pfSense</p>

Возможные причины:

| Симптом | Причина | Решение |
|---|---|---|
| Latest handshake отсутствует | Пакеты не достигают pfSense | Проверить правило файрвола на WAN, убедиться в корректности порта |
| Latest handshake отсутствует | Несовпадение ключей | Проверить, что публичный ключ сервера корректно указан в конфигурации клиента и наоборот |
| Latest handshake отсутствует | PSK не совпадает | Проверить идентичность Pre-Shared Key на обеих сторонах |
| Handshake есть, нет трафика | Некорректный Allowed IPs | Проверить, что Allowed IPs на сервере содержит адрес клиента, а на клиенте - целевые подсети |
| Handshake есть, нет трафика | Отсутствуют правила на интерфейсе WireGuard | Добавить правила на вкладке WIREGUARD |

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

WireGuard использует значение MTU по умолчанию 1420 байт (при стандартном MTU 1500 на физическом интерфейсе). Overhead WireGuard составляет 80 байт для IPv4 (60 байт WireGuard + 20 байт внешний IPv4-заголовок) и 80 байт для IPv6.

Признаки проблем с MTU:

- Ping работает, но HTTP-соединения зависают.
- Передача крупных файлов обрывается.
- SSH работает, но SCP/SFTP зависает на больших файлах.

Решение:

1. На клиенте явно указать MTU в секции `[Interface]`:

```ini
[Interface]
PrivateKey = ...
Address = 10.10.10.2/32
MTU = 1420
```

2. При наличии дополнительной инкапсуляции (PPPoE, VLAN, двойной NAT) уменьшить MTU:

| Сценарий | Рекомендуемый MTU |
|---|---|
| Стандартный (Ethernet 1500) | 1420 |
| PPPoE (MTU 1492) | 1412 |
| Двойной NAT / CGNAT | 1400 |
| За другим VPN-туннелем | 1380 |

### NAT traversal

WireGuard нативно поддерживает работу через NAT. Для корректной работы клиентов за NAT необходимо:

1. Установить `PersistentKeepalive = 25` в конфигурации клиента. Это заставляет клиента отправлять keepalive-пакеты каждые 25 секунд, поддерживая NAT-трансляцию активной.
2. На стороне pfSense в настройках пира указать **Keep Alive**: `25`.

Без keepalive NAT-трансляция истекает (обычно через 30-120 секунд), и сервер теряет возможность отправлять пакеты клиенту.

### Ошибки в Allowed IPs

Некорректная настройка **Allowed IPs** - вторая по распространённости причина проблем:

- **На сервере (pfSense)**: Allowed IPs для каждого пира должны быть уникальными. Два пира не могут иметь пересекающиеся Allowed IPs. Если два пира заявляют `10.10.10.2/32`, трафик будет маршрутизироваться к последнему добавленному пиру.
- **На клиенте**: Allowed IPs определяют, какой трафик направляется в туннель. Значение `0.0.0.0/0` направляет весь трафик, `10.10.10.0/24, 192.168.1.0/24` - только трафик к указанным подсетям (split tunnel).

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

При наличии доступа к командной строке pfSense (SSH или консоль):

```bash
# Check WireGuard interface status
wg show

# Check WireGuard interface details
wg show wg0

# Check routing table
netstat -rn | grep wg

# Check firewall logs for blocked packets
clog /var/log/filter.log | grep 51820

# Check WireGuard kernel module
kldstat | grep if_wg
```

### Проверка доступности порта извне

Для проверки доступности порта WireGuard из внешней сети можно использовать утилиту `nmap` с другого хоста:

```bash
nmap -sU -p 51820 vpn.example.com
```

Статус `open|filtered` является нормальным для WireGuard, поскольку протокол не отвечает на неавторизованные пакеты.

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

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

