• Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.8)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.7), РУСБ.10015-10
  • Astra Linux Special Edition РУСБ.10015-17
  • Astra Linux Special Edition РУСБ.10015-37 (очередное обновление 7.7)
  • Astra Linux Special Edition РУСБ.10015-03 (очередное обновление 7.6)
  • Astra Linux Special Edition РУСБ.10152-02 (очередное обновление 4.7)
  • Astra Linux Special Edition РУСБ.10015-01 (очередное обновление 1.6)
  • Astra Linux Special Edition РУСБ.10015-16 исп. 1
  • Astra Linux Special Edition РУСБ.10015-16 исп. 2
  • Astra Linux Special Edition РУСБ.10265-01 (очередное обновление 8.1)
  • Astra Linux Common Edition 2.12

Аннотация

WireGuard — протокол виртуальных частных сетей (VPN), созданный для обеспечения защищённого соединения между устройствами через ненадёжные или недоверенные сети. Аналог OpenVPN или IPSec. WireGuard создаёт виртуальные сетевые интерфейсы, работающие аналогично физическим сетевым интерфейсам. Каждый интерфейс имеет свой набор правил маршрутизации и криптографические ключи (приватный и публичный). Доступ к приватному ключу должен быть ограничен. Публичные ключи используются для установления доверительных отношений между устройствами (парами или peers).

Особенности протокола WireGuard:

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

Используемые определения:

  • Физический IP-адрес узла — IP-адрес физического сетевого устройства узла, применяемый для сетевых соединений;
  • Виртуальный сетевой интерфейс — эмулируемое с помощью WireGuard виртуальное сетевое устройство, предназначенное для создания VPN-соединения;
  • Виртуальный IP-адрес  — назначенный в конфигурационном файле виртуального сетевого интерфейса сервера WireGuard  IP-адрес стандарта IPv4, отличный от физического IP-адреса узла.

    Виртуальный IP-адрес для сервера и клиентов назначаются из одной подсети.

Описание стенда

Пример начальной конфигурации пары узлов для работы WireGuard:

ПараметрСерверКлиент
Имя узлаwgserverwgclient
Физический IP-адрес узла
<физический_IP-адрес_сервера>не используется в настройке

Название сетевого интерфейса стенда: eth0. (Пример, название может быть произвольным).

Название виртуального сетевого интерфейса стенда: wg0. (Пример, название может быть произвольным).

Установка

На сервере и клиенте:

  1. Обновить репозитории:

    sudo apt update

  2. Установить инструметы WireGuard:

    sudo apt install wireguard wireguard-tools

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

На сервере и клиенте:

  1. Перейти в каталог для хранения конфигурационных файлов WireGuard последовательно выполнив:

    sudo su

    cd /etc/wireguard

    • Если каталога не существует, создать его последовательно выполнив:

      sudo mkdir /etc/wireguard

      sudo chmod 644 /etc/wireguard

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

    wg genkey | tee privatekey | wg pubkey > publickey

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

    cat privatekey

    cat publickey

  4. Ограничить доступ к файлам с ключами WireGuard:

    sudo chmod 600 privatekey

    sudo chmod 644 publickey

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

Настоятельно не рекомендуется распространение или передача приватного ключа.

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


Настройка маршрутизации

На сервере:

  1. В каталоге /etc/wireguard создать конфигурационный файл со следующим содержимым:
    [Interface]
    Address = <виртуальный_IP-адрес_сервера>
    SaveConfig = false
    PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;
    PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;
    ListenPort = 51820
    PrivateKey = ПРИВАТНЫЙ КЛЮЧ СЕРВЕРА

    [Peer] PublicKey = ПУБЛИЧНЫЙ КЛЮЧ КЛИЕНТА
    PresharedKey = ДОПОЛНИТЕЛЬНЫЙ КЛЮЧ КЛИЕНТА AllowedIPs = 0.0.0.0/0
    Где:
    • [Interface] — секция для определения настроек сервера;

      • Address — виртуальный IP-адрес сервера WireGuard по которому он будет достунен внутри соединения WireGuard, указывается произвольный IP-адрес, отличный от физического;

      • SaveConfig автоматическое сохранение изменений конфигурации интерфейса в файл его конфигурации при их определении через wg set;

      • PostUp команда при запуске интерфейса. В примере это добавление правила iptaples, разрешающего перенаправление трафика с виртуального сетевого интерфейса wg0 на физический eth0;

      • PostDown — команда при выключении интерфейса. В примере это удаление предыдущего правила из PostUp;

      • ListenPort — номер сетевого порта для прослушивания входящих соединений;

      • PrivateKey сгенерированный ранее приватный ключ сервера.

    • [Peer] — секция для определения настроек клиента, данных секций может быть несколько по количеству планируемых к подключению клиентов;

      • PublicKey — публичный ключ клиента;

      • PresharedKey — опциональный параметр, дополнительный ключ используется совместно с основной парой в целях усиления защиты соединения;

      • AllowedIPs —  0.0.0.0/0 это значение по умолчанию для перенаправления всего сетевого трафика клиента. При необходимости, указывается конкретный физический IP-адрес клиента, трафик с которого будет перенаправляться в WireGuard.
        Подробная справка о настройках виртуального сетевого интерфейса доступна по команде man wg-quick.

  2. Ограничить доступ к файлу конфигурации:

    sudo chmod 600 wg0.cfg


  3. Включить маршрутизацию на уровне ядра:

    echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf

     

  4. Применить внесённые изменения для ядра:

    sudo sysctl -p


  5. Включить созданный через WireGuard виртуальный сетевой интерфейс:

    sudo wg-quick up wg0

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


  6. Добавить службу инструмента в автозагрузку:

    sudo systemctl enable wg-quick@wg0


  7. Отключить проверку конфликта адресов. По умолчанию механизм включен :

    sudo nmcli connection modify wg0 ipv4.dad-timeout 0


  8. Перезапустить сетевую службу:

    Для включения и выключения виртуального сетевого интерфейса WireGuard нужно использовать инструмент wg-quick. Команды nmcli device connect/disconnect и их аналоги, приводят к ошибке:

     "Ошибка: не удалось добавить/активировать новое подключение: Device class NMDeviceWireGuard had no complete_connection method".


    sudo wg-quick down wg0 && sudo wg-quick up wg0


  9. Проверить статус виртуального сетевого интерфейса:

    interface: wg0
      public key: m5HtgJD/zHHPQBPVW8I/WoLvPfx+rpWolcxRyQVJChQ=
      private key: (hidden)
      listening port: 32823
      fwmark: 0xca6c

    peer: FldFF7ld0SC9ns7d+fWHwhBBomBLGD1F9E0babeYk3o=
      endpoint: 10.0.2.15:51820
      allowed ips: 0.0.0.0/0
      transfer: 0 B received, 296 B sent
      persistent keepalive: every 20 seconds


На клиенте:

  1. В каталоге /etc/wireguard создать конфигурационный файл со следующим содержимым:

    [Interface]
    PrivateKey = ПРИВАТНЫЙ КЛЮЧ КЛИЕНТА

    Address = <виртуальный_IP-адрес_клиента>

    DNS=77.88.8.1

    [Peer]
    PublicKey = ПУБЛИЧНЫЙ КЛЮЧ СЕРВЕРА
    PresharedKey = ДОПОЛНИТЕЛЬНЫЙ КЛЮЧ КЛИЕНТА
    AllowedIPs = 0.0.0.0/0
    Endpoint = <физический_IP-адрес_сервера>:51820
    persistent keepalive = 25

    Где:
    • [Interface] — секция для определения настроек клиента;

      • PrivateKey — приватный ключ клиента;

      • Address — виртуальный IP-адрес клиента WireGuard. Указывается IP-адрес, отличный от физических IP-адресов узлов из той же подсети что и IP-адрес сервера WireGuard ;

      • DNS — опциональный параметр, IP-адрес DNS-сервера;
    • [Peer] — секция для определения настроек сервера;

      • PublicKey — публичный ключ сервера;

      • PresharedKey — опциональный параметр, дополнительный ключ клиента;

      • AllowedIPs0.0.0.0/0 это значение по умолчанию для перенаправления всего сетевого трафика клиента. При необходимости, указывается конкретный физический IP-адрес клиента, трафик с которого будет перенаправляться в WireGuard;

      • Endpoint — физический IP-адрес и порт сервера (по умолчанию 51820);

      • persistent keepalive —задержка в секундах, для удержания соединения при бездействии.

  2. Выполнить шаги 2-9 сценария "На сервере".

Созданный виртуальный сетевой интерфейс доступен через графический интерфейс как новое VPN-соединение:


Доступна опция автоматического подключения:

Изменение настроек

  • Проверить текущую конфигурацию виртуального сетевого интерфейса:

    interface: wg0

    public key: b6Oy053LK5RRL3akvFP8oCaygL8owqJQE0DJPKAb/w8=

    private key: (hidden)

    listening port: 51820


  • Создать новый приватный ключ:

    sudo wg genkey


  • Создать новый публичный ключ на основе приватного:

    wg genkey | tee <файл_приватного_ключа> | wg pubkey > <файл_публичного_ключа>


  • Создать дополнительный ключ клиента:

    wg genpsk > <файл_дополнительного_ключа>


  • Указать динамические настройки виртуального сетевого интерфейса для текущего сеанса:

    sudo wg set <набор_параметров_настройки>

    Перечень доступных настроек указан в man wg в разделе set. Заданные настройки сохраняются до перезагрузки узла.

  • Сохранить динамические настройки, установленные командой wg set в конфигурационный файл /etc/wireguard/<имя_интерфейса>.conf. Используется при смене IP-адресов, указании времени отключения при неактивном подключении и т.д.:

    sudo wg-quick save <имя_виртуального_интерфейса>


  • Экспортировать файл конфигурации в указанное место:

    sudo wg-quick strip <имя_виртуального_интерфейса> > <файл_для_экспорта_настроек>

    • Пример:

      sudo wg-quick strip wg0 > wireguard-config.txt


  • Добавить или обновить настройки в текущем файле конфигурации:

    sudo wg addconf <имя_виртуального_интерфейса> <имя_файла_конфигурации>


  • Указать новый файл конфигурации для виртуального сетевого интерфейса:

    sudo wg setconf <имя_виртуального_интерфейса> <имя_файла_конфигурации>

Инструмент использует файлы конфигурации из /etc/wireguard.

Справка по инструменту wg -h, подробная справка  man wg.

Управление соединением

Управление виртуальным сетевым интерфейсом осуществляется с помощью инструмента wg-quick. Общий синтаксис:

sudo wg-quick <команда> <имя_виртуального_интерфейса>

Где <команда>

  • up — задействовать интерфейс;
  • down — выключить интерфейс;

Справка по инструменту man wg-quick.