|
WireGuard — протокол виртуальных частных сетей (VPN), созданный для обеспечения защищённого соединения между устройствами через недоверенные сети. Может считаться функциональным аналогом OpenVPN или IPSec. WireGuard создаёт виртуальные сетевые интерфейсы, работающие аналогично физическим сетевым интерфейсам. При передаче данных между виртуальными виртуальными интерфейсами применяются правила маршрутизации и защитное преобразование данных. Далее в примере рассматривается построение виртуальной одноранговой сети с топологией звезда — один сервер и несколько клиентов, подключенных непосредственно к этому серверу.
Особенности протокола WireGuard:
Используемые определения:
Пример начальной конфигурации пары узлов для работы WireGuard:
| Параметр | Сервер | Клиент |
|---|---|---|
| Имя узла | wgserver | wgclient |
| Физический адрес узла | Фиксированный IP-адрес, доступный для клиентов. Далее обозначается как <физический_адрес_сервера> | не используется в настройке |
Далее в примерах используется название виртуального сетевого интерфейса wg0. Название может быть произвольным.
На сервере и клиенте:
sudo apt update |
sudo apt install wireguard wireguard-tools resolvconf |
Для защиты передаваемых данных в WireGuard используются два типа ключей:
Далее в примере для хранения ключей используется каталог /etc/wireguard. Содержимое этого каталога защищено от чтения непривилегированными пользователями для предотвращения возможной утечки ключей. На практике может быть более удобным создавать и хранить ключи в домашнем каталоге пользователя (при условии обеспечения недоступности закрытого ключа посторонним).
Создание ключевой пары должно выполняться для сервера и для каждого клиента. Для предотвращения необходимости передачи закрытого ключа создавать ключевую пару лучше непосредственно на узле, где будет использоваться закрытый ключ. Для создания ключевой пары:
wg genkey | sudo tee /etc/wireguard/privkey > /dev/null |
| sudo chmod 600 /etc/wireguard/privkey |
sudo cat /etc/wireguard/privkey | wg pubkey | tee /etc/wireguard/pubkey |
Разделяемый ключ должен быть создан для каждого клиента. В любом случае разделяемый ключ должен быть передан контрагенту, поэтому такие ключ можно создавать как на сервере, так и на клиентах. Для создания разделяемого ключа
wg gepsk | sudo tee /etc/wireguard/sharedkey |
| ip route |
# Параметры собственной конфигурации (в данном случае - сервера) [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 = <виртуальный_адрес_клиента>/32 |
Address — список виртуальный адресов сервера WireGuard и сетевая маска виртуальной сети WireGuard. разделитель списка — запятая. По этим адресам сервер будет доступен внутри сетей WireGuard. Например:
Address = 10.0.0.1/24 |
SaveConfig — если значение параметра true, то при выключении интерфейса его актуальные параметры будут сохранены в конфигурационном файле.
PostUp — команда, выполняющаяся после включения интерфейса. Обычно это добавление правила iptaples, разрешающего перенаправление трафика с виртуального сетевого интерфейса wg0 на физический eth0. Вместо лексемы %i подставляется имя текущего интерфейса WireGuard. Параметр может быть указан несколько раз для определения нескольких действий. Используя параметр PostUp можно исключить указание закрытого ключа в конфигурационном файле, используя следующую конструкцию:
PostUp = wg set %i private-key /etc/wireguard/%i.key |
PostDown — команда, выполняющаяся при выключении интерфейса. Обычно это удаление добавленного при включении интерфейса правила из PostUp. Параметр может быть указан несколько раз для определения нескольких действий. Также доступен параметр PreDown, задающий действия, выполняемые перед выключением интерфейс.
ListenPort — номер сетевого порта для прослушивания входящих соединений. В примере используется 51820.
PrivateKey — созданный ранее закрытый ключ сервера. В качестве значения параметра быть указано содержимое ключа.
[Peer] — секция для определения настроек контрагента (в данном случае - клиента). Таких секций может быть несколько, по количеству планируемых к подключению клиентов:
PublicKey — открытый ключ клиента;
PresharedKey — необязательный параметр, разделяемый ключ для усиления защиты соединения;
AllowedIPs — адрес для маршрутизации (перенаправления) сетевого трафика. Если указано значение 0.0.0.0/0, то этому контрагенту перенаправляется весь трафик. Для корректной работы сети на сервере рекомендуется указывать указывается виртуальный адрес клиента, чтобы ему направлялся только ему предназначенный трафик. Например:
AllowedIPs = 10.0.0.2/32 |
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 |
|
sudo wg-quick up wg0 |
interface: wg0 peer: FldFF7ld0SC9ns7d+fWHwhBBomBLGD1F9E0babeYk3o= |
Для настройки клиента:
# Параметры собственной конфигурации (в данном случае — клиента) [Interface] PrivateKey = <закрытый_ключ> Address = <виртуальный_IP-адрес_клиента> DNS=77.88.8.1 # Параметры конфигурации контрагента (в данном случае — сервера) [Peer] PublicKey = <открытый_ключ_сервера> PresharedKey = <разделяемый_ключ> # Указание значения 0.0.0.0/0 перенаправит весь трафик на сервер WireGuard. Если это не требуется, то можно указать виртуальный адрес сервера AllowedIPs = 0.0.0.0/0 Endpoint = <физический_адрес_сервера>:<номер_порта> persistent keepalive = 25 |
[Interface] — секция для определения собственных настроек (в данном случае — клиента):
PrivateKey — закрытый ключ клиента.
Address — виртуальный адрес клиента.
[Peer] — секция для определения настроек контрагента (в данном случае — сервера.
PublicKey — открытый ключ сервера.
PresharedKey — необязательный параметр, разделяемый ключ клиента.
AllowedIPs — список масок перенаправления (маршрутизации сетевого трафика). При значении 0.0.0.0/0 контрагенту перенаправляется весь трафик. Используется, например, когда доступ в Интернет должен осуществляться через WireGuard. Если это не требуется, то можно указать виртуальный адрес сервера WireGuard, например: 10.1.1.1/32.
Endpoint — физический адрес и порт сервера (по умолчанию 51820).
persistent keepalive —задержка в секундах, для удержания соединения при бездействии.
Далее выполнить шаги 3 - 8 настройки сервера.
Виртуальный сетевой интерфейс WireGuard доступен через графический интерфейс как новое VPN-соединение:
При работе в командной строке:
| wg-quick up <имя_виртуального_интерфейса> |
| wg-quick down <имя_виртуального_интерфейса> |
| sudo wg |
sudo wg set <набор_параметров_настройки> |
sudo wg-quick save <имя_виртуального_интерфейса> |
sudo wg-quick strip <имя_виртуального_интерфейса> |
sudo wg addconf <имя_виртуального_интерфейса> <имя_файла_конфигурации> |
sudo wg setconf <имя_виртуального_интерфейса> <имя_файла_конфигурации> |
Подробная справка по инструментам wg и wg-quick доступна в справочной системе man.