WireGuard VPN в VyOS - Современный высокопроизводительный VPN

WireGuard VPN в VyOS - Современный высокопроизводительный VPN

WireGuard - современный, быстрый и безопасный VPN протокол, использующий современную криптографию.

Обзор

WireGuard предлагает:

  • Высокую производительность - значительно быстрее IPsec и OpenVPN
  • Простоту настройки - минималистичная конфигурация
  • Современную криптографию - ChaCha20, Poly1305, Curve25519
  • Малый размер кода - проще аудит и безопасность
  • Быстрое переподключение - идеально для мобильных устройств
  • Работу в ядре - высокая производительность

Протокол: UDP (по умолчанию порт 51820)

Архитектура

WireGuard использует концепцию криптографических маршрутов:

  • Каждый peer имеет пару ключей (приватный + публичный)
  • Peer определяет allowed-ips - какой трафик пускать через туннель
  • Автоматический роуминг - смена IP/порта без переподключения

Генерация ключей

Приватный и публичный ключи

Генерация пары ключей на VyOS:

generate pki wireguard key-pair

Вывод:

Private key: qKIj212...
Public key: yAnz456...

Важно:

  • Приватный ключ держите в секрете
  • Публичный ключ передавайте peer-ам
  • Один ключ на один интерфейс

Pre-shared ключ (опционально)

Дополнительный слой безопасности (post-quantum):

generate pki wireguard preshared-key

Pre-shared ключ добавляется к каждому peer соединению.

Генерация ключей вне VyOS

На Linux/macOS:

wg genkey | tee privatekey | wg pubkey > publickey

На Windows (PowerShell):

wg genkey | Tee-Object -FilePath privatekey | wg pubkey | Out-File publickey

Базовая конфигурация

Создание интерфейса

set interfaces wireguard wg0 address '10.10.0.1/24'
set interfaces wireguard wg0 port '51820'
set interfaces wireguard wg0 private-key '<приватный-ключ>'
commit

Параметры:

  • wg0 - имя интерфейса (может быть любым: wg0, wg1, wg-site1 и т.д.)
  • address - IP адрес VPN туннеля
  • port - UDP порт для прослушивания (по умолчанию 51820)
  • private-key - приватный ключ интерфейса

Добавление peer

set interfaces wireguard wg0 peer <имя-peer> public-key '<публичный-ключ-peer>'
set interfaces wireguard wg0 peer <имя-peer> allowed-ips '10.10.0.2/32'
set interfaces wireguard wg0 peer <имя-peer> allowed-ips '192.168.2.0/24'
set interfaces wireguard wg0 peer <имя-peer> address '<внешний-IP-peer>'
set interfaces wireguard wg0 peer <имя-peer> port '51820'
commit

Параметры peer:

  • public-key - публичный ключ удаленного peer
  • allowed-ips - какой трафик разрешен от/к этому peer
  • address - внешний IP адрес peer (endpoint)
  • port - UDP порт peer

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

Интерфейс

Address

IP адрес туннеля:

set interfaces wireguard wg0 address '10.10.0.1/24'
set interfaces wireguard wg0 address 'fd00::1/64'

Можно указать несколько адресов (IPv4 и IPv6).

Port

UDP порт для входящих соединений:

set interfaces wireguard wg0 port '51820'

Если не указан, будет выбран случайный порт (подходит для клиентов).

Private Key

Приватный ключ интерфейса:

set interfaces wireguard wg0 private-key '<ваш-приватный-ключ>'

Description

Описание интерфейса:

set interfaces wireguard wg0 description 'VPN to Branch Office'

MTU

Максимальный размер пакета:

set interfaces wireguard wg0 mtu '1420'

По умолчанию: 1420 (1500 - 80 байт оверхед WireGuard/IP/UDP).

Peer параметры

Public Key

Публичный ключ peer (обязательный):

set interfaces wireguard wg0 peer branch1 public-key 'yAnz456...'

Allowed IPs

Список сетей/адресов, разрешенных для peer:

set interfaces wireguard wg0 peer branch1 allowed-ips '10.10.0.2/32'
set interfaces wireguard wg0 peer branch1 allowed-ips '192.168.2.0/24'

Критически важно: allowed-ips определяет:

  1. Какой трафик отправлять через туннель к этому peer
  2. От какого источника принимать трафик от peer

Для full-tunnel (весь трафик):

set interfaces wireguard wg0 peer client1 allowed-ips '0.0.0.0/0'

Endpoint (Address + Port)

Внешний адрес peer для инициации соединения:

set interfaces wireguard wg0 peer branch1 address '203.0.113.10'
set interfaces wireguard wg0 peer branch1 port '51820'

Если peer за NAT или с динамическим IP, можно не указывать endpoint на сервере.

Persistent Keepalive

Периодические keepalive пакеты для поддержания NAT mapping:

set interfaces wireguard wg0 peer client1 persistent-keepalive '25'

Значение в секундах. Рекомендуется 25 секунд для клиентов за NAT.

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

  • Peer за NAT
  • Мобильные клиенты
  • Динамические IP адреса

Когда не использовать:

  • Статические публичные IP с обеих сторон
  • Экономия трафика критична

Pre-shared Key

Дополнительный симметричный ключ:

set interfaces wireguard wg0 peer branch1 preshared-key '<psk-ключ>'

Добавляет post-quantum безопасность.

Site-to-Site VPN

Сценарий

Соединить два офиса через интернет:

Site A (HQ):

  • Публичный IP: 198.51.100.1
  • Локальная сеть: 192.168.1.0/24
  • WireGuard IP: 10.10.0.1/30

Site B (Branch):

  • Публичный IP: 203.0.113.10
  • Локальная сеть: 192.168.2.0/24
  • WireGuard IP: 10.10.0.2/30

Конфигурация Site A (HQ)

# Генерация ключей
generate pki wireguard key-pair

# WireGuard интерфейс
set interfaces wireguard wg0 address '10.10.0.1/30'
set interfaces wireguard wg0 description 'VPN to Branch Office'
set interfaces wireguard wg0 port '51820'
set interfaces wireguard wg0 private-key '<private-key-site-a>'

# Peer конфигурация для Site B
set interfaces wireguard wg0 peer branch public-key '<public-key-site-b>'
set interfaces wireguard wg0 peer branch allowed-ips '10.10.0.2/32'
set interfaces wireguard wg0 peer branch allowed-ips '192.168.2.0/24'
set interfaces wireguard wg0 peer branch address '203.0.113.10'
set interfaces wireguard wg0 peer branch port '51820'

# Firewall - разрешить WireGuard
set firewall ipv4 input filter rule 100 action 'accept'
set firewall ipv4 input filter rule 100 destination port '51820'
set firewall ipv4 input filter rule 100 protocol 'udp'
set firewall ipv4 input filter rule 100 description 'Allow WireGuard'

commit
save

Конфигурация Site B (Branch)

# Генерация ключей
generate pki wireguard key-pair

# WireGuard интерфейс
set interfaces wireguard wg0 address '10.10.0.2/30'
set interfaces wireguard wg0 description 'VPN to HQ'
set interfaces wireguard wg0 port '51820'
set interfaces wireguard wg0 private-key '<private-key-site-b>'

# Peer конфигурация для Site A
set interfaces wireguard wg0 peer hq public-key '<public-key-site-a>'
set interfaces wireguard wg0 peer hq allowed-ips '10.10.0.1/32'
set interfaces wireguard wg0 peer hq allowed-ips '192.168.1.0/24'
set interfaces wireguard wg0 peer hq address '198.51.100.1'
set interfaces wireguard wg0 peer hq port '51820'

# Firewall
set firewall ipv4 input filter rule 100 action 'accept'
set firewall ipv4 input filter rule 100 destination port '51820'
set firewall ipv4 input filter rule 100 protocol 'udp'

commit
save

Тестирование

С Site A:

ping 10.10.0.2
ping 192.168.2.1

С Site B:

ping 10.10.0.1
ping 192.168.1.1

Road Warrior (Remote Access)

Сценарий

Сервер VyOS предоставляет VPN доступ для удаленных клиентов.

Сервер:

  • Публичный IP: 198.51.100.1
  • WireGuard IP: 10.20.0.1/24
  • Локальная сеть: 192.168.1.0/24

Клиенты:

  • Каждому клиенту выдается IP из 10.20.0.0/24
  • Доступ к локальной сети 192.168.1.0/24

Конфигурация сервера

# WireGuard интерфейс
set interfaces wireguard wg0 address '10.20.0.1/24'
set interfaces wireguard wg0 description 'Road Warrior VPN'
set interfaces wireguard wg0 port '51820'
set interfaces wireguard wg0 private-key '<server-private-key>'

# Клиент 1
set interfaces wireguard wg0 peer client1 public-key '<client1-public-key>'
set interfaces wireguard wg0 peer client1 allowed-ips '10.20.0.10/32'

# Клиент 2
set interfaces wireguard wg0 peer client2 public-key '<client2-public-key>'
set interfaces wireguard wg0 peer client2 allowed-ips '10.20.0.11/32'

# Клиент 3
set interfaces wireguard wg0 peer client3 public-key '<client3-public-key>'
set interfaces wireguard wg0 peer client3 allowed-ips '10.20.0.12/32'

# Firewall
set firewall ipv4 input filter rule 100 action 'accept'
set firewall ipv4 input filter rule 100 destination port '51820'
set firewall ipv4 input filter rule 100 protocol 'udp'

# Разрешить forward для VPN клиентов
set firewall ipv4 forward filter rule 110 action 'accept'
set firewall ipv4 forward filter rule 110 source address '10.20.0.0/24'

commit
save

Конфигурация клиента (пример для Linux)

Создайте файл /etc/wireguard/wg0.conf:

[Interface]
PrivateKey = <client-private-key>
Address = 10.20.0.10/32
DNS = 192.168.1.1

[Peer]
PublicKey = <server-public-key>
Endpoint = 198.51.100.1:51820
AllowedIPs = 10.20.0.0/24, 192.168.1.0/24
PersistentKeepalive = 25

Запуск:

sudo wg-quick up wg0

Конфигурация клиента (Windows/macOS/iOS/Android)

Используйте официальные клиенты WireGuard и импортируйте конфигурацию выше или через QR-код.

Split-tunnel vs Full-tunnel

Split-tunnel (только корпоративный трафик через VPN):

AllowedIPs = 10.20.0.0/24, 192.168.1.0/24

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

AllowedIPs = 0.0.0.0/0

На сервере для full-tunnel добавьте NAT:

set nat source rule 100 outbound-interface name 'eth0'
set nat source rule 100 source address '10.20.0.0/24'
set nat source rule 100 translation address 'masquerade'

Hub-and-Spoke (звездообразная топология)

Центральный hub соединяет множество spoke sites.

Конфигурация Hub

set interfaces wireguard wg0 address '10.30.0.1/24'
set interfaces wireguard wg0 port '51820'
set interfaces wireguard wg0 private-key '<hub-private-key>'

# Spoke 1
set interfaces wireguard wg0 peer spoke1 public-key '<spoke1-public-key>'
set interfaces wireguard wg0 peer spoke1 allowed-ips '10.30.0.10/32'
set interfaces wireguard wg0 peer spoke1 allowed-ips '192.168.10.0/24'

# Spoke 2
set interfaces wireguard wg0 peer spoke2 public-key '<spoke2-public-key>'
set interfaces wireguard wg0 peer spoke2 allowed-ips '10.30.0.11/32'
set interfaces wireguard wg0 peer spoke2 allowed-ips '192.168.20.0/24'

# Spoke 3
set interfaces wireguard wg0 peer spoke3 public-key '<spoke3-public-key>'
set interfaces wireguard wg0 peer spoke3 allowed-ips '10.30.0.12/32'
set interfaces wireguard wg0 peer spoke3 allowed-ips '192.168.30.0/24'

# Разрешить forward между spoke
set firewall ipv4 forward filter rule 120 action 'accept'
set firewall ipv4 forward filter rule 120 source address '10.30.0.0/24'
set firewall ipv4 forward filter rule 120 destination address '10.30.0.0/24'

commit

Конфигурация Spoke

set interfaces wireguard wg0 address '10.30.0.10/32'
set interfaces wireguard wg0 private-key '<spoke1-private-key>'

set interfaces wireguard wg0 peer hub public-key '<hub-public-key>'
set interfaces wireguard wg0 peer hub allowed-ips '10.30.0.0/24'
set interfaces wireguard wg0 peer hub allowed-ips '192.168.10.0/24'
set interfaces wireguard wg0 peer hub allowed-ips '192.168.20.0/24'
set interfaces wireguard wg0 peer hub allowed-ips '192.168.30.0/24'
set interfaces wireguard wg0 peer hub address '198.51.100.1'
set interfaces wireguard wg0 peer hub port '51820'
set interfaces wireguard wg0 peer hub persistent-keepalive '25'

commit

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

WireGuard не создает маршруты автоматически. Используйте статические маршруты или динамическую маршрутизацию.

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

set protocols static route 192.168.2.0/24 interface wg0

Или через next-hop:

set protocols static route 192.168.2.0/24 next-hop 10.10.0.2

Динамическая маршрутизация (BGP)

WireGuard хорошо работает с BGP для автоматического обмена маршрутами:

set protocols bgp system-as 65001
set protocols bgp neighbor 10.10.0.2 remote-as 65002
set protocols bgp neighbor 10.10.0.2 address-family ipv4-unicast

Операционные команды

Просмотр интерфейсов

Список интерфейсов:

show interfaces wireguard

Детали интерфейса:

show interfaces wireguard wg0

Краткая информация:

show interfaces wireguard wg0 summary

Пример вывода:

interface: wg0
  public key: yAnz456...
  private key: (hidden)
  listening port: 51820

peer: branch
  endpoint: 203.0.113.10:51820
  allowed ips: 10.10.0.2/32, 192.168.2.0/24
  latest handshake: 45 seconds ago
  transfer: 1.2 MiB received, 856 KiB sent

Просмотр ключей

Показать публичный ключ интерфейса:

show interfaces wireguard wg0 public-key

Перезапуск интерфейса

restart wireguard wg0

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

Туннель не поднимается

Проверьте статус:

show interfaces wireguard wg0 summary

Если latest handshake: never, проблемы с соединением.

Чек-лист:

  1. Проверьте firewall на обеих сторонах
  2. Проверьте публичные ключи (должны соответствовать)
  3. Проверьте endpoint адрес и порт
  4. Проверьте NAT traversal

Проверьте firewall:

show firewall ipv4 input filter

Проверьте, слушает ли WireGuard:

sudo netstat -ulnp | grep 51820

Handshake успешен, но нет трафика

Проверьте allowed-ips:

show interfaces wireguard wg0

Убедитесь что allowed-ips включают нужные сети.

Проверьте маршрутизацию:

show ip route

Проверьте firewall forward правила:

show firewall ipv4 forward filter

Низкая производительность

Проверьте MTU:

show interfaces wireguard wg0

Попробуйте уменьшить MTU:

set interfaces wireguard wg0 mtu 1400
commit

Проверьте загрузку CPU:

show system cpu

Peer за NAT не подключается

Добавьте persistent-keepalive на peer за NAT:

set interfaces wireguard wg0 peer client1 persistent-keepalive '25'
commit

Убедитесь, что endpoint не указан на сервере (peer инициирует соединение).

Безопасность

Управление ключами

  1. Генерируйте ключи на каждом устройстве - не передавайте приватные ключи
  2. Храните приватные ключи безопасно - используйте шифрование диска
  3. Ротация ключей - меняйте ключи периодически
  4. Один ключ = один интерфейс - не переиспользуйте ключи

Firewall

Ограничьте доступ к WireGuard порту:

set firewall ipv4 input filter rule 100 action 'accept'
set firewall ipv4 input filter rule 100 destination port '51820'
set firewall ipv4 input filter rule 100 protocol 'udp'
set firewall ipv4 input filter rule 100 source address '0.0.0.0/0'

Для production ограничьте источники:

set firewall ipv4 input filter rule 100 source address '203.0.113.0/24'

Allowed IPs

Будьте осторожны с allowed-ips:

  • Не пересекайте allowed-ips между peer
  • Используйте минимально необходимые сети
  • Для full-tunnel используйте 0.0.0.0/0 осознанно

Pre-shared Keys

Добавьте PSK для post-quantum безопасности:

generate pki wireguard preshared-key
set interfaces wireguard wg0 peer branch preshared-key '<psk>'

Производительность

Оптимизация

WireGuard уже очень быстрый, но можно оптимизировать:

  1. MTU: Правильная настройка избегает фрагментации
  2. CPU: WireGuard эффективно использует многоядерность
  3. Offloading: Включите на физических интерфейсах

Benchmark

Типичная производительность на современном железе:

  • 1 Gbps: ~70% CPU на одном ядре
  • 10 Gbps: Возможно на high-end hardware
  • Latency: +0.5-1ms оверхед

Сравнение с другими VPN

ХарактеристикаWireGuardIPsecOpenVPN
ПроизводительностьОтличноХорошоУдовлетворительно
ПростотаОтличноСложноСредне
БезопасностьОтличноОтличноХорошо
СовместимостьХорошоОтличноОтлично
РоумингОтличноПлохоХорошо
NAT traversalОтличноСложноОтлично

Лучшие практики

  1. Используйте описательные имена peer - branch-office-nyc вместо peer1
  2. Документируйте allowed-ips - что и почему разрешено
  3. Мониторинг handshake - отслеживайте последний handshake
  4. Backup конфигурации - сохраняйте ключи отдельно
  5. Тестируйте failover - проверяйте backup туннели
  6. Persistent keepalive - используйте для NAT traversal
  7. Правильный MTU - избегайте фрагментации
  8. Firewall - защищайте WireGuard порт
  9. Ротация ключей - меняйте ключи регулярно
  10. Мониторинг трафика - отслеживайте аномалии

Миграция с OpenVPN/IPsec

Преимущества миграции на WireGuard

  • Значительно выше производительность
  • Проще конфигурация и maintenance
  • Лучше для мобильных клиентов (быстрое переподключение)
  • Меньше overhead

Стратегия миграции

  1. Запустите WireGuard параллельно существующему VPN
  2. Мигрируйте клиентов постепенно
  3. Тестируйте каждый этап
  4. Отключите старый VPN после полной миграции

Следующие шаги

  • IPsec - если нужна совместимость с другими вендорами
  • OpenVPN - для legacy remote access
  • Firewall - настройка защиты VPN
  • NAT - NAT для VPN трафика