В этом посте, будет описание настройки WireGuard на VPS c Ubuntu 22.04.

Предполагается, что на настраиваемой системе, уже настроен доступ по SSH, а так же на VPS используется UFW, в качестве фаервола.

Обозначения

$ - выполнением комадны, под учеткой пользователя.
# - выполнением комадны, под root, на локальном хосте (домашнем компуктере например).
$ - выполнением комадны, под учеткой пользователя, на локальном хосте (домашнем компуктере например).
(vps)$ - выполнением комадны, под учеткой пользователя, на VPS.

База

За основу настройки, взяли вот эти две статьи: digitalocean.com, shibumi.dev.

Настройка серверной чаcти (VPS)

Устанавливаем WireGuard.

(vps)$ sudo apt install wireguard

Генерим ключи.

(vps)$ wg genkey | sudo tee /etc/wireguard/private.key
(vps)$ sudo chmod go= /etc/wireguard/private.key
(vps)$ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

Находим внешний интерфейс, через который сервер выходит в интернет. В моем случае, это eth0.

(vps)$ ip route list default

default via <vps-public-ip> dev eth0 proto dhcp src <vps-public-ip> metric 100

Пишем конифг виртуального-сетевого-интерфеса (wg0).

(vps)$ sudo vim /etc/wireguard/wg0.conf
[Interface]
# base64_encoded_server_private_key - это содержимое /etc/wireguard/private.key
PrivateKey = <base64_encoded_server_private_key>
Address = 192.168.99.1/24
ListenPort = 51616
SaveConfig = true

# Client 1
#[Peer]
#PublicKey = <base64_encoded_client_public_key>
#AllowedIPs = 192.168.99.2/32

# Client 2
#[Peer]
#PublicKey = <base64_encoded_client_public_key>
#AllowedIPs = 192.168.99.3/32

PostUp = ufw route allow in on wg0 out on eth0
PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
PostUp = iptables -I FORWARD -i wg0 -o wg0 -j REJECT --reject-with icmp-net-prohibited
PreDown = ufw route delete allow in on wg0 out on eth0
PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PreDown = iptables -D FORWARD -i wg0 -o wg0 -j REJECT --reject-with icmp-net-prohibited

Разрешаем проброс (между интерфесами) в ОСи.

(vps)$ sudo vim /etc/sysctl.conf

Раскомментируем строчку.

net.ipv4.ip_forward=1

Применяем изменения.

(vps)$ sudo sysctl -p

Открываем в фаерволе (UFW), порт для WireGuard.

(vps)$ sudo ufw allow 51616/udp

Включаем и запускаем, Wireguard.

(vps)$ sudo systemctl enable wg-quick@wg0.service
(vps)$ sudo systemctl start wg-quick@wg0.service

Настройка клиентской части (Linux)

Генерим ключи.

$ wg genkey | sudo tee /etc/wireguard/private.key
$ sudo chmod go= /etc/wireguard/private.key
$ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

Пишем конифг виртуального-сетевого-интерфеса (wg0).

$ sudo vim /etc/wireguard/wg0.conf
[Interface]
# base64_encoded_client_private_key - это содержимое /etc/wireguard/private.key
PrivateKey = <base64_encoded_client_private_key>
Address = 192.168.99.2

[Peer]
# base64_encoded_server_public_key - это содержимое /etc/wireguard/public.key на **VPS**.
PublicKey = <base64_encoded_server_public_key>
AllowedIPs = 192.168.99.0/24
Endpoint =  <VPS-IP>:51616

Перенаправление всего трафика.
Если в конфиге, AllowedIPs указать следующим образом, AllowedIPs = 192.168.99.0/24, тогда WireGuard будет перенаправлять весь трафик с машины, через VPS.

Прежде чем включать WireGuard на клиенте, стоит добавить публичный ключ клиента, на сервере (VPS).
Сделать это можно с коммандной строки на VPS.

(vps)$ sudo wg set wg0 peer base64_encoded_client_public_key allowed-ips 192.168.99.2

Либо через редактирование конфига /etc/wireguard/wg0.conf на VPS. Раскомментируем строки под # Client 1:

# Client 1
[Peer]
PublicKey = <base64_encoded_client_public_key>
AllowedIPs = 192.168.99.2/32

Перечитываем конфиги WireGuard на VPS.

(vps)$ sudo systemctl restart wg-quick@wg0.service

Далее можно включать WireGuard на клиенте.

$ sudo wg-quick@wg0 up wg0

Выключить можно так:

$ sudo wg-quick@wg0 down wg0

Полезности для Linux:

Создаем шаблон для конфигов wg.conf.template.

[Interface]
PrivateKey = the_key
Address = 192.168.99.100
[Peer]
PublicKey = <base64_encoded_server_public_key>
AllowedIPs = 192.168.99.0/24
Endpoint = <VPS IP>

Создаем новый конфиг.

wg genkey | xargs -i sed -r '2s#(PrivateKey = ).+#\1{}#' wg0.conf.template > wg0.conf

Получаем публичный ключ из конфига, который потом добавляем на сервер.

grep -oP '^PrivateKey\s=\s\K(.+)$' wg0.conf | wg pubkey

Генерим QR-код

qrencode -t png -r wg0.conf -o ~/Desktop/qr.png

Настройка клиентской части (Windows)

Генерим ключи.
Ключи можно сгенерить на винде, но можно и на linux-машине. Что я и сделал. Там же сформировал wg0.conf:

[Interface]
# base64_encoded_client_private_key - это содержимое private.key
PrivateKey = <base64_encoded_client_private_key>
Address = 192.168.99.3

[Peer]
# base64_encoded_server_public_key - это содержимое /etc/wireguard/public.key на **VPS**.
PublicKey = <base64_encoded_server_public_key>
AllowedIPs = 192.168.99.0/24
Endpoint =  <VPS-IP>:51616
  1. Качаем windows-клиента Wireguard.
  2. Логинимся в учетную запись Администратора, либо в учетную запись с админскими провами. Запуск с правами администратор из-под учетки пользователя, не поможет.
  3. Загружаем wg0.conf в клиенте и подключаемся там же.

Для удобного включения и отключения vpn под обычной учеткой, достаточно выполнить следующую команду, с правами администратора.

netsh interface set interface wg0 (enable | disable)`