| Оглавление |
|---|
| Информация | ||
|---|---|---|
| ||
| Информация | ||
|---|---|---|
| ||
|
Аннотация
WireGuard протокол виртуальных частных сетей (VPN), созданный для обеспечения защищённого соединения между устройствами через ненадёжные или недоверенные сети. Аналог Может считаться функциональным аналогом OpenVPN или IPSec. WireGuard создаёт виртуальные сетевые интерфейсы, работающие аналогично физическим сетевым интерфейсам. Каждый интерфейс имеет свой набор правил маршрутизации и криптографические ключи (приватный и публичный). Доступ к приватному ключу должен быть ограничен. Публичные ключи используются для установления доверительных отношений между устройствами (парами или peers).При передаче данных между виртуальными виртуальными интерфейсами применяются правила маршрутизации и защитное преобразование данных. Далее в примере рассматривается построение виртульной сети с топологией звезда — один сервер и несколько клиентов.
Особенности протокола WireGuard:
- Протокол протокол работает на уровне ядра операционной системы.;
- Соединение соединение устанавливается только между сервером и доверенными парамиклиентами, указанными в конфигурации .сервера;
- WireGuard автоматически поддерживает поддерживается соединение даже при изменении IP-адреса устройства.Протокол не требует постоянного подключения к серверуадресов клиентов.
Используемые определения:
- Физический IP- адрес узла
- Виртуальный сетевой интерфейс
- Виртуальный IP- адрес
Виртуальный IP-адрес для сервера и клиентов назначаются из одной подсетиИнформация - Контрагент — друга сторона соединения. Для сервера контрагентами являются клиенты, для клиентов контрагентом является сервер.
Описание стенда
Пример начальной конфигурации пары узлов для работы WireGuard:
| Параметр | Сервер | Клиент |
|---|---|---|
| Имя узла | wgserver | wgclient |
| Физический адрес узлаФизический | Фиксированный IP-адрес узла , доступный для клиентов. Далее обозначается как <физический_IP-адрес_сервера>сервера> | не используется в настройке |
Название сетевого интерфейса стенда: eth0. (Пример, название может быть произвольным).
Название Далее в примерах используется название виртуального сетевого интерфейса стенда: wg0. (Пример, название Название может быть произвольным).
Установка
На сервере и клиенте:
- Обновить репозитории:
Command sudo apt update
- Установить инструметы WireGuard
- сам WireGuard (пакет wireguard), инструменты для работы с WireGuard (пакет wireguard-tools) и, только на клиентах, пакет средств динамической маршрутизации resolvconf:
Command sudo apt install wireguard wireguard-tools resolvconf
Генерация ключей
На сервере и клиенте:
- Перейти в каталог для хранения конфигурационных файлов WireGuard последовательно выполнив:
Command sudo su
cd /etc/wireguard
- Если каталога не существует, создать его последовательно выполнив:
Command sudo mkdir /etc/wireguard
sudo chmod 644 /etc/wireguard
- Если каталога не существует, создать его последовательно выполнив:
- Создать пару из приватного и публичного ключа:
Command wg genkey | tee privatekey | wg pubkey > publickey
- Проверить пару ключей последовательно отобразив содержимое ранее сгенерированных файлов с ключами:
Command cat privatekey
cat publickey
- Ограничить доступ к файлам с ключами WireGuard:
Command sudo chmod 600 privatekey
sudo chmod 644 publickey
Установленные правила дают полный доступ к приватному ключу только пользователю, создавшему его, а для остальных дают право только на чтение публичного ключа.
| Предупреждение |
|---|
Настоятельно не рекомендуется распространение или передача приватного ключа. |
| Информация |
|---|
Пары из приватного и публичного ключа генерируются отдельно и на сервере и на клиенте. |
Настройка маршрутизации
Для защиты передачи данных в WireGuard используются два типа ключей:
- Ключевая пара — пара из открытого (публичного) и закрытого (приватного) ключей. Обязательный атрибут для создания соединения между сервером и клиентом. Для сервера и для каждого клиента должна быть создана отдельная ключевая пара. Открытый ключ сервера должен быть передан всем клиентам и указан в из конфигурации. Открытый ключ каждого клиента должен быть передан на сервер и указаны в параметрах этого клиентов в конфигурации сервера. Открытые ключи могут передаваться по незащищенным каналам связи. Передача закрытых ключей нежелательна, поэтому рекомендуется создавать их непосредственно на тех узлах, на которых они будут использоваться.
- Разделяемый (preshared) ключ — необязательный атрибут для усиления защиты. Разделяемый ключ должен быть одинаковым в конфигурациях клиента и сервера. Для передачи разделяемого ключа должны использоваться защищенные каналы связи.
Далее в примере для хранения ключей используется каталог /etc/wireguard. Содержимое этого каталога защищено от чтения непривилегированными пользователями для предотвращения возможной утечки ключей. На практике может быть более удобным создавать и хранить ключи в домашнем каталоге пользователя (при условии обеспечения недоступности закрытого ключа посторонним).
Создание ключевой пары должно выполняться для сервера и для каждого клиента. Для предотвращения необходимости передачи закрытого ключа создавать ключевую пару лучше непосредственно на узле, где будет использоваться закрытый ключ. Для создания ключевой пары:
- Создать закрытый ключ и сохранить его в файле, например, /etc/wireguard/privkey:
Command wg genkey | sudo tee /etc/wireguard/privkey > /dev/null
- Ключ создается в защищенном от чтения каталоге. Можно дополнительно запретить его чтение:
Command sudo chmod 600 /etc/wireguard/privkey - Создать парный ранее созданному закрытому ключу открытый ключ и сохранить его в файле, например, /etc/wireguard/pubkey:
Command sudo cat /etc/wireguard/privkey | wg pubkey | tee /etc/wireguard/pubkey
- Далее копия открытого ключа должна быть передана контрагенту.
Разделяемый ключ должен быть создан для каждого клиента. В любом случае разделяемый ключ должен быть передан контрагенту, поэтому такие ключ можно создавать как на сервере, так и на клиентах. Для создания разделяемого ключа
- Создать разделяемый ключ и сохранить его в файле /etc/wireguard/sharedkey:
Command wg gepsk | sudo tee /etc/wireguard/sharedkey
- Далее копия созданного разделяемого ключа должен быть передана контрагенту.
Настройка сервера
- Определить имя физической сетевой карты сервера. Для этого можно использовать команду:
Вывод команды зависит от конфигурации компьютера. Предполагается, что читатель самостоятельно может определить имя физической сетевой карты.Command ip route
- В каталоге /etc/wireguard создать конфигурационный файл /etc/wireguard/wg0.conf со следующим содержимым :
Command Title sudo nano /etc/wireguard/wg0.conf # Параметры собственной конфигурации (в данном случае - сервера)[Interface] Address =<виртуальный_IP-адрес_сервера>SaveConfig = false PostUp = iptables -A FORWARD -i wg0%i -j ACCEPT; iptables -t nat -A POSTROUTING -oeth0<имя_физической_сетевой_карты> -j MASQUERADE; PostDown = iptables -D FORWARD -iwg0%i -j ACCEPT; iptables -t nat -D POSTROUTING -oeth0<имя_физической_сетевой_карты> -j MASQUERADE; ListenPort = 51820 PrivateKey =ПРИВАТНЫЙ КЛЮЧ СЕРВЕРА<закрытый_ключ_сервера># Параметры контрагентов (в данном случае - клиентов)
[Peer] PublicKey = ПУБЛИЧНЫЙ КЛЮЧ КЛИЕНТА<публичный_ключ_контрагента>
PresharedKey = ДОПОЛНИТЕЛЬНЫЙ КЛЮЧ КЛИЕНТА
Где:<разделяемый_ключ> AllowedIPs =0.0.0.0/0- [Interface] — секция для определения собственных настроек (в данном случае — сервера);
Address — виртуальный
IP-- [Interface] — секция для определения собственных настроек (в данном случае — сервера);
адрес и сетевая маска сервера WireGuard, по которому он будет
достунен доступен внутри
соединения WireGuard, указывается произвольный IP-адрес, отличный от физического;сети WireGuard. например:
Блок кода Address = 10.0.0.1/24SaveConfig — параметр, определяющий возможность автоматического сохранения изменений конфигурации интерфейса при их изменении командой wg set.
PostUp — команда, выполняющаяся после запуска интерфейса. Обычно
SaveConfig— автоматическое сохранение изменений конфигурации интерфейса в файл его конфигурации при их определении через wg set;это добавление правила iptaples, разрешающего перенаправление трафика с виртуального сетевого
интерфейса интерфейса wg0 на физический eth0.
PostDown — команда, выполняющаяся при выключении интерфейса.
В примере Обычно это удаление
предыдущего правила из добавленного при включении интерфейса правила из PostUp.
ListenPort — номер сетевого порта для прослушивания входящих соединений
;. Обычно 51820.
PrivateKey —
сгенерированный созданный ранее
приватный закрытый ключ сервера. В качестве значения параметра быть указано содержимое ключа.
[Peer] — секция для определения настроек
клиента, данных контрагента (в данном случае - клиента). Таких секций может быть несколько, по количеству планируемых к подключению клиентов
;:
PublicKey —
публичный открытый ключ клиента;
PresharedKey —
опциональный необязательный параметр,
дополнительный ключ используется совместно с основной парой в целях разделяемый ключ для усиления защиты соединения;
AllowedIPs — адрес для маршрутизации (перенаправления) сетевого трафика. Если указано значение 0.0.0.0/0
это значение по умолчанию для перенаправления всего сетевого трафика клиента. При необходимости, указывается конкретный физический IP-адрес клиента, трафик с которого будет перенаправляться в WireGuard., то этому контрагенту перенаправляется весь трафик. Для корректной работы сети на сервере рекомендуется указывать указывается виртуальный адрес клиента, чтобы ему направлялся только ему предназначенный трафик, например:
Блок кода AllowedIPs = 10.0.0.2/32
.- Ограничить доступ к файлу конфигурации:
Command sudo chmod 600 /etc.wireguard/wg0.cfg
Включить маршрутизацию на уровне ядра:
Command echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
- Применить внесённые изменения для ядра:
Command sudo sysctl -p
Включить созданный через WireGuard виртуальный сетевой интерфейс: - Добавить службу инструмента в автозагрузку:
Command sudo systemctl enable wg-quick@wg0
Отключить проверку конфликта адресов. По умолчанию механизм включен : - Запустить сетевую службу:
Предупреждение - Для включения и выключения виртуального сетевого интерфейса WireGuard нужно использовать
инструмент - инструмент wg-quick. Команды nmcli device connect/disconnect и их аналоги, приводят к ошибке:
"Ошибка: не удалось добавить/активировать новое подключение: Device class NMDeviceWireGuard had no complete_connection method". - При проверке работы виртуального интерфейса следует учитывать, после его включения для установки соединений может потребоваться 20 и более секунд.
Command sudo wg-quick
down wg0 && sudo wg-quick - инструмент wg-quick. Команды nmcli device connect/disconnect и их аналоги, приводят к ошибке:
up wg0
- Проверить статус виртуального сетевого интерфейса:
Command Title 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
PostUp — команда при запуске интерфейса. В примере wg0 на физический eth0;PostUp;Подробная справка о настройках виртуального сетевого интерфейса доступна по команде
man wg-quick| Command |
|---|
sudo wg-quick up wg0 |
| Информация |
|---|
Следует учитывать временную задержку до 20 секунд при запуске виртуального сетевого интерфейса. |
| Command |
|---|
sudo nmcli connection modify wg0 ipv4.dad-timeout 0 |
Настройка клиента
Для настройки клиентаНа клиенте:
- В каталоге /etc/wireguard создать конфигурационный файл /etc/wireguard/wg0 со следующим содержимым:
Command Title sudo nano /etc/wireguard/wg0.conf # Параметры собственной конфигурации (в данном случае — клиента)
[Interface]
PrivateKey = ПРИВАТНЫЙ КЛЮЧ КЛИЕНТА <закрытый_ключ>
Address =<виртуальный_IP-адрес_клиента>DNS=77.88.8.1# Параметры конфигурации контрагента (в данном случае — сервера)
[Peer]PublicKey = ПУБЛИЧНЫЙ КЛЮЧ СЕРВЕРА<открытый_ключ_сервера>PresharedKey = ДОПОЛНИТЕЛЬНЫЙ КЛЮЧ КЛИЕНТА<разделяемый_ключ>AllowedIPs = 0.0.0.0/0Endpoint =<физический_IP-адрес_сервера>:51820
Где:<номер_порта>persistent keepalive = 25[Interface]
— — секция для определения собственных настроек
клиента;(в данном случае — клиента):
PrivateKey —
приватный закрытый ключ клиента
;.
Address — виртуальный
IP-адрес адрес клиента
WireGuard.
Указывается IP-адрес, отличный от физических IP-адресов узлов из той же подсети что и IP-адрес сервераWireGuard ;- DNS —
опциональный - необязательный параметр, IP-адрес DNS-сервера
;- .
[Peer] — секция для определения настроек
сервера;контрагента (в данном случае — сервера:
PublicKey —
публичный открытый ключ сервера;
PresharedKey —
опциональный необязательный параметр,
дополнительный разделяемый ключ клиента;
AllowedIPs — маска перенаправления (маршрутизации сетевого трафика). При значении 0.0.0.0/0
это значение по умолчанию для перенаправления всего сетевого трафика клиента. При необходимости, указывается конкретный физический IP-адрес клиента, трафик с которого будет перенаправляться в WireGuardконтрагенту перенаправляется весь трафик. Используется, например, когда доступ в Интернет должен осуществляться через WireGuard. ;
Endpoint — физический
IP-адрес и порт сервера (по
умолчанию умолчанию 51820);
persistent keepalive —задержка в секундах, для удержания соединения при бездействии.
Выполнить шаги 2-9 сценария "На сервере".
51820Созданный виртуальный сетевой интерфейс доступен через графический интерфейс как новое VPN-соединение:
Доступна опция автоматического подключения:
Изменение настроек
- Проверить текущую конфигурацию виртуального сетевого интерфейса:
Command Title sudo wg interface: wg0
public key: b6Oy053LK5RRL3akvFP8oCaygL8owqJQE0DJPKAb/w8=
private key: (hidden)
listening port: 51820
Создать новый приватный ключ: Указать динамические настройки виртуального сетевого интерфейса для текущего сеанса:
Якорь wgset wgset
Перечень доступных настроек указан вCommand sudo wg set <набор_параметров_настройки>
man wgв разделеset. Заданные настройки сохраняются до перезагрузки узла.Command sudo wg-quick save <имя_виртуального_интерфейса>
Command sudo wg-quick strip <имя_виртуального_интерфейса> > <файл_для_экспорта_настроек>
Command sudo wg-quick strip wg0 > wireguard-config.txt
- Добавить или обновить настройки в текущем файле конфигурации:
Command sudo wg addconf <имя_виртуального_интерфейса> <имя_файла_конфигурации>
- Указать новый файл конфигурации для виртуального сетевого интерфейса:
Command sudo wg setconf <имя_виртуального_интерфейса> <имя_файла_конфигурации>
| Command |
|---|
sudo wg genkey |
| Command |
|---|
wg genkey | tee <файл_приватного_ключа> | wg pubkey > <файл_публичного_ключа> |
| Информация |
|---|
Инструмент использует файлы конфигурации из |
Справка по инструменту wg -h, подробная справка man wg.
Управление соединением
Управление виртуальным сетевым интерфейсом осуществляется с помощью инструмента wg-quick. Общий синтаксис:
| Command |
|---|
sudo wg-quick <команда> <имя_виртуального_интерфейса> |
Где <команда>:
updown
Справка по инструменту man wg-quick.

