WireGuard

Обновлено 31 января 2020

WireGuard

WireGuard - это чрезвычайно простой, но быстрый VPN, в котором используются самые современные алгоритмы шифрования. Он нацелен на то, чтобы быть быстрее, проще, функциональней и производительней, чем IPsec и OpenVPN. WireGuard спроектирован как универсальный VPN для работы как на встроенных интерфейсах, так и на суперкомпьютерах, подходящих для множества различных задач. Первоначально выпущенный для ядра Linux, теперь WireGuard кроссплатформенный и поддерживаеться на следующих устройствах: Windows, macOS, BSD, iOS, Android.

WireGuard разрабатывался с учётом того, что его будет просто установить и настроить. Его можно легко реализовать в несколько строк кода и легко проверять на наличие уязвимостей в безопасности. По сравнению с такими гигантами, как Swan/IPsec и OpenVPN/OpenSSL, в которых анализ кода является непосильной задачей даже для больших групп экспертов по безопасности, WireGuard возможно разобрать самостоятельно. WireGuard использует самые прогрессивные протоколы шифрования, такие как Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF. Сочетание чрезвычайно высокоскоростных алгоритмов шифрования и того факта, что WireGuard являеться частью ядра Linux, означает, что безопасная сеть может быть очень производительной. С подробной информацией о работе протокола можно ознакомиться в документации PDF.

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

Установка

Для установки модулей и утилит WireGuard выполните:

emerge -a net-vpn/wireguard-tools net-vpn/wireguard-modules

Генерация ключей сервера

Перейдите в директорию настроек WireGuard:

cd /etc/wireguard

Выполните генерацию закрытого и открытого ключей:

wg genkey | tee privkey | wg pubkey > publickey

Выведите публичный и приватный ключи:

tail -n +1 publickey privkey
==> publickey <==
ACMHojZjwV616cIsToFrQowXMJRxwEThFoEsvJnL/QM=

==> privkey <==
UBrksRvBtaRz0X33E7fvNd43eXC/SpwNsA8wKATVA3w=

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

Отредактируйте конфигурационный файл на сервере, указав в нём:

  • IP адрес сетевого интерфейса сервера;
  • порт, по которому будет происходить подключение;
  • приватный ключ, сгенерированный на стороне сервера (его содержимое).

Например, у сервера IP адрес 192.168.50.1, порт подключения 51820. Тогда конфиг будет выглядеть следующим образом:

/etc/wireguard/wg0.conf

[Interface]
# Адрес сетевого интерфейса WireGuard
Address = 192.168.50.1/24
# Порт по которому сервер ожидает подключение
ListenPort = 51820
# Приватный ключ сервера
PrivateKey = UBrksRvBtaRz0X33E7fvNd43eXC/SpwNsA8wKATVA3w=

Важно

Если на сервере установлен файервол, настройте разрешения для подключений по указанному порту.

Настройте права доступа к конфигурационному файлу и ключам:

chmod 600 wg0.conf privkey publickey

Настройка маршрутизации

Настройте пересылку трафика между интерфейсами сервера добавив следующие строки:

/etc/sysctl.conf

net.ipv4.ip_forward=1
net.ipv4.conf.all.forwarding=1
net.ipv6.conf.all.forwarding=1

Для принятия изменений выполните:

sysctl -p /etc/sysctl.conf

Настройка маршрутизации при помощи Iptables

Сервер должен быть настроен на обработку этого трафика - например, путем отправки в Интернет через NAT. Чтобы направить трафик клиента в Интернет через NAT, выполните:

iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o eth0 -j MASQUERADE

Вместо eth0 укажите локальный сетевой интерфейс сервера.

Сохраните правила маршрутизации и добавьте их в автозапуск:

/etc/init.d/iptables save

rc-update add iptables

Настройка маршрутизации при помощи Shorewall

При использовании Shorewall выполните настройку согласно руководству.

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

Добавьте службу WireGuard в автозагрузку:

rc-update add wireguard

Запустите серевер WireGuard:

/etc/init.d/wireguard start

Добавление клиента в настройки сервера

Добавьте в настройки WireGuard информацию о клиенте, указав его IP WireGuard-интерфейса и публичный ключ клиента:

/etc/wireguard/wg0.conf

[Peer]
# Публичный ключ клиента
PublicKey = rT9yZRcg2pscyGkder/xTGds5/sy+mX0+Z/yq2RM4HU=
AllowedIPs = 192.168.50.2

Перезапустите службу WireGuard на сервере:

/etc/init.d/wireguard restart

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

Установка

Для установки модулей и утилит WireGuard выполните:

emerge net-vpn/wireguard-tools net-vpn/wireguard-modules

Генерация ключей

Перейдите в директорию настроек WireGuard:

cd /etc/wireguard

Выполните генерацию закрытого и открытого ключей:

wg genkey | tee privkey | wg pubkey > publickey

Выведите публичный и приватный ключи:

tail -n +1 publickey privkey
==> publickey <==
rT9yZRcg2pscyGkder/xTGds5/sy+mX0+Z/yq2RM4HU=

==> privkey <==
gFDdeXHCIFEY5t4Tn3ETiZba/ElCxEIj1W8wX/YFVE4=

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

Отредактируйте конфигурационный файл на клиенте, указав в нём

  • IP адрес сетевого интерфейса клиента;
  • порт, по которому будет происходить подключение;
  • приватный ключ, сгенерированный на стороне клиента (его содержимое).

Например, у клиента IP адрес 192.168.50.2, порт подключения 51820. Тогда конфиг будет выглядеть следующим образом:

/etc/wireguard/wg0.conf

[Interface]
Address = 192.168.50.2/24
# Закрытый ключ клиента
PrivateKey = gFDdeXHCIFEY5t4Tn3ETiZba/ElCxEIj1W8wX/YFVE4=
DNS = 8.8.8.8

[Peer]
# Открытый ключ сервера
PublicKey = ACMHojZjwV616cIsToFrQowXMJRxwEThFoEsvJnL/QM=
AllowedIPs = 0.0.0.0/0
# Внешний ip адрес сервера и порт для подключения
Endpoint = wg.example.org:51820
PersistentKeepalive = 20
Исключение частных сетей

Для исключения частных сетей из маршрутизации через туннель, утановите в AllowedIPs вместо 0.0.0.0/0 следующие значения:

0.0.0.0/5, 8.0.0.0/7, 11.0.0.0/8, 12.0.0.0/6, 16.0.0.0/4, 32.0.0.0/3, 64.0.0.0/2, 128.0.0.0/3, 160.0.0.0/5, 168.0.0.0/6, 172.0.0.0/12, 172.32.0.0/11, 172.64.0.0/10, 172.128.0.0/9, 173.0.0.0/8, 174.0.0.0/7, 176.0.0.0/4, 192.0.0.0/9, 192.128.0.0/11, 192.160.0.0/13, 192.169.0.0/16, 192.170.0.0/15, 192.172.0.0/14, 192.176.0.0/12, 192.192.0.0/10, 193.0.0.0/8, 194.0.0.0/7, 196.0.0.0/6, 200.0.0.0/5, 208.0.0.0/4, 8.8.8.8/32

Настройте права доступа к конфигурационному файлу и ключам:

chmod 600 wg0.conf privkey publickey

Запуск туннеля до сервера

Добавьте службу WireGuard в автозагрузку:

rc-update add wireguard

Запустите службу WireGuard:

/etc/init.d/wireguard start

Проверить подключение на стороне клиента можно командой route, либо посмотрев внешний IP адрес с компьютера клиента:

dig +short myip.opendns.com @resolver1.opendns.com

Посмотреть информацию о подключении можно командой:

wg
interface: wg0
public key: 6BfFNvPQbHKKDENJMRGXu0vVYaOsfEBxFpweNGLvU3Q=
  private key: (hidden)
  listening port: 45741
  fwmark: 0xca6c

peer: EDECjzNvTRsuuxiPD8VTS7N8cmcJ1fUIaANUdrOnbXM=
  endpoint: 1.2.3.4:51820
  allowed ips: 0.0.0.0/0
  latest handshake: 1 minute, 40 seconds ago
  transfer: 2.37 MiB received, 833.84 KiB sent
  persistent keepalive: every 20 seconds

Настройка Android

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

Установите библиотеку для кодирования данных в QR-код:

emerge -a media-gfx/qrencode

После этого на основе конфигурационного файла клиента сформируйте QR код

qrencode -t ansiutf8 < wg0.conf
█████████████████████████████████████████████████████████████████████████████████
█████████████████████████████████████████████████████████████████████████████████
████ ▄▄▄▄▄ █ ▀▀    █▄█▄  ▀▀█▄▄ ▀▄▀ ▄ ▀█▀▀▄ █    ▀▄▀▀ █▀▄▄▄▀▄▀▄ ▀▀  █▄█ ▄▄▄▄▄ ████
████ █   █ █ █▄▀▄█  █ ▀█▀█▀▄█▀▄▀█ █▄▄█▀▀▄▄▄█ ▀▀ ▄▀▀█▄ ▀█ ▀▀▀ █ ▄█ ▀▀██ █   █ ████
████ █▄▄▄█ █▀▀▄▄▀▄█  ▀▄ █▀▄  ▄▄▄ █  ██▀█  █ ▄█ ▀ ▄▄▄  ▀▀ ▄█ █▀█▀ ▀▀▄▄█ █▄▄▄█ ████
████▄▄▄▄▄▄▄█▄█ ▀ ▀ █▄█▄▀▄▀ █ █▄█ █ █▄▀▄█ ▀▄█ █▄█ █▄█ █▄▀ █▄▀▄█▄▀ █ ▀ █▄▄▄▄▄▄▄████
████ ▄▀█▄▄▄█▀▀▄▄ █▀▀▀▄ ▄ █▄▄ ▄ ▄ █ ▀██▄▀██▀█▀ ▀▄ ▄▄▄ ▀▀▀█▀▀▀ ▀▄██▀  █▀█ ▀▄  ▄████
████▀▀▀█▀▄▄ ▀▄▀█▀▀▄█▀█▀▄▄ ▄ ▀▀██▀ ▄▄▄▀█▀█▄▀ ▀▀▀█▀█▄██▀▀█  █▀██▄ ▄▄▄▄ ▀▀▄██  ▀████
████▄▄ ▄ ▀▄█ ▀ █ █▀▀▄ ▄▄▀██ ▄▄ ▀▀█ █ █▄▀▀ ▀█ █▀ ▀█▀ █▀▀▄▀▄█ █▀▀▀█▄██▀▀▀ █▀ ██████
█████▄█ █▀▄ ▄▄▄▄███▀▄██  █  ▀▄█▄█▀▀█▀▀▄█▄ ███▀ ▄▀  ▄▄█▄▀ ▄█▄█▄▀ ▀ ▄█▄ ▀▀   ▀▀████
█████   ▄▀▄█████▀ ▄▄ ▀ ▀ ███   ▄██▀  █▄█▄▀▀▀ █▀█ █▀▀█ ▀█▀▀█▀█▀▀█▀█ ▄▄▀█▄██ ▄▀████
████ █▄▄▀█▄█  ▀▄▀█▀█▀█  █ ▀ █ ▄ ██ ▀▀█▄▄  ▀█ ▀██▀ ▀  ▀█▄ █▄▄█  ▀▀▀█ █ ██  █▀█████
████▄ ▄▀█▄▄▄█ ▀ ▀ ▀  ▄▄ ██▄▄▀ ▄▀█▀█ █▀ █▄█▄█▀  ▄██▀▀█ ▀▄▀ ▀▄█▀▀█▀▀ ▄█▄▄ ▄██▄▀████
█████▀▄ █▀▄ ▄▀▄██  ▀▀▀▀ █▀▀ ██ ▄▄▄▀▄▀  ▄▄█▀▄▀ ▀█▀ █▀▀ ███ ██ █▀ ▄▄▀█ ▄▄▀▄█▄█▀████
████▄▄ ▄ ▄▄▄ █  ██▀ ▄▄█▄ ▀▀▀ ▄▄▄ ██▄ ▀██▄ ▀███▀▄ ▄▄▄ ▀  ██   ▄ ▄▀ █  ▄▄▄ ▀ ▀█████
████▀██▀ █▄█ ▄ ▀  █▄▄██  ▀   █▄█  ▀▄▄█    █▀▄▀█▄ █▄█ ▀▀ ▄▀▀ ▀█▀ ▄  ▀ █▄█ ▄▀█▀████
████ ▀▀  ▄▄  ▄▀██▀▄▀▀▄▄ ▄▀█▄▄  ▄▄█▀ ▄█ █ █▀▄▀▀      ▄█▄▄ ▀█▀█▄█▀ ▀▄    ▄  ▄▄▄████
████▄▀▀ ▀▄▄▀ ▀██ █▄█▄ ██▀▄▄▄▀ ▀  ▀█ ▀█▀█▄▄ █▀███▄█▀ ▄▄█▄▄▄▄ █▀▀▀▀ █▄███▀██▄▄█████
████▄█▀▀▀█▄█   ▀ ▀▀▀██▄▄██▄▀▄▄█ ██  ▄█ █  ▀█▀▄█ ▄▀▄█▄▀▀▀▀ ▀  ▀  ▄ █▀  ▄██▀ █▀████
████▄▀▀█▄▀▄█ ▄█▄▀▀█▀▀ █▄▄█▄▄ ▀▀▄ ▀▄▀▄█▄██ ▀▄▀▀ ▄ █▀▀ ▀█▀ ▀▄▄▀▀▀████▄▀██▄▀█▄█▀████
█████ █▄▄ ▄ █▄█ █ ▄▄▀█▀ █▄▀▄ ▄▄▀█▄  ▄█▀█  ████▀  ▄██ ▄█▀██▀▀██▀ █▄ ▀██▄█▀▀▄▀▀████
████ ▄▀█▀▀▄█▀█▄▄▀▄▀█▀▄ ▀▄▀   ▀   █▀█▄ ██▀▀█▀▄▄██ █▄▄▀▄█▀▀ ███ ▀▄█▄ █▀▀▀▄▄  ██████
████▄██▄▄▄▄ █  █ ▄▄▀▄▀▄█ ▀▄█▀▄ █▀█▄▀▄█▄███▀▄▄ ▀  ▄██▀▀█▀██▄ █▄▀█ ▀▄ ▄██▄▄ █  ████
████▀▀▀█▄ ▄█ ▄█▀▀▄▀█▄▄▀▄▄▀ █ ▀▄ █▄▄▄▄▀▄▀█▄  ▄▀ ██ ▄▄██ █▄ ███▀ ▄▄     ▄▄ ▄  ▀████
████ ▀ ▀ ▄▄▄ ▀▀▄█ ▄▀ ▄▄▄▀▀▀█ ▄▄▄ █▀▀▄█▄█▄ ▀▀██▀▀ ▄▄▄  ▄▄▀▄█▄▄█▄ █▄   ▄▄▄ █ ██████
████  ▀▄ █▄█ ▄██▄▄ ▀  ▀   ▄▄ █▄█  ▀ ▀▀█▀▄ ▄█▀▀ ▀ █▄█ █▄▀ ▄█▄▀▄ ▄▀▀▄█ █▄█  ▄▀█████
████▀▄▄  ▄▄▄▄▀▀█▄▄▀▄▄█   ███▄ ▄  █▀ ██▄█▄▀▀▀██▀█    ▄▄█▀█▀▀ ▀▄█▀▄▄ █▄  ▄ █ ▄█████
████▄▄█   ▄ ▄█ █▀▄█▀▄█  █ ▀▀▄▀  ▀█▀ ██▀▀ █  ▄█▀█▄  ▀█▀▄█▄▀████ ▀█▀▄▄██▄▀▄▄▄▄█████
█████▀ █▄▀▄ ▀▄ ▄  ██ ▄▄███▄█▀▄   ▀█▀▄██▄▀█ ▀▀█▄▄▀▀▀  ▀▀▀▄ █▄█▀█ ▄▀ ▀▀█ ▀ █▀ ▀████
█████ ▀ ██▄█ █▄▄▀█▀▀█▀█▀▄▀▀ ▄▀█▄▄ ▀▄█▄ ▄██ █▄  ▀▄ ███▀█▀▀▀██▄▀ ▄██▀ ▀▀▀█  ▀ █████
████▀ █▄▀ ▄ ▄█ █ █ ▄   ▀▄▄▀█  ▀▀    ▄█▄█▄ ▀█▀█▀▄ ██▀▀▀ █▀█▄ ▄ ███▀▄█▄█▄ ▀ █▀ ████
████▀▀▄▄█▄▄▄ █ ▄ ▀▄▀▄▄▀ ▀▀ ▄█▄▄▀▀ ▄█▄    ▄█ █▀▄▄▄▄█▄ ▄▀▄▄ ▄▄█ █▀▄ █▄ ▄▄█ █   ████
████   ▀▄ ▄▄█▄▄█ █▀▀█▀  ▄ ▄▄▄▄▀█     ███▀█▄▄▀   █▀ ██ ▀ ▀█▄▀▄  ▀ █ ▄▀▄ ▄▀  ▄ ████
████▄▄█ ▀▄▄ ▄  █▄▄██████▀█ ▀█▄▀  ▄█ █▀ ▀  ████▄▄█ █ █▄▄█ ▄▄ ██ ██▀▄▄ █▀█▀▀▄▀ ████
████▄███▄█▄█▀▄▀ █▄▀▀ █ ████▄ ▄▄▄ ██ ▄██▀   █▀██▄ ▄▄▄ ▀▀█▄▀▀██▀▀▄ ▄█▄ ▄▄▄ ▀▀▄ ████
████ ▄▄▄▄▄ █▀▄█▀▄█  ▀ ▄▄▄██  █▄█ ▀▄▀▄█ █ ▀▀▄▀█ ▀ █▄█ ▀█▀▄ ████ ██▄▄█ █▄█ ▄▀  ████
████ █   █ █▄▀▀▀  ██▀█▀ ▄▄▀▄  ▄▄ ▄  ▄▄ █▄ ▄█▀▀▀▄ ▄ ▄▄▄██▄█▀ ▄▀ ▄ █▀▄    ▄▀██▀████
████ █▄▄▄█ █▀██▀▀██ ▀█ ▀█▀ ▀ █▄ ██▀█▄ ▀▄▄▀▄▄▀ █ ▀ ▄ ▄██▄▄ ██▄▄▀█▄▄▀ ▀▀▀▄▀██ █████
████▄▄▄▄▄▄▄█▄▄▄▄████▄▄▄█▄▄█▄████▄█▄█▄▄██▄██▄▄▄▄▄▄█▄█▄▄▄███████▄█▄▄▄▄███▄▄▄▄▄▄████
█████████████████████████████████████████████████████████████████████████████████
█████████████████████████████████████████████████████████████████████████████████

Установите официальное приложение WireGuard для Android или iPhone.

Запустите приложение и выберите создание туннеля с помощью QR кода.

Скриншот

Проверка подключения

Для проверки подключения после запуска туннеля вам понадобится терминал. Для примера вы можете установить Terminal Emulator.

Скриншот