Сравнение версий

Ключ

  • Эта строка добавлена.
  • Эта строка удалена.
  • Изменено форматирование.

Оглавление

Информация
titleДанная статья связана с
Информация
titleДанная статья применима к
  • 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-соединения;
  • соединений через виртуальную сеть WireGuard.
  • Виртуальный
  • IP-
  • адрес 
  • назначенный в конфигурационном файле виртуального сетевого интерфейса сервера WireGuard  IP-адрес стандарта IPv4, отличный от физического IP-адреса узла.
  • IP-адрес сервера или клиента в виртуальной сети WireGuard. Виртуальные адреса определяются в конфигурационных файлах. Виртуальные адреса не должны совпадать с физическими адресами. Для удобства маршрутизации виртуальные адреса лучше выбирать в одной подсети.
  • Ключ — сформированная по определенным правилам последовательность символов.
  • Контрагент — друга сторона соединения. Для сервера контрагентами являются клиенты, для клиентов контрагентом является сервер
  • ИнформацияВиртуальный IP-адрес для сервера и клиентов назначаются из одной подсети
  • .

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

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

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

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

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

Установка

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

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

    sudo apt update

  2. Установить
  3. инструметы WireGuard
  4. сам WireGuard (пакет wireguard), инструменты для работы с WireGuard (пакет wireguard-tools) и, только на клиентах, пакет средств динамической маршрутизации resolvconf:
    Command

    sudo apt install wireguard wireguard-tools resolvconf

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

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

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

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

    sudo su

    cd /etc/wireguard

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

      sudo mkdir /etc/wireguard

      sudo chmod 644 /etc/wireguard

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

    wg genkey | tee privatekey | wg pubkey > publickey

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

    cat privatekey

    cat publickey

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

    sudo chmod 600 privatekey

    sudo chmod 644 publickey

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

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

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

Информация

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

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

На сервере:

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

  • Ключевая пара — пара из открытого (публичного) и закрытого (приватного) ключей. Обязательный атрибут для создания соединения между сервером и клиентом. Для сервера и для каждого клиента должна быть создана отдельная ключевая пара. Открытый ключ сервера  должен быть передан всем клиентам и указан в из конфигурации. Открытый ключ каждого клиента должен быть передан на сервер и указаны в параметрах этого клиентов в конфигурации сервера. Открытые ключи могут передаваться по незащищенным каналам связи. Передача закрытых ключей нежелательна, поэтому рекомендуется создавать их непосредственно на тех узлах, на которых они будут использоваться.
  • Разделяемый (preshared) ключ — необязательный атрибут для усиления защиты. Разделяемый ключ должен быть одинаковым в конфигурациях клиента и сервера. Для передачи разделяемого ключа должны использоваться защищенные каналы связи.

Далее в примере для хранения ключей используется каталог /etc/wireguard. Содержимое этого каталога защищено от чтения непривилегированными пользователями для предотвращения возможной утечки ключей.  На практике может быть более удобным создавать и хранить ключи в домашнем каталоге пользователя (при условии обеспечения недоступности закрытого ключа посторонним). 

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

  1. Создать закрытый ключ и сохранить его в файле, например, /etc/wireguard/privkey:
    Command

    wg genkey | sudo tee /etc/wireguard/privkey > /dev/null

  2. Ключ создается в защищенном от чтения каталоге. Можно дополнительно запретить его чтение:
    Command
    sudo chmod 600 /etc/wireguard/privkey
  3. Создать парный ранее созданному закрытому ключу открытый ключ и сохранить его в файле, например, /etc/wireguard/pubkey:
    Command

    sudo cat /etc/wireguard/privkey | wg pubkey | tee /etc/wireguard/pubkey

  4. Далее копия открытого ключа должна быть передана контрагенту.

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

  1. Создать разделяемый ключ и сохранить его в файле /etc/wireguard/sharedkey:
    Command

    wg gepsk | sudo tee /etc/wireguard/sharedkey

  2. Далее копия созданного разделяемого ключа должен быть передана контрагенту.

Настройка сервера

  1. Определить имя физической сетевой карты сервера. Для этого можно использовать команду:
    Command
    ip route
    Вывод команды зависит от конфигурации компьютера. Предполагается, что читатель самостоятельно может определить имя физической сетевой карты.
  2. В каталоге /etc/wireguard создать конфигурационный файл /etc/wireguard/wg0.conf со следующим содержимым:command
  3. Блок кода
    Titlesudo nano /etc/wireguard/wg0.conf
    # Параметры собственной конфигурации (в данном случае - сервера)
    [Interface]
    Address = <виртуальный_
  4. IP-
  5. адрес_сервера>
    SaveConfig = false
    PostUp = iptables -A FORWARD -i 
  6. wg0
  7. %i -j ACCEPT; iptables -t nat -A POSTROUTING -o 
  8. eth0
  9. <имя_физической_сетевой_карты> -j MASQUERADE;
    PostDown = iptables -D FORWARD -i 
  10. wg0
  11. %i -j ACCEPT; iptables -t nat -D POSTROUTING -o 
  12. eth0
  13. <имя_физической_сетевой_карты> -j MASQUERADE;
    ListenPort = 51820
    PrivateKey = 
  14. ПРИВАТНЫЙ КЛЮЧ СЕРВЕРА
  15. <закрытый_ключ_сервера>
    
    # Параметры контрагентов (в данном случае - клиентов)
    [Peer]
    PublicKey = 
  16. ПУБЛИЧНЫЙ КЛЮЧ КЛИЕНТА
  17. <публичный_ключ_контрагента>
    PresharedKey = 
  18. ДОПОЛНИТЕЛЬНЫЙ КЛЮЧ КЛИЕНТА
  19. <разделяемый_ключ>
    AllowedIPs = 
  20. 0.0.0.0/0
  21. <виртуальный_адрес_клиента>/32
    Где:
    • [Interface] — секция для определения собственных настроек (в данном случае — сервера);
      • Address

  22. виртуальный IP-адрес сервера WireGuard по которому он будет достунен внутри соединения WireGuard, указывается произвольный IP-адрес, отличный от физического;
  23. SaveConfig — автоматическое сохранение изменений конфигурации интерфейса в файл его конфигурации при их определении через wg set;

      • список виртуальных адресов сервера WireGuard и сетевая маска виртуальной сети WireGuard. разделитель списка — запятая. По этим адресам сервер будет доступен внутри сетей WireGuard. Например:

        Блок кода
        Address = 10.0.0.1/24
      • SaveConfig — если значение параметра true, то при выключении интерфейса его актуальные параметры будут сохранены в конфигурационном файле.

      • PostUp — команда, выполняющаяся после включения интерфейса. Обычно

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

  25. интерфейса 
      • интерфейса wg0 на

  26. физический eth0;
      • физический eth0. Вместо лексемы %i подставляется имя текущего интерфейса WireGuard. Параметр может быть указан несколько раз для определения нескольких действий. Используя параметр PostUp можно исключить указание закрытого ключа в конфигурационном файле, используя следующую конструкцию: 

        Блок кода
        PostUp = wg set %i private-key /etc/wireguard/%i.key
        Также доступен параметр PreUp, задающий действия, выполняемые перед включением интерфейса.
      • PostDown — команда, выполняющаяся при выключении интерфейса.

  27. В примере
      • Обычно это удаление

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

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

  29. ;
      • . В примере используется 51820.

      • PrivateKey

  30. сгенерированный
      • созданный ранее

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

    • [Peer] — секция для определения настроек

  32. клиента, данных
    • контрагента (в данном случае - клиента). Таких секций может быть несколькопо количеству планируемых к подключению клиентов

  33. ;
    • :

      • PublicKey

  34. публичный
      • открытый ключ клиента;

      • PresharedKey

  35. опциональный
      • необязательный параметр,

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

      • AllowedIPs — адрес для маршрутизации (перенаправления) сетевого трафика. Если указано значение 0.0.0.0/0

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

        Блок кода
        AllowedIPs = 10.0.0.2/32
  38. .
  39. Ограничить доступ к файлу конфигурации:
    Command

    sudo chmod 600 /etc.wireguard/wg0.cfg

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

    Command

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

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

    sudo sysctl -p

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

    sudo wg-quick up wg0

    Информация

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

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

    sudo systemctl enable wg-quick@wg0

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

    sudo nmcli connection modify wg0 ipv4.dad-timeout 0

    Перезапустить
  46. Запустить сетевую службу:
    Предупреждение
    • Для включения и выключения виртуального сетевого интерфейса WireGuard нужно использовать
  47. инструмент 
    • инструмент wg-quick. Команды nmcli device connect/disconnect и их аналоги, приводят к ошибке:
       "Ошибка: не удалось добавить/активировать новое подключение: Device class NMDeviceWireGuard had no complete_connection method".
  48. Commandsudo wg-quick down wg0 &&
    • При проверке работы виртуального интерфейса следует учитывать, что после его включения для установки соединений может потребоваться 20 и более секунд.

    Command

    sudo wg-quick up wg0

  49. Проверить статус виртуального сетевого интерфейса:
    Command
    Titlesudo wg show wg0

    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 создать конфигурационный файл /etc/wireguard/wg0 со следующим содержимым:command
  2. Блок кода
    Titlesudo nano /etc/wireguard/wg0.conf
    # Параметры собственной конфигурации (в данном случае — клиента)
    [Interface]

  3. 
    PrivateKey
  4. = ПРИВАТНЫЙ КЛЮЧ КЛИЕНТА
    Address = 
  5.  = <закрытый_ключ>
    Address = <виртуальный_IP-адрес_клиента>
  6. 
    DNS=77.88.8.1

  7. 
    
    # Параметры конфигурации контрагента (в данном случае — сервера)
    [Peer]

  8. 
    PublicKey
  9. = ПУБЛИЧНЫЙ КЛЮЧ СЕРВЕРА
    PresharedKey = ДОПОЛНИТЕЛЬНЫЙ КЛЮЧ КЛИЕНТА
    AllowedIPs =
  10.  = <открытый_ключ_сервера>
    PresharedKey = <разделяемый_ключ>
    # Указание значения 0.0.0.0/0 перенаправит весь трафик на сервер WireGuard. Если это не требуется, то можно указать виртуальный адрес сервера
    AllowedIPs = 0.0.0.0/0

  11. 
    Endpoint = <физический_
  12. IP-
  13. адрес_сервера>:
  14. 51820
    persistent keepalive =
  15. <номер_порта>
    persistent keepalive = 25
    Где:
    • [Interface]

  16.  —
    • секция для определения собственных настроек

  17. клиента;
    • (в данном случае — клиента):

      • PrivateKey

  18. приватный
      • закрытый ключ клиента

  19. ;
      • .

      • Address — виртуальный

  20. IP-адрес 
      • адрес клиента

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

      • DNS — необязательный параметр, список IP-адресов DNS-серверов и поисковых доменов DNS. разделитель списка — запятая. Если параметр задан, то заданный в нем список при включении интерфейса передается службе настройки resolvcong (и удаляется при выключении интерфейса).
  22. DNS — опциональный параметр, IP-адрес DNS-сервера;
    • [Peer] — секция для определения настроек

  23. сервера;
    • контрагента (в данном случае — сервера.

      • PublicKey

  24. публичный
      • открытый ключ сервера

  25. ;
      • .

      • PresharedKey

  26. опциональный
      • необязательный параметр,

  27. дополнительный
      • разделяемый ключ клиента

  28. ;
      • .

      • AllowedIPs список масок перенаправления (маршрутизации сетевого трафика). При значении 0.0.0.0/0

  29. это значение по умолчанию для перенаправления всего сетевого трафика клиента. При необходимости, указывается конкретный физический IP-адрес клиента, трафик с которого будет перенаправляться в WireGuard;
      • контрагенту перенаправляется весь трафик. Используется, например, когда доступ в Интернет должен осуществляться через WireGuard. Если это не требуется, то можно указать виртуальный адрес сервера WireGuard, например: 10.1.1.1/32.

      • Endpoint — физический

  30. IP-
      • адрес и порт сервера (по умолчанию 51820)

  31. ;
      • .

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

  32. Выполнить

  33. Далее выполнить шаги

  34. 2-9 сценария "На сервере".
  35. 3 - 8 настройки сервера.

Изменение настроек и управление соединением

Виртуальный сетевой интерфейс WireGuard Созданный виртуальный сетевой интерфейс доступен через графический интерфейс как новое VPN-соединение:
Image ModifiedДоступна опция автоматического подключения:
Image Removed

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

При работе в командной строке:

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

    interface: wg0

    public key: b6Oy053LK5RRL3akvFP8oCaygL8owqJQE0DJPKAb/w8=

    private key: (hidden)

    listening port: 51820

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

    sudo wg genkey

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

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

    Создать дополнительный ключ клиента:
  • wg-quick up <имя_виртуального_интерфейса>
  • выключить виртуальный интерфейс:
    Command
    wg-quick down <имя_виртуального_интерфейса>
  • Проверить текущую конфигурацию виртуального сетевого интерфейса:
    Command
    sudo wg
  • Якорь
    wgset
    wgset
  • Commandwg genpsk > <файл_дополнительного_ключа>
  • Указать динамические настройки виртуального сетевого интерфейса для текущего сеанса:
  • Якорьwgsetwgset
  • Command

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

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

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

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

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

  • > <файл_для_экспорта_настроек>Пример:
    command
  • sudo wg-quick strip wg0 > wireguard-config.txt

  • Добавить или обновить настройки в текущем файле конфигурации (здесь и далее подразумевается, что файлы конфигурации находятся в каталоге /etc/wireguard):
    Command

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

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

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

Информация

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

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

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

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

Command

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

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

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

Справка по инструменту man wg-quickПодробная справка по инструментам wg и wg-quick доступна в справочной системе man.