|
WireGuard протокол виртуальных частных сетей (VPN), созданный для обеспечения защищённого соединения между устройствами через ненадёжные или недоверенные сети. Аналог OpenVPN или IPSec. WireGuard создаёт виртуальные сетевые интерфейсы, работающие аналогично физическим сетевым интерфейсам. Каждый интерфейс имеет свой набор правил маршрутизации и криптографические ключи (приватный и публичный). Доступ к приватному ключу должен быть ограничен. Публичные ключи используются для установления доверительных отношений между устройствами (парами или peers).
Особенности протокола WireGuard:
Используемые определения:
Виртуальный IP-адрес для сервера и клиентов назначаются из одной подсети. |
Пример начальной конфигурации пары узлов для работы WireGuard:
| Параметр | Сервер | Клиент |
|---|---|---|
| Имя узла | wgserver | wgclient |
| Физический IP-адрес узла | <физический_IP-адрес_сервера> | не используется в настройке |
Название сетевого интерфейса стенда: eth0. (Пример, название может быть произвольным).
Название виртуального сетевого интерфейса стенда: wg0. (Пример, название может быть произвольным).
На сервере и клиенте:
sudo apt update |
sudo apt install wireguard wireguard-tools |
На сервере и клиенте:
sudo su cd /etc/wireguard |
sudo mkdir /etc/wireguard sudo chmod 644 /etc/wireguard |
wg genkey | tee privatekey | wg pubkey > publickey |
cat privatekey cat publickey |
sudo chmod 600 privatekey sudo chmod 644 publickey |
Установленные правила дают полный доступ к приватному ключу только пользователю, создавшему его, а для остальных дают право только на чтение публичного ключа.
Настоятельно не рекомендуется распространение или передача приватного ключа. |
Пары из приватного и публичного ключа генерируются отдельно и на сервере и на клиенте. |
Настройка маршрутизации
На сервере:
/etc/wireguard создать конфигурационный файл со следующим содержимым: |
[Interface] — секция для определения настроек сервера;
Address — виртуальный IP-адрес сервера WireGuard по которому он будет достунен внутри соединения WireGuard, указывается произвольный IP-адрес, отличный от физического;
SaveConfig — автоматическое сохранение изменений конфигурации интерфейса в файл его конфигурации при их определении через wg set;
PostUp — команда при запуске интерфейса. В примере это добавление правила iptaples, разрешающего перенаправление трафика с виртуального сетевого интерфейса wg0 на физический eth0;
PostDown — команда при выключении интерфейса. В примере это удаление предыдущего правила из PostUp;
ListenPort — номер сетевого порта для прослушивания входящих соединений;
PrivateKey сгенерированный ранее приватный ключ сервера.
[Peer] — секция для определения настроек клиента, данных секций может быть несколько по количеству планируемых к подключению клиентов;
PublicKey — публичный ключ клиента;
PresharedKey — опциональный параметр, дополнительный ключ используется совместно с основной парой в целях усиления защиты соединения;
AllowedIPs — 0.0.0.0/0 это значение по умолчанию для перенаправления всего сетевого трафика клиента. При необходимости, указывается конкретный физический IP-адрес клиента, трафик с которого будет перенаправляться в WireGuard.
Подробная справка о настройках виртуального сетевого интерфейса доступна по команде man wg-quick.
sudo chmod 600 wg0.cfg |
Включить маршрутизацию на уровне ядра:
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf |
sudo sysctl -p |
sudo wg-quick up wg0 |
Следует учитывать временную задержку до 20 секунд при запуске виртуального сетевого интерфейса. |
sudo systemctl enable wg-quick@wg0 |
sudo nmcli connection modify wg0 ipv4.dad-timeout 0 |
Для включения и выключения виртуального сетевого интерфейса WireGuard нужно использовать инструмент "Ошибка: не удалось добавить/активировать новое подключение: Device class NMDeviceWireGuard had no complete_connection method". |
sudo wg-quick down wg0 && sudo wg-quick up wg0 |
interface: wg0 peer: FldFF7ld0SC9ns7d+fWHwhBBomBLGD1F9E0babeYk3o= |
На клиенте:
/etc/wireguard создать конфигурационный файл со следующим содержимым:
|
[Interface] — секция для определения настроек клиента;
PrivateKey — приватный ключ клиента;
Address — виртуальный IP-адрес клиента WireGuard. Указывается IP-адрес, отличный от физических IP-адресов узлов из той же подсети что и IP-адрес сервера WireGuard ;
[Peer] — секция для определения настроек сервера;
PublicKey — публичный ключ сервера;
PresharedKey — опциональный параметр, дополнительный ключ клиента;
AllowedIPs — 0.0.0.0/0 это значение по умолчанию для перенаправления всего сетевого трафика клиента. При необходимости, указывается конкретный физический IP-адрес клиента, трафик с которого будет перенаправляться в WireGuard;
Endpoint — физический IP-адрес и порт сервера (по умолчанию 51820);
persistent keepalive —задержка в секундах, для удержания соединения при бездействии.
Выполнить шаги 2-9 сценария "На сервере".
Созданный виртуальный сетевой интерфейс доступен через графический интерфейс как новое VPN-соединение:
Доступна опция автоматического подключения:
interface: wg0 public key: b6Oy053LK5RRL3akvFP8oCaygL8owqJQE0DJPKAb/w8= private key: (hidden) listening port: 51820 |
sudo wg genkey |
wg genkey | tee <файл_приватного_ключа> | wg pubkey > <файл_публичного_ключа> |
wg genpsk > <файл_дополнительного_ключа> |
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 <имя_виртуального_интерфейса> <имя_файла_конфигурации> |
Инструмент использует файлы конфигурации из |
Справка по инструменту wg -h, подробная справка man wg.
Управление виртуальным сетевым интерфейсом осуществляется с помощью инструмента wg-quick. Общий синтаксис:
sudo wg-quick <команда> <имя_виртуального_интерфейса> |
Где <команда>:
up down Справка по инструменту man wg-quick.