Данная статья связана с
Данная статья применима к
- 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 OpenVPN или IPSec. WireGuard создаёт виртуальные сетевые интерфейсы, работающие аналогично физическим сетевым интерфейсам. При передаче данных между виртуальными виртуальными интерфейсами применяются правила маршрутизации и защитное преобразование данных. Далее в примере рассматривается построение виртульной сети с топологией звезда — один сервер и несколько клиентов. протокол виртуальных частных сетей (VPN), созданный для обеспечения защищённого соединения между устройствами через недоверенные сети. Может считаться функциональным аналогом
Особенности протокола WireGuard:
- протокол работает на уровне ядра операционной системы;
- соединение устанавливается между сервером и доверенными клиентами, указанными в конфигурации сервера;
- автоматически поддерживается соединение даже при изменении IP-адресов клиентов.
Используемые определения:
- Физический адрес
- Виртуальный сетевой интерфейс
- Виртуальный адрес
- Контрагент — друга сторона соединения. Для сервера контрагентами являются клиенты, для клиентов контрагентом является сервер.
Описание стенда
Пример начальной конфигурации пары узлов для работы WireGuard:
Имя узла | wgserver | wgclient |
Физический адрес узла | Фиксированный IP-адрес, доступный для клиентов. Далее обозначается как <физический_адрес_сервера> | не используется в настройке |
Далее в примерах используется название виртуального сетевого интерфейса wg0. Название может быть произвольным.
Установка
На сервере и клиенте:
- Обновить репозитории:sudo apt update
- Установить сам WireGuard (пакет wireguard), инструменты для работы с WireGuard (пакет wireguard-tools) и, только на клиентах, пакет средств динамической маршрутизации resolvconf:sudo apt install wireguard wireguard-tools resolvconf
Генерация ключей
Для защиты передаваемых данных в WireGuard используются два типа ключей:
- Ключевая пара — пара из открытого (публичного) и закрытого (приватного) ключей. Обязательный атрибут для создания соединения между сервером и клиентом. Для сервера и для каждого клиента должна быть создана отдельная ключевая пара. Открытый ключ сервера должен быть передан всем клиентам и указан в из конфигурации. Открытый ключ каждого клиента должен быть передан на сервер и указаны в параметрах этого клиентов в конфигурации сервера. Открытые ключи могут передаваться по незащищенным каналам связи. Передача закрытых ключей нежелательна, поэтому рекомендуется создавать их непосредственно на тех узлах, на которых они будут использоваться.
- Разделяемый (preshared) ключ — необязательный атрибут для усиления защиты. Разделяемый ключ должен быть одинаковым в конфигурациях клиента и сервера. Для передачи разделяемого ключа должны использоваться защищенные каналы связи.
Далее в примере для хранения ключей используется каталог /etc/wireguard. Содержимое этого каталога защищено от чтения непривилегированными пользователями для предотвращения возможной утечки ключей. На практике может быть более удобным создавать и хранить ключи в домашнем каталоге пользователя (при условии обеспечения недоступности закрытого ключа посторонним).
Создание ключевой пары должно выполняться для сервера и для каждого клиента. Для предотвращения необходимости передачи закрытого ключа создавать ключевую пару лучше непосредственно на узле, где будет использоваться закрытый ключ. Для создания ключевой пары:
- Создать закрытый ключ и сохранить его в файле, например, /etc/wireguard/privkey:wg genkey | sudo tee /etc/wireguard/privkey > /dev/null
- Ключ создается в защищенном от чтения каталоге. Можно дополнительно запретить его чтение:sudo chmod 600 /etc/wireguard/privkey
- Создать парный ранее созданному закрытому ключу открытый ключ и сохранить его в файле, например, /etc/wireguard/pubkey:sudo cat /etc/wireguard/privkey | wg pubkey | tee /etc/wireguard/pubkey
- Далее копия открытого ключа должна быть передана контрагенту.
Разделяемый ключ должен быть создан для каждого клиента. В любом случае разделяемый ключ должен быть передан контрагенту, поэтому такие ключ можно создавать как на сервере, так и на клиентах. Для создания разделяемого ключа
- Создать разделяемый ключ и сохранить его в файле /etc/wireguard/sharedkey:wg gepsk | sudo tee /etc/wireguard/sharedkey
- Далее копия созданного разделяемого ключа должен быть передана контрагенту.
Настройка сервера
- Определить имя физической сетевой карты сервера. Для этого можно использовать команду:ip routeВывод команды зависит от конфигурации компьютера. Предполагается, что читатель самостоятельно может определить имя физической сетевой карты.
- В каталоге /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
- [Interface] — секция для определения собственных настроек (в данном случае — сервера);
- Ограничить доступ к файлу конфигурации:sudo chmod 600 /etc.wireguard/wg0.cfg
Включить маршрутизацию на уровне ядра:
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf- Применить внесённые изменения для ядра:sudo sysctl -p
- Добавить службу инструмента в автозагрузку:sudo systemctl enable wg-quick@wg0
- Запустить сетевую службу:
- Для включения и выключения виртуального сетевого интерфейса WireGuard нужно использовать инструмент wg-quick. Команды nmcli device connect/disconnect и их аналоги, приводят к ошибке:
"Ошибка: не удалось добавить/активировать новое подключение: Device class NMDeviceWireGuard had no complete_connection method". - При проверке работы виртуального интерфейса следует учитывать, после его включения для установки соединений может потребоваться 20 и более секунд.
sudo wg-quick up wg0 - Для включения и выключения виртуального сетевого интерфейса WireGuard нужно использовать инструмент wg-quick. Команды nmcli device connect/disconnect и их аналоги, приводят к ошибке:
- Проверить статус виртуального сетевого интерфейса:sudo wg show wg0
interface: wg0
public key: m5HtgJD/zHHPQBPVW8I/WoLvPfx+rpWolcxRyQVJChQ=
private key: (hidden)
listening port: 32823
fwmark: 0xca6cpeer: 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
Настройка клиента
Для настройки клиента:
- В каталоге /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 —задержка в секундах, для удержания соединения при бездействии.
Далее выполнить шаги 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.