Данная статья связана с
Данная статья применима к
- 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 со следующим содержимымsudo nano /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 со следующим содержимым:sudo nano /etc/wireguard/wg0.confГде:
# Параметры собственной конфигурации (в данном случае — клиента)
[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-9 сценария "На сервере".
Созданный виртуальный сетевой интерфейс доступен через графический интерфейс как новое VPN-соединение:
Доступна опция автоматического подключения:
Изменение настроек
- Проверить текущую конфигурацию виртуального сетевого интерфейса:sudo wg
interface: wg0
public key: b6Oy053LK5RRL3akvFP8oCaygL8owqJQE0DJPKAb/w8=
private key: (hidden)
listening port: 51820
Указать динамические настройки виртуального сетевого интерфейса для текущего сеанса:
- sudo wg set <набор_параметров_настройки>Перечень доступных настроек указан в
man wg
в разделеset
. Заданные настройки сохраняются до перезагрузки узла.
- 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
. Общий синтаксис:
Где <команда>
:
up
down
Справка по инструменту man wg-quick
.