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-keyPre-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 определяет:
- Какой трафик отправлять через туннель к этому peer
- От какого источника принимать трафик от 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.1Road 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/24Full-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, проблемы с соединением.
Чек-лист:
- Проверьте firewall на обеих сторонах
- Проверьте публичные ключи (должны соответствовать)
- Проверьте endpoint адрес и порт
- Проверьте NAT traversal
Проверьте firewall:
show firewall ipv4 input filterПроверьте, слушает ли WireGuard:
sudo netstat -ulnp | grep 51820Handshake успешен, но нет трафика
Проверьте 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 cpuPeer за NAT не подключается
Добавьте persistent-keepalive на peer за NAT:
set interfaces wireguard wg0 peer client1 persistent-keepalive '25'
commitУбедитесь, что endpoint не указан на сервере (peer инициирует соединение).
Безопасность
Управление ключами
- Генерируйте ключи на каждом устройстве - не передавайте приватные ключи
- Храните приватные ключи безопасно - используйте шифрование диска
- Ротация ключей - меняйте ключи периодически
- Один ключ = один интерфейс - не переиспользуйте ключи
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 уже очень быстрый, но можно оптимизировать:
- MTU: Правильная настройка избегает фрагментации
- CPU: WireGuard эффективно использует многоядерность
- Offloading: Включите на физических интерфейсах
Benchmark
Типичная производительность на современном железе:
- 1 Gbps: ~70% CPU на одном ядре
- 10 Gbps: Возможно на high-end hardware
- Latency: +0.5-1ms оверхед
Сравнение с другими VPN
| Характеристика | WireGuard | IPsec | OpenVPN |
|---|---|---|---|
| Производительность | Отлично | Хорошо | Удовлетворительно |
| Простота | Отлично | Сложно | Средне |
| Безопасность | Отлично | Отлично | Хорошо |
| Совместимость | Хорошо | Отлично | Отлично |
| Роуминг | Отлично | Плохо | Хорошо |
| NAT traversal | Отлично | Сложно | Отлично |
Лучшие практики
- Используйте описательные имена peer -
branch-office-nycвместоpeer1 - Документируйте allowed-ips - что и почему разрешено
- Мониторинг handshake - отслеживайте последний handshake
- Backup конфигурации - сохраняйте ключи отдельно
- Тестируйте failover - проверяйте backup туннели
- Persistent keepalive - используйте для NAT traversal
- Правильный MTU - избегайте фрагментации
- Firewall - защищайте WireGuard порт
- Ротация ключей - меняйте ключи регулярно
- Мониторинг трафика - отслеживайте аномалии
Миграция с OpenVPN/IPsec
Преимущества миграции на WireGuard
- Значительно выше производительность
- Проще конфигурация и maintenance
- Лучше для мобильных клиентов (быстрое переподключение)
- Меньше overhead
Стратегия миграции
- Запустите WireGuard параллельно существующему VPN
- Мигрируйте клиентов постепенно
- Тестируйте каждый этап
- Отключите старый VPN после полной миграции