WireGuard интерфейс#

Описание#

WireGuard — коммуникационный протокол и бесплатное программное обеспечение с открытым исходным кодом, который реализует зашифрованные виртуальные частные сети (VPN). . По производительности он значительно превосходит IPSec и OpenVPN. Изначально он был выпущен для ядра Linux, но в настоящее время поддерживается несколькими платформами (Windows, macOS, BSD, iOS, Android) и широко распространен. В настоящее время он находится в стадии активной разработки, но уже сейчас его можно считать наиболее безопасным, простым и удобным в использовании VPN решением в отрасли.

Преимущества WireGuard над другими VPN решениями:

  • Простой в использовании.

  • Использует современную криптографию: Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF и т.д.

  • Компактный читаемый код, проще исследовать на уязвимости.

  • Высокая производительность.

  • Четкая и проработанная спецификация.

Принцип работы WireGuard#

  1. Инициализация и обмен ключами:
    • Каждое устройство, желающее подключиться к VPN, создает пару ключей: закрытый и открытый ключи.

    • Устройства обмениваются своими открытыми ключами.

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

  2. Установление туннеля:
    • После установления общего секретного ключа между двумя устройствами начинается установление защищенного туннеля.

    • Каждое устройство создает виртуальный сетевой интерфейс (например, wg0), который является точкой входа для зашифрованных данных.

  3. Шифрование и передача данных:
    • Данные, отправляемые через VPN, шифруются с использованием общего секретного ключа и упаковываются в зашифрованные пакеты.

    • Зашифрованные пакеты отправляются через защищенный туннель.

  4. Расшифровка и обработка данных на удаленном конце:
    • Удаленное устройство получает зашифрованные пакеты, расшифровывает их с помощью общего секретного ключа и обрабатывает, как обычные сетевые пакеты.

  5. Пересылка данных в локальную сеть:
    • Расшифрованные данные передаются в локальную сеть удаленного устройства и далее к целевым устройствам, которым они предназначены.

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

WireGuard работает на более низком уровне, чем традиционные VPN-протоколы, такие как IPsec, что делает его более эффективным и быстрым. Он также обеспечивает высокую безопасность благодаря использованию современных криптографических примитивов и простоте своей архитектуры.

Примечание

Максимальное преимущество в производительности (по сравнению с OpenVPN и IPSec) будет заметно на Linux системах, так как там WireGuard реализован в виде модуля ядра. Кроме этого поддерживаются macOS, Android, iOS, FreeBSD и OpenBSD, но в них WireGuard выполняется в userspace со всеми вытекающими последствиями для производительности.

Настройка#

Пример настройки#

Пример настройки WireGuard туннеля между двумя площадками.

Пример базовой конфигурацииПример базовой конфигурации

Создание пары ключей#

Для настройки WireGuard туннеля требуется создание пары ключей, которая включает в себя закрытый ключ для расшифровки входящего трафика и открытый ключ для передачи шифрованного трафика.

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

admin@RT-01:~$generate wireguard default-keypair

admin@RT-02:~$generate wireguard default-keypair

Пара ключей будет использоваться по умолчанию на любом настроенном интерфейсе WireGuard, даже если настраивается несколько интерфейсов.

Для получения информации об открытом ключе используйте команду: show wireguard keypairs pubkey default

Команда show wireguard keypairs pubkey default выводит информацию об открытом ключе, который будет передан другому устройству для построения туннеля WireGuard. Ваше устройство будет шифровать весь трафик ,передаваемый в туннеле, используя этот открытый ключ.

Примечание

Если настраивается несколько интерфейсов WireGuard, то каждый из них может иметь свою собственную пару ключей. Для создания такой пары ключей используются именованные пары ключей. Именованные пары ключей могут быть созданы для каждого отдельного сетевого интерфейса.

Настройка туннельных интерфейсов#

Следующим шагом является настройка локальной стороны, а также доверенных адресов назначения на основе политики. Если ваше устройство только инициирует соединение, то настраивать порт прослушивания необязательно. Однако, если ваше устройство выступает в роли сервера и конечные точки инициируют соединения с вашей системой, то необходимо определить порт, к которому могут подключаться клиенты. Если порт будет выбран случайно это может вызвать проблемы при подключении удаленных устройств. Для настройки WireGuar туннеля требуется дополнительная настройка правил межсетевого экрана. Поскольку при каждой перезагрузке устройства порт прослушивания может быть разным, настроенные правила межсетевого экрана для WireGuard туннеля будут не актуальны.

Для настройки туннеля WireGuard потребуется открытый ключ удаленного устройства, а также сеть (сети), которую вы хотите пропускать через туннель allowed-ips.

Перед настройкой WireGuar интерфейсов на устройствах, между которыми будет строиться туннель, необходимо определить закрытий и открытый ключи для этих интерфейсов.

Список команд для определения закрытого и открытого ключей WireGuard интерфейса локального RT-01 и удаленного RT-02 устройств:

admin@RT-01# set interfaces wireguard wg01 private-key KP01
admin@RT-01:~$ show wireguard keypairs pubkey KP01
    EKY0dxRrSD98QHjfHOK13mZ5PJ7hnddRZt5woB3szyw=

admin@RT-02# set interfaces wireguard wg01 private-key KP02
admin@RT-02:~$ show wireguard keypairs pubkey KP02
    XMrlPykaxhdAAiSjhtPlvi30NVkvLQliQuKP7AI7CyI=

После определения открытых ключей для всех устройств, между которыми будет строиться WireGuard туннель, можно переходить к настройкам интерфейсов.

Параметры для настройки WireGuard туннеля на локальном устройстве RT-01:

  • 10.1.0.1/30 - IP адрес WIreGuard интерфейса wg01 на локальном устройстве RT-01.

  • 192.168.2.0/24 - адрес сети внутри туннеля WireGuard на локальном устройстве RT-01.

  • 192.0.2.1 - IP адрес удаленного устройства RT-02.

  • 51820 - номер порта удаленного устройства RT-02.

  • XMrlPykaxhdAAiSjhtPlvi30NVkvLQliQuKP7AI7CyI= - открытый ключ удаленного устройства RT-02.

  • 51820 - номер порта для интерфейса wg01, который будет использовать удаленное устройства RT-02 для инициации соединения с локальным устройством RT-01.

  • Весь трафик для сети 192.168.2.0/24 будет направлен на интерфейс wg01.

Список команд для настойки WireGuard интерфейса на локальном устройстве RT-01:

set interfaces wireguard wg01 address '10.1.0.1/30'
set interfaces wireguard wg01 description 'VPN-to-wg02'
set interfaces wireguard wg01 peer to-RT-02 allowed-ips '192.168.2.0/24'
set interfaces wireguard wg01 peer to-RT-02 address '192.0.2.1'
set interfaces wireguard wg01 peer to-RT-02 port '51820'
set interfaces wireguard wg01 peer to-RT-02 pubkey 'XMrlPykaxhdAAiSjhtPlvi30NVkvLQliQuKP7AI7CyI='
set interfaces wireguard wg01 port '51820'

set protocols static interface-route 192.168.2.0/24 next-hop-interface wg01

Последним шагом является определение интерфейсного маршрута сети 192.168.2.0/24 для прохождения через интерфейс wg01.

Предупреждение

Нельзя назначить один и тот же адрес параметра allowed-ips для нескольких узлов WireGuard.

Параметры для настройки WireGuard туннеля на локальном устройстве RT-01:

  • 10.1.0.2/30 - IP адрес WIreGuard интерфейса wg01 на удаленном устройстве RT-02.

  • 192.168.1.0/24 - адрес сети внутри туннеля WireGuard на удаленном устройстве RT-02.

  • 192.0.2.2 - IP адрес локального устройства RT-01.

  • 51820 - номер порта локального устройства RT-01.

  • EKY0dxRrSD98QHjfHOK13mZ5PJ7hnddRZt5woB3szyw= - открытый ключ локального устройства RT-01.

  • 51820 - номер порта для интерфейса wg01, который будет использовать локальное устройства RT-01 для инициации соединения с удаленным устройством RT-02.

  • Весь трафик для сети 192.168.1.0/24 будет направлен на интерфейс wg01

Список команд для настойки WireGuard интерфейса на удаленном устройстве RT-02:

set interfaces wireguard wg01 address '10.1.0.2/30'
set interfaces wireguard wg01 description 'VPN-to-wg01'
set interfaces wireguard wg01 peer to-RT-01 allowed-ips '192.168.1.0/24'
set interfaces wireguard wg01 peer to-RT-01 address '192.0.2.2'
set interfaces wireguard wg01 peer to-RT-01 port '51820'
set interfaces wireguard wg01 peer to-RT-01 public-key 'EKY0dxRrSD98QHjfHOK13mZ5PJ7hnddRZt5woB3szyw='
set interfaces wireguard wg01 port '51820'

set protocols static route 192.168.1.0/24 interface wg01

Настройка исключений для межсетевого экрана#

Чтобы трафик WireGuard проходил через внешний интерфейс, необходимо добавить исключение в правилах межсетевого экрана на всех устройствах, между которыми будет строиться WireGuard туннель.

Список команд для настойки правил межсетевого экрана:

set firewall name OUTSIDE_LOCAL rule 10 action accept
set firewall name OUTSIDE_LOCAL rule 10 description 'Allow established/related'
set firewall name OUTSIDE_LOCAL rule 10 state established enable
set firewall name OUTSIDE_LOCAL rule 10 state related enable
set firewall name OUTSIDE_LOCAL rule 20 action accept
set firewall name OUTSIDE_LOCAL rule 20 description WireGuard_IN
set firewall name OUTSIDE_LOCAL rule 20 destination port 51820
set firewall name OUTSIDE_LOCAL rule 20 log enable
set firewall name OUTSIDE_LOCAL rule 20 protocol udp
set firewall name OUTSIDE_LOCAL rule 20 source

Также необходимо убедиться, что политика межсетевого экрана OUTISDE_LOCAL привязана к внешнему сетевому интерфейсу для локального трафика интерфейса.

set interfaces ethernet eth0 firewall local name 'OUTSIDE-LOCAL'

Предупреждение

Настройки правил межсетевого экрана будут аналогичны для локального RT-01 и удаленного RT-02 устройств.

После настройки правил для межсетевого экрана убедитесь, что настроенные правила разрешают трафик WireGuard туннеля:

admin@RT01# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.16 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=1.77 ms

admin@RT02# ping 192.168.2.1
PING 192.168.2.1 (192.168.2.1) 56(84) bytes of data.
64 bytes from 192.168.2.1: icmp_seq=1 ttl=64 time=4.40 ms
64 bytes from 192.168.2.1: icmp_seq=2 ttl=64 time=1.02 ms

Настройка симметричного ключа#

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

Для настройки симметричного ключа, выполните команду run generate wireguard preshared-key на локальном устройстве RT-01:

admin@RT01# run generate wireguard preshared-key
rvVDOoc2IYEnV+k5p7TNAmHBMEGTHbPU8Qqg8c/sUqc=

Затем необходимо скопировать полученный ключ и настроить его в качестве предварительно распределённого ключа на локальном RT-01 и удаленном RT-02 устройствах.

Предупреждение

Поскольку это симметричный ключ, его содержимое должно быть известно только вам и вашему удаленному устройству. Обеспечьте безопасное распространение ключа.

Список команд для настройки симметричного ключа шифрования на локальном RT-01 и удаленном RT-02 устройствах:

admin@RT01# set interfaces wireguard wg01 peer to-RT-02 preshared-key 'rvVDOoc2IYEnV+k5p7TNAmHBMEGTHbPU8Qqg8c/sUqc='
admin@RT02# set interfaces wireguard wg01 peer to-RT-01 preshared-key 'rvVDOoc2IYEnV+k5p7TNAmHBMEGTHbPU8Qqg8c/sUqc='

Список команд#

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

  generate wireguard default-keypair#

Создает пару ключей, включающую открытый и закрытый ключи. Пара ключей будет использоваться по умолчанию на любом настроенном интерфейсе WireGuard, даже если настраивается несколько интерфейсов.

generate wireguard named-keypairs <name>#

Создает именованную пару ключей <name>.

set interfaces wireguard <interface> address <address>#

Задает адрес <address> для WireGUard интерфейса <interface>. Адрес может быть указан несколько раз как IPv4 и/или IPv6 адрес, например, 192.0.2.1/24 и/или 2001:db8::1/64.

set interfaces wireguard <interface> description <name>#

Задает псевдоним <description> для сетевого интерфейса <interface>. Например псевдоним может использоваться командой show interfaces или средствами мониторинга на базе SNMP.

set interfaces wireguard <interface> disable#

Отключает сетевой интерфейс <interface>. После отключения интерфейс будет переведен в состояние административного отключения (A/D).

set interfaces wireguard <interface> redirect <text>#

Устанавливает назначение <text> для пересылки входящих на интерфейс WireGuard <interface> пакетов.

set interfaces wireguard <interface> vrf <vrf>#

Размещает сетевой интерфейс <interface> в указанном экземпляре VRF <vrf>.

set interfaces wireguard <interface> peer <text> allowed-ips <network>#

Определяет сеть <network> за локальным устройством, которая будет передаваться через WireGuard интерфейс <interface> на удаленное устройство <text>.

set interfaces wireguard <interface> peer <text> address <address>#

Устанавливает IP адрес <address> удаленного устройства <text>, с которым локальное устройство будет строить туннель через WireGUard интерфейс <interface>.

set interfaces wireguard <interface> peer <text> port <port>#

Определяет номер порта <port> удаленного устройства <text>, с которым локальное устройство будет строить туннель через WireGUard интерфейс <interface>.

set interfaces wireguard <interface> peer <text> pubkey <pubkey>#

Задает открытый ключ в кодировке base64 <pubkey> удаленного устройства <text>, с которым локальное устройство будет строить туннель через WireGUard интерфейс <interface>.

set interfaces wireguard <interface> port <port>#

Определяет номер порта <port>, по которому локальное устройство будет доступно для построения туннеля через интерфейс WireGuard <interface>.

set interfaces wireguard <interface> private-key <name>#

Устанавливает закрытый ключ <name> для использования на WireGuard интерфейсе <interface>.

set interfaces wireguard <interface> peer <text> persistent-keepalive <1-65535>#

Устанавливает интервал отправки сообщений проверки соединения <1-65535> для удаленного устройства <text>, с которым локальное устройство будет строить туннель через WireGUard интерфейс <interface>. Значение для интервала задается в секундах.

set interfaces wireguard <interface> peer <text> preshared-key <preshared-key>#

Задает предварительно распределённый ключ в кодировке base64 <preshared-key> для удаленного устройства <text>, с которым локальное устройство будет строить туннель через WireGUard интерфейс <interface>.

Мониторинг и эксплуатация#

show interfaces wireguard#

Выводит на экран список всех интерфейсов WireGuard

Пример работы команды show interfaces wireguard:

admin@fakel:~$ show interfaces wireguard
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
wg01             10.0.0.1/24                       u/u
show interfaces wireguard <interface>#

Выводит на экран общую информацию о конкретном интерфейсе WireGuard

Пример работы команды show interfaces wireguard <interface>:

admin@fakel:~$ show interfaces wireguard wg01
interface: wg01
  address: 10.0.0.1/24
  public key: h1HkYlSuHdJN6Qv4Hz4bBzjGg5WUty+U1L7DJsZy1iE=
  private key: (hidden)
  listening port: 41751

    RX:  bytes  packets  errors  dropped  overrun       mcast
             0        0       0        0        0           0
    TX:  bytes  packets  errors  dropped  carrier  collisions
             0        0       0        0        0           0
show wireguard keypair pubkey <name>#

Выводит на экран открытую часть для указанного ключа. Это может быть как ключ по умолчанию, так и любая другая именованная пара ключей.

Пример работы команды show wireguard keypair pubkey <name>:

admin@fakel:~$ show wireguard keypair pubkey default
FAXCPb6EbTlSH5200J5zTopt9AYXneBthAySPBLbZwM=
delete wireguard keypair pubkey <name>#

Удаляет пару ключей. Это может быть как ключ по умолчанию, так и любая другая именованная пара ключей.