UNIXAWESOME

WireGuard. Установка и настройка

Oct. 16, 2021

wireguard.png

WireGuard – VPN протокол с открытым исходным кодом, обеспечивающий высокую скорость при минимальной нагрузке.

В современном мире VPN нужен практически всем. Ведь не только для доступа к заблокированным ресурсам можно получить доступ, но и для объединения разных устройств подключенных к интернету и расположенных географически в разных местах.

Особенности WireGuard

  • Простой в использовании.
  • Использует современную криптографию: Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF
  • Компактный читаемый код, проще исследовать на уязвимости.
  • Высокая производительность.
  • Четкая и проработанная спецификация.
  • Максимальное преимущество в производительности (по сравнению с OpenVPN и IPSec) будет заметно на Linux системах, так как там WireGuard реализован в виде модуля ядра. Поддерживаются macOS, Android, iOS, FreeBSD, OpenBSD, Windows.

test2.png

Установка

Установка wireguard будет производится на VPS с ОС Debian 11.

Для начала подключаемся к нашему серверу по ssh.

Ставим последние обновления.

apt update
apt upgrade

Теперь можно устанавливать WireGuard

apt install wireguard

Для Debian 10 необходимо будет добавить backport репозиторий.

echo "deb http://deb.debian.org/debian buster-backports main" | sudo tee /etc/apt/sources.list.d/buster-backports.list

И после установки скорее всего потребуется перезагрузка для Debian 10

На одноранговом узле, который будет действовать как «сервер», необходимо включить пересылку IPv4 с помощью sysctl

sysctl -w net.ipv4.ip_forward=1

Чтобы сделать изменение постоянным нужно добавить net.ipv4.ip_forward = 1 в файл /etc/sysctl.d/99-sysctl.conf.

Настройка firewall

Нужно открыть порт 51820/UDP

Настройка WireGuard на сервере

Генерируем публичный и приватный ключ сервера.

wg genkey | tee /etc/wireguard/privatekey | wg pubkey | tee /etc/wireguard/publickey

Создаём конфиг файл.

vim /etc/wireguard/wg0.conf

И добавим в него следующее:

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <SERVER_PRIVATE_KEY>

PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
  • Address: Здесь 10.0.0.1 - это частный IP-адрес VPN-сервера.
  • ListenPort: сервер WireGuard VPN будет прослушивать UDP-порт 51820, который используется по умолчанию.
  • PrivateKey: закрытый ключ VPN-сервера, который можно найти в файле /etc/wireguard/private.key на сервере.
  • PostUp/PostDown: нужны для включения и отключения форвардинга трафика. А также если сервер имеет публичный IP адрес и не находится за NAT. Вместо eth0 подставить свой интерфейс с доступом в интернет.

Запуск сервиса wireguard

Теперь пробуем поднять наш wireguard интерфейс. Запускаем службу и сразу смотрим статус или всё запустилось.

systemctl start wg-quick@wg0
systemctl status wg-quick@wg0

Если запустилось нормально, можем ставить в автозагрузку:

systemctl enable wg-quick@wg0

Также можно посмотреть статус именно нашего интерфейса wg0 и подключенных к нему пиров.

wg show wg0

Настройка клиента linux

Устанавливаем wireguard пакет

Archlinux

pacman -S wireguard-tools

Ubuntu/Debian

apt install wireguard

На сервере генерируем ключи для клиента:

wg genkey | tee /etc/wireguard/laptop_privatekey | wg pubkey | tee /etc/wireguard/laptop_publickey

И теперь обновим на сервере файл wg0.conf

vim /etc/wireguard/wg0.conf

И добавим туда новый раздел с новым клиентом

...
[Peer]
# laptop
PublicKey = <СLIENT_PUBLIC_KEY>
AllowedIPs = 10.0.0.2/32
  • PublicKey: сгенерированный /etc/wireguard/laptop_publickey
  • AllowedIPs: IP адрес для нашего клиента

Перезапускаем сервис после добавления нового клиента

systemctl restart wg-quick@wg0

На клиенте создаем конфигурационный файл в папке /etc/wireguard/, называем его как-нибудь laptop.conf:

[Interface]
PrivateKey = <CLIENT_PRIVATE_KEY>
Address = 10.0.0.2/32
DNS = 10.0.0.1

[Peer]
PublicKey = <SERVER_PUBKEY>
Endpoint = <SERVER_IP>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 20
  • PrivateKey: сгенерированный /etc/wireguard/laptop_privatekey
  • Address: IP адрес который будет у нас на wireguard интерфейсе. Соответственно такой же как мы указали в файле wg0.conf для нового пира.
  • PublicKey: публичный ключ сервера /etc/wireguard/public.key
  • Endpoint: IP адрес и порт сервера.
  • AllowedIPs: При использовании 0.0.0.0/0, ::/0 будет пересылать весь трафик IPv4 (0.0.0.0/0) и IPv6 (::/0) через VPN.
  • PersistentKeepalive: каждые 20 секунд пир будет связываться с сервером.

Запускаем сервис и сразу смотрим статус на клиенте:

systemctl start wg-quick@laptop
systemctl start wg-quick@laptop

Также созданный файл для клиента можна импортировать через GUI Network менеджера.

Настройка клиента Android

Устанавливаем из андроид маркета офф. приложение wireguard

На сервере делаем ключи для клиента:

wg genkey | tee /etc/wireguard/android_privatekey | wg pubkey | tee /etc/wireguard/android_publickey

Добавляем на сервере в файл wg0.conf новый пир:

...
[Peer]
# Android phone
PublicKey = <СLIENT_PUBLIC_KEY>
AllowedIPs = 10.0.0.3/32

Перезапускаем сервис на сервере:

systemctl restart wg-quick@wg0

Создаем конфиг файл для телефона. Подставив ключи и IP адреса.

[Interface]
PrivateKey = <CLIENT_PRIVATE_KEY>
Address = 10.0.0.3/32
DNS = 10.0.0.1

[Peer]
PublicKey = <SERVER_PUBKEY>
Endpoint = <SERVER_IP>:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 20

Нужно перенести этот конфиг на смартфон, но значительно удобнее использовать QR код.

Для этого нужно установить qrencode

apt install qrencode

Дальше указываем конфиг файл и генерируем QR код.

qrencode -t ansiutf8 < android.conf

После этого в консоли мы увидим QR код и нам остается только отсканировать его через WireGuard на мобильном приложении.
qrencode.png

Настройка клиента Mikrotik

Для роутеров Mikrotik поддержка wireguard есть только в 7 версии routerOS, а она пока что в стадии development(не для продакшена).

Поставил версию 7.1rc4 на MikroTik hAP lite (RB941-2nD), пока работает стабильно.

На момент написания поста доступна версия 7.1rc4

Добавляем wireguard интерфейс.
wg1.png

Добавляем пир. Указав созданный интерфейс, публичный ключ нашего сервера, IP адрес сервера, порт, разрешенные сети(0.0.0.0/0 для всего трафика или только для доступа к нашей сети 10.0.0.0/24) и KeepAlive.
wg2.png

И обязательно добавляем ip адрес на наш wireguard интерфейс.
IP > Addresses
Нажимаем ‘+’, вписываем наш ip, который мы выбрали для клиента(например 10.0.0.3/24), и выбираем наш интерфейс.
addresses.png