Изначально этот пост я опубликовал в сети IDEC. И так, наверное, буду делать и впредь – сначала пост в IDEC, а затем тут. Вот этот оригинальный пост.

Wireguard – это FOSS, а так же протокол, который реализует VPN. Реализация полностью ядерная, по-этому у wireguard лучшая производительность по сравнению с OpenVPN.

На самом деле, у меня был рабочий OpenVPN между моими тремя виртуалками и все это работало. Но я пропустил момент когда у меня протухли сертификаты, все отвалилось и находилось в разваленном состоянии несколько месяцев. Потом я обновил свои Дебианы до десятки и решил, что хватит это терпеть – жить без VPN. Снес OpenVPN и засетапил Wireguard.

Установка

Для Debian Wireguard пока не завезли в стейбл, по-этому ставить его нужно из unstable.

# echo "deb http://deb.debian.org/debian/ unstable main" > /etc/apt/sources.list.d/unstable.list
# printf 'Package: *\nPin: release a=unstable\nPin-Priority: 90\n' > /etc/apt/preferences.d/limit-unstable
# apt update
# apt install wireguard

WG собран подо все мейнстримные дистрибутивы. Переходим по ссылке https://www.wireguard.com/install/ и ставим на свою ось.

Настройка

И так, схема сети у нас следующая:

   +---------+        +----------+
   |  VM1    |        |   VM2    |
   |10.10.2.1|<------>|10.10.2.2 |
   +---------+        +----------+
      ^                       ^
      |                       |
      |    +------------+     |
      +--->|    VM3     |<----+
           |  10.10.2.3 |
           +------------+

Сначала на каждом из хостов нужно сгенерировать приватный ключ:

# mkdir -p /etc/wireguard
# chmod 700 /etc/wireguard
# cd /etc/wireguard
# wg genkey > privkey
# chmod 600 privkey

Теперь напишем начальную конфигурацию(одинаково на всех хостах) в /etc/wireguard/wg.conf:

[Interface]
ListenPort = 36483
PrivateKey = <privkey from /etc/wireguard/privkey>

Поднимаем интерфейс и применяем конфиг:

ip link add dev wg0 type wireguard
ip address add dev wg0 10.10.2.1/24
wg setconf wg0 /etc/wireguard/wg.conf

Проверяем, что интерфейс поднялся и порт слушается:

# wg
interface: wg0
  public key: dNl19y5MAjfuAVqTwW9zx1u5lbtbxVpJZTbOaB9SgwE=
  private key: (hidden)
  listening port: 36485

Отлично! Теперь нужно прописать наших пиров.

Получить публичный ключ можно набрав комманду wg и скопипастить из вывода, либо получить публичный ключ из приватного:

wg pubkey < privkey > pubkey
[Interface]
ListenPort = 36483
PrivateKey = <HIDDEN>

[Peer]
PublicKey = hDvzIb2iRdjpfx9nJpTS471AqROYjGzPBAZ09p6L4wg=
AllowedIPs = 10.10.2.2/32
Endpoint = inet.ip4.a.ddr:50820

[Peer]
PublicKey = 8IhODKK4+fU2VHtZzqioswQcpu727Wo18HbNHytzEGY=
AllowedIPs = 10.10.2.3/32
Endpoint = inet.ip4.a.ddr:50919

По аналогии делаем на других двух хостах. В AllowedIPs в секции пира прописываем адрес, который мы навесили на интерфейс wg0.

Поднимаем интерфейс:

ip link set up dev wg0

После этого по комманде wg должна быть примерно следующая картина:

interface: wg0
  public key: dNl19y5MAjfuAVqTwW9zx1u5lbtbxVpJZTbOaB9SgwE=
  private key: (hidden)
  listening port: 36485

peer: 8IhODKK4+fU2VHtZzqioswQcpu727Wo18HbNHytzEGY=
  endpoint: inet.ip4.a.ddr:51820
  allowed ips: 10.10.2.2/32
  latest handshake: 19 seconds ago
  transfer: 16.64 GiB received, 15.18 GiB sent

peer: hDvzIb2iRdjpfx9nJpTS471AqROYjGzPBAZ09p6L4wg=
  endpoint: inet.ip4.a.ddr:50919
  allowed ips: 10.10.2.3/32
  latest handshake: 1 minute, 41 seconds ago
  transfer: 18.71 GiB received, 16.91 GiB sent

Автозапуск

Все это только что мы делали руками, по-этому после рубута тачки ничего не поднимется волшебным образом. Напишем юнит /etc/systemd/system/wg.service

[Unit]
Description=Wireguard VPN
After=network-online.target

[Service]
Type=oneshot
ExecStartPre=-/sbin/ip link add dev wg0 type wireguard
ExecStartPre=-/sbin/ip address add dev wg0 10.10.2.1/24
ExecStartPre=/usr/bin/wg setconf wg0 /etc/wireguard/wg.conf
ExecStart=/sbin/ip link set up dev wg0

[Install]
WantedBy=default.target

Включаем:

systemctl daemon-reload
systemctl enable wg.service

На этом все. Надеюсь пост был кому-то полезен.