Дерево страниц

Вы просматриваете старую версию данной страницы. Смотрите текущую версию.

Сравнить с текущим просмотр истории страницы

« Предыдущий Версия 4 Следующий »

Данная статья применима к

  • 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 создаёт виртуальные сетевые интерфейсы, работающие аналогично физическим сетевым интерфейсам. При передаче данных между виртуальными виртуальными интерфейсами применяются правила маршрутизации и защитное преобразование данных. Далее в примере рассматривается построение виртульной сети с топологией звезда — один сервер и несколько клиентов.

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

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

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

  • Физический адрес — IP-адрес физического сетевого устройства. Адрес, по которому узел доступен в физической сети передачи данных.
  • Виртуальный сетевой интерфейс — создаваемое средствами WireGuard виртуальное сетевое устройство, предназначенное для создания соединений через виртуальную сеть WireGuard.
  • Виртуальный адрес  — IP-адрес сервера или клиента в виртуальной сети WireGuard. Виртуальные адреса определяются в конфигурационных файлах. Виртуальные адреса не должны совпадать с физическими адресами. Для удобства маршрутизации виртуальные адреса лучше выбирать в одной подсети.
  • Ключ — сформированная по определенным правилам последовательность символов.
  • Контрагент — друга сторона соединения. Для сервера контрагентами являются клиенты, для клиентов контрагентом является сервер.

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

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

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

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

Установка

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

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

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

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

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

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

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

  1. Создать закрытый ключ и сохранить его в файле, например, /etc/wireguard/privkey:
    wg genkey | sudo tee /etc/wireguard/privkey > /dev/null
  2. Ключ создается в защищенном от чтения каталоге. Можно дополнительно запретить его чтение:
    sudo chmod 600 /etc/wireguard/privkey
  3. Создать парный ранее созданному закрытому ключу открытый ключ и сохранить его в файле, например, /etc/wireguard/pubkey:
    sudo cat /etc/wireguard/privkey | wg pubkey | tee /etc/wireguard/pubkey
  4. Далее копия открытого ключа должна быть передана контрагенту.

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

  1. Создать разделяемый ключ и сохранить его в файле /etc/wireguard/sharedkey:
    wg gepsk | sudo tee /etc/wireguard/sharedkey
  2. Далее копия созданного разделяемого ключа должен быть передана контрагенту.

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

  1. Определить имя физической сетевой карты сервера. Для этого можно использовать команду:
    ip route
    Вывод команды зависит от конфигурации компьютера. Предполагается, что читатель самостоятельно может определить имя физической сетевой карты.
  2. В каталоге /etc/wireguard создать конфигурационный файл /etc/wireguard/wg0.conf со следующим содержимым
    # Параметры собственной конфигурации (в данном случае - сервера)
    [Interface]
    Address = <виртуальный_адрес_сервера>
    SaveConfig = false
    PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o <имя_физической_сетевой_карты> -j MASQUERADE;
    PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o <имя_физической_сетевой_карты> -j MASQUERADE;
    ListenPort = 51820
    PrivateKey = <закрытый_ключ_сервера>
    
    # Параметры контрагентов (в данном случае - клиентов)
    [Peer]
    PublicKey = <публичный_ключ_контрагента>
    PresharedKey = <разделяемый_ключ>
    AllowedIPs = 0.0.0.0/0
    Где:
    • [Interface] — секция для определения собственных настроек (в данном случае — сервера);
      • Address — виртуальный адрес и сетевая маска сервера WireGuard, по которому он будет доступен внутри сети WireGuard. например:

        Address = 10.0.0.1/24
      • SaveConfig — параметр, определяющий возможность автоматического сохранения изменений конфигурации интерфейса при их изменении командой wg set.

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

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

      • ListenPort — номер сетевого порта для прослушивания входящих соединений. Обычно 51820.

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

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

      • PublicKey — открытый ключ клиента;

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

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

        AllowedIPs = 10.0.0.2/32
  3. Ограничить доступ к файлу конфигурации:
    sudo chmod 600 /etc.wireguard/wg0.cfg
  4. Включить маршрутизацию на уровне ядра:

    echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
  5. Применить внесённые изменения для ядра:
    sudo sysctl -p
  6. Добавить службу инструмента в автозагрузку:
    sudo systemctl enable wg-quick@wg0
  7. Запустить сетевую службу:
    • Для включения и выключения виртуального сетевого интерфейса WireGuard нужно использовать инструмент wg-quick. Команды nmcli device connect/disconnect и их аналоги, приводят к ошибке:
       "Ошибка: не удалось добавить/активировать новое подключение: Device class NMDeviceWireGuard had no complete_connection method".
    • При проверке работы виртуального интерфейса следует учитывать, после его включения для установки соединений может потребоваться 20 и более секунд.

    sudo wg-quick up wg0
  8. Проверить статус виртуального сетевого интерфейса:
    sudo 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 со следующим содержимым:
    # Параметры собственной конфигурации (в данном случае — клиента)
    [Interface]
    PrivateKey = <закрытый_ключ>
    Address = <виртуальный_IP-адрес_клиента>
    DNS=77.88.8.1
    
    # Параметры конфигурации контрагента (в данном случае — сервера)
    [Peer]
    PublicKey = <открытый_ключ_сервера>
    PresharedKey = <разделяемый_ключ>
    AllowedIPs = 0.0.0.0/0
    Endpoint = <физический_адрес_сервера>:<номер_порта>
    persistent keepalive = 25
    Где:
    • [Interface] — секция для определения собственных настроек (в данном случае — клиента):

      • PrivateKey — закрытый ключ клиента.

      • Address — виртуальный адрес клиента.

      • DNS — необязательный параметр, IP-адрес DNS-сервера.
    • [Peer] — секция для определения настроек контрагента (в данном случае — сервера:

      • PublicKey — открытый ключ сервера;

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

      • AllowedIPs — маска перенаправления (маршрутизации сетевого трафика). При значении 0.0.0.0/0 контрагенту перенаправляется весь трафик. Используется, например, когда доступ в Интернет должен осуществляться через WireGuard. ;

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

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

  2. Далее выполнить шаги 3 - 8 настройки сервера.

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

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

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

  • включить виртуальный интерфейс:
    wg-quick up <имя_виртуального_интерфейса>
  • выключить виртуальный интерфейс:
    wg-quick down <имя_виртуального_интерфейса>
  • Проверить текущую конфигурацию виртуального сетевого интерфейса:
    sudo wg
  • Указать динамические настройки виртуального сетевого интерфейса для текущего сеанса:
    sudo wg set <набор_параметров_настройки>
    Перечень доступных настроек указан в man wg в разделе set. Заданные настройки сохраняются до перезагрузки узла.
  • Сохранить динамические настройки, установленные командой wg set в конфигурационный файл /etc/wireguard/<имя_интерфейса>.conf. Используется при смене IP-адресов, указании времени отключения при неактивном подключении и т.д.:
    sudo wg-quick save <имя_виртуального_интерфейса>
  • Вывести файл конфигурации в указанное место:
    sudo wg-quick strip <имя_виртуального_интерфейса>
  • Добавить или обновить настройки в текущем файле конфигурации (здесь и далее подразумевается, что файлы конфигурации находятся в каталоге /etc/wireguard):
    sudo wg addconf <имя_виртуального_интерфейса> <имя_файла_конфигурации>
  • Указать новый файл конфигурации для виртуального сетевого интерфейса:
    sudo wg setconf <имя_виртуального_интерфейса> <имя_файла_конфигурации>

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