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] со своим приватным ключом и адресом:
конфиги не шарятся между устройствами.