ITcompressor IT — сжато и по делу
← Назад к статьям

WireGuard VPN

WireGuard — современный VPN-протокол: минимум строк конфига, быстрое рукопожатие и современная криптография из коробки. Сценарий статьи: сервер с адресом 10.0.0.1 в VPN-сети и клиент 10.0.0.2.

Установка#

sudo apt update
sudo apt install wireguard

Модуль ядра wireguard подгружается автоматически при первом поднятии интерфейса — вручную делать ничего не нужно.

Ключи#

У каждого узла своя пара: приватный ключ (никому не показывается) и публичный (обмен с пиром). На сервере:

sudo -i
cd /etc/wireguard

# umask закрытой папки и ключей: приватный ключ не должен быть читаем всем
umask 077

# Приватный ключ → публичный
wg genkey > server.key
wg pubkey < server.key > server.pub

На клиенте те же две команды — client.key / client.pub.

Публичный ключ клиента добавляется серверу в [Peer] — и наоборот. Приватные ключи никогда не покидают свою машину.

Конфигурация сервера#

/etc/wireguard/wg0.conf:

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <server.key>

# Клиент со своим публичным ключом и VPN-адресом
[Peer]
PublicKey = <client.pub>
AllowedIPs = 10.0.0.2/32

Чтобы клиенты с полным туннелем выходили через сервер в интернет, нужен форвардинг и NAT:

sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-wireguard.conf
# Дополнение в [Interface] wg0.conf (eth0 — свой внешний интерфейс)
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Конфигурация клиента#

wg0.conf на клиентской машине:

[Interface]
Address = 10.0.0.2/24
PrivateKey = <client.key>

[Peer]
PublicKey = <server.pub>
Endpoint = <серверный-IP>:51820

# 0.0.0.0/0 — весь трафик через туннель
# Чтобы через VPN ходили только серверные подсети, укажите их вместо этого:
# AllowedIPs = 10.0.0.0/24
AllowedIPs = 0.0.0.0/0, ::/0

# Поддерживать трансляцию живой за NAT
PersistentKeepalive = 25

Запуск#

# Поднять туннель
sudo wg-quick up wg0

# Состояние: обмен данными, рукопожатия, роуминг
sudo wg

# Опустить
sudo wg-quick down wg0

wg show показывает также последний handshake и сколько байт прошло через пира — по нему видно, что связка ключей работает.

Автозапуск интерфейса при загрузке — обычная systemd-юнит-семантика (wg-quick@<имя-интерфейса>):

sudo systemctl enable --now wg-quick@wg0

Брандмауэр#

# порт только UDP
sudo ufw allow 51820/udp

Ключевое отличие от OpenVPN: WireGuard работает только по UDP — TCP-режима у протокола нет.

Лайфхак: клиент на телефон#

Конфиг удобнее всего передавать QR-кодом — официальное приложение (iOS/Android) сканирует его:

sudo apt install qrencode
qrencode -t ansiutf8 < wg0.conf

Каждому устройству — свой [Peer] со своим приватным ключом и адресом: конфиги не шарятся между устройствами.

← Назад к статьям