WireGuard
Обновлено 27 сентября 2021
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
Генерация ключей сервера
Выполните генерацию закрытого и открытого ключей:
cd /etc/wireguard
umask 077
wg genkey > privatekey
wg pubkey < privatekey > publickey
Выведите публичный и приватный ключи:
==> 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
Настройка маршрутизации
Настройте пересылку трафика между интерфейсами сервера добавив следующие строки:
/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 -a net-vpn/wireguard-tools
Генерация ключей
Выполните генерацию закрытого и открытого ключей:
cd /etc/wireguard
umask 077
wg genkey > privatekey
wg pubkey < privatekey > publickey
Выведите публичный и приватный ключи:
==> 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
Запуск туннеля до сервера
Добавьте службу WireGuard в автозагрузку:
rc-update add wireguard
Запустите службу WireGuard:
/etc/init.d/wireguard start
Проверить подключение на стороне клиента можно командой route
, либо посмотрев внешний IP адрес с компьютера клиента:
dig +short myip.opendns.com @resolver1.opendns.com
Посмотреть информацию о подключении можно командой:
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 код
█████████████████████████████████████████████████████████████████████████████████ █████████████████████████████████████████████████████████████████████████████████ ████ ▄▄▄▄▄ █ ▀▀ █▄█▄ ▀▀█▄▄ ▀▄▀ ▄ ▀█▀▀▄ █ ▀▄▀▀ █▀▄▄▄▀▄▀▄ ▀▀ █▄█ ▄▄▄▄▄ ████ ████ █ █ █ █▄▀▄█ █ ▀█▀█▀▄█▀▄▀█ █▄▄█▀▀▄▄▄█ ▀▀ ▄▀▀█▄ ▀█ ▀▀▀ █ ▄█ ▀▀██ █ █ ████ ████ █▄▄▄█ █▀▀▄▄▀▄█ ▀▄ █▀▄ ▄▄▄ █ ██▀█ █ ▄█ ▀ ▄▄▄ ▀▀ ▄█ █▀█▀ ▀▀▄▄█ █▄▄▄█ ████ ████▄▄▄▄▄▄▄█▄█ ▀ ▀ █▄█▄▀▄▀ █ █▄█ █ █▄▀▄█ ▀▄█ █▄█ █▄█ █▄▀ █▄▀▄█▄▀ █ ▀ █▄▄▄▄▄▄▄████ ████ ▄▀█▄▄▄█▀▀▄▄ █▀▀▀▄ ▄ █▄▄ ▄ ▄ █ ▀██▄▀██▀█▀ ▀▄ ▄▄▄ ▀▀▀█▀▀▀ ▀▄██▀ █▀█ ▀▄ ▄████ ████▀▀▀█▀▄▄ ▀▄▀█▀▀▄█▀█▀▄▄ ▄ ▀▀██▀ ▄▄▄▀█▀█▄▀ ▀▀▀█▀█▄██▀▀█ █▀██▄ ▄▄▄▄ ▀▀▄██ ▀████ ████▄▄ ▄ ▀▄█ ▀ █ █▀▀▄ ▄▄▀██ ▄▄ ▀▀█ █ █▄▀▀ ▀█ █▀ ▀█▀ █▀▀▄▀▄█ █▀▀▀█▄██▀▀▀ █▀ ██████ █████▄█ █▀▄ ▄▄▄▄███▀▄██ █ ▀▄█▄█▀▀█▀▀▄█▄ ███▀ ▄▀ ▄▄█▄▀ ▄█▄█▄▀ ▀ ▄█▄ ▀▀ ▀▀████ █████ ▄▀▄█████▀ ▄▄ ▀ ▀ ███ ▄██▀ █▄█▄▀▀▀ █▀█ █▀▀█ ▀█▀▀█▀█▀▀█▀█ ▄▄▀█▄██ ▄▀████ ████ █▄▄▀█▄█ ▀▄▀█▀█▀█ █ ▀ █ ▄ ██ ▀▀█▄▄ ▀█ ▀██▀ ▀ ▀█▄ █▄▄█ ▀▀▀█ █ ██ █▀█████ ████▄ ▄▀█▄▄▄█ ▀ ▀ ▀ ▄▄ ██▄▄▀ ▄▀█▀█ █▀ █▄█▄█▀ ▄██▀▀█ ▀▄▀ ▀▄█▀▀█▀▀ ▄█▄▄ ▄██▄▀████ █████▀▄ █▀▄ ▄▀▄██ ▀▀▀▀ █▀▀ ██ ▄▄▄▀▄▀ ▄▄█▀▄▀ ▀█▀ █▀▀ ███ ██ █▀ ▄▄▀█ ▄▄▀▄█▄█▀████ ████▄▄ ▄ ▄▄▄ █ ██▀ ▄▄█▄ ▀▀▀ ▄▄▄ ██▄ ▀██▄ ▀███▀▄ ▄▄▄ ▀ ██ ▄ ▄▀ █ ▄▄▄ ▀ ▀█████ ████▀██▀ █▄█ ▄ ▀ █▄▄██ ▀ █▄█ ▀▄▄█ █▀▄▀█▄ █▄█ ▀▀ ▄▀▀ ▀█▀ ▄ ▀ █▄█ ▄▀█▀████ ████ ▀▀ ▄▄ ▄▀██▀▄▀▀▄▄ ▄▀█▄▄ ▄▄█▀ ▄█ █ █▀▄▀▀ ▄█▄▄ ▀█▀█▄█▀ ▀▄ ▄ ▄▄▄████ ████▄▀▀ ▀▄▄▀ ▀██ █▄█▄ ██▀▄▄▄▀ ▀ ▀█ ▀█▀█▄▄ █▀███▄█▀ ▄▄█▄▄▄▄ █▀▀▀▀ █▄███▀██▄▄█████ ████▄█▀▀▀█▄█ ▀ ▀▀▀██▄▄██▄▀▄▄█ ██ ▄█ █ ▀█▀▄█ ▄▀▄█▄▀▀▀▀ ▀ ▀ ▄ █▀ ▄██▀ █▀████ ████▄▀▀█▄▀▄█ ▄█▄▀▀█▀▀ █▄▄█▄▄ ▀▀▄ ▀▄▀▄█▄██ ▀▄▀▀ ▄ █▀▀ ▀█▀ ▀▄▄▀▀▀████▄▀██▄▀█▄█▀████ █████ █▄▄ ▄ █▄█ █ ▄▄▀█▀ █▄▀▄ ▄▄▀█▄ ▄█▀█ ████▀ ▄██ ▄█▀██▀▀██▀ █▄ ▀██▄█▀▀▄▀▀████ ████ ▄▀█▀▀▄█▀█▄▄▀▄▀█▀▄ ▀▄▀ ▀ █▀█▄ ██▀▀█▀▄▄██ █▄▄▀▄█▀▀ ███ ▀▄█▄ █▀▀▀▄▄ ██████ ████▄██▄▄▄▄ █ █ ▄▄▀▄▀▄█ ▀▄█▀▄ █▀█▄▀▄█▄███▀▄▄ ▀ ▄██▀▀█▀██▄ █▄▀█ ▀▄ ▄██▄▄ █ ████ ████▀▀▀█▄ ▄█ ▄█▀▀▄▀█▄▄▀▄▄▀ █ ▀▄ █▄▄▄▄▀▄▀█▄ ▄▀ ██ ▄▄██ █▄ ███▀ ▄▄ ▄▄ ▄ ▀████ ████ ▀ ▀ ▄▄▄ ▀▀▄█ ▄▀ ▄▄▄▀▀▀█ ▄▄▄ █▀▀▄█▄█▄ ▀▀██▀▀ ▄▄▄ ▄▄▀▄█▄▄█▄ █▄ ▄▄▄ █ ██████ ████ ▀▄ █▄█ ▄██▄▄ ▀ ▀ ▄▄ █▄█ ▀ ▀▀█▀▄ ▄█▀▀ ▀ █▄█ █▄▀ ▄█▄▀▄ ▄▀▀▄█ █▄█ ▄▀█████ ████▀▄▄ ▄▄▄▄▀▀█▄▄▀▄▄█ ███▄ ▄ █▀ ██▄█▄▀▀▀██▀█ ▄▄█▀█▀▀ ▀▄█▀▄▄ █▄ ▄ █ ▄█████ ████▄▄█ ▄ ▄█ █▀▄█▀▄█ █ ▀▀▄▀ ▀█▀ ██▀▀ █ ▄█▀█▄ ▀█▀▄█▄▀████ ▀█▀▄▄██▄▀▄▄▄▄█████ █████▀ █▄▀▄ ▀▄ ▄ ██ ▄▄███▄█▀▄ ▀█▀▄██▄▀█ ▀▀█▄▄▀▀▀ ▀▀▀▄ █▄█▀█ ▄▀ ▀▀█ ▀ █▀ ▀████ █████ ▀ ██▄█ █▄▄▀█▀▀█▀█▀▄▀▀ ▄▀█▄▄ ▀▄█▄ ▄██ █▄ ▀▄ ███▀█▀▀▀██▄▀ ▄██▀ ▀▀▀█ ▀ █████ ████▀ █▄▀ ▄ ▄█ █ █ ▄ ▀▄▄▀█ ▀▀ ▄█▄█▄ ▀█▀█▀▄ ██▀▀▀ █▀█▄ ▄ ███▀▄█▄█▄ ▀ █▀ ████ ████▀▀▄▄█▄▄▄ █ ▄ ▀▄▀▄▄▀ ▀▀ ▄█▄▄▀▀ ▄█▄ ▄█ █▀▄▄▄▄█▄ ▄▀▄▄ ▄▄█ █▀▄ █▄ ▄▄█ █ ████ ████ ▀▄ ▄▄█▄▄█ █▀▀█▀ ▄ ▄▄▄▄▀█ ███▀█▄▄▀ █▀ ██ ▀ ▀█▄▀▄ ▀ █ ▄▀▄ ▄▀ ▄ ████ ████▄▄█ ▀▄▄ ▄ █▄▄██████▀█ ▀█▄▀ ▄█ █▀ ▀ ████▄▄█ █ █▄▄█ ▄▄ ██ ██▀▄▄ █▀█▀▀▄▀ ████ ████▄███▄█▄█▀▄▀ █▄▀▀ █ ████▄ ▄▄▄ ██ ▄██▀ █▀██▄ ▄▄▄ ▀▀█▄▀▀██▀▀▄ ▄█▄ ▄▄▄ ▀▀▄ ████ ████ ▄▄▄▄▄ █▀▄█▀▄█ ▀ ▄▄▄██ █▄█ ▀▄▀▄█ █ ▀▀▄▀█ ▀ █▄█ ▀█▀▄ ████ ██▄▄█ █▄█ ▄▀ ████ ████ █ █ █▄▀▀▀ ██▀█▀ ▄▄▀▄ ▄▄ ▄ ▄▄ █▄ ▄█▀▀▀▄ ▄ ▄▄▄██▄█▀ ▄▀ ▄ █▀▄ ▄▀██▀████ ████ █▄▄▄█ █▀██▀▀██ ▀█ ▀█▀ ▀ █▄ ██▀█▄ ▀▄▄▀▄▄▀ █ ▀ ▄ ▄██▄▄ ██▄▄▀█▄▄▀ ▀▀▀▄▀██ █████ ████▄▄▄▄▄▄▄█▄▄▄▄████▄▄▄█▄▄█▄████▄█▄█▄▄██▄██▄▄▄▄▄▄█▄█▄▄▄███████▄█▄▄▄▄███▄▄▄▄▄▄████ █████████████████████████████████████████████████████████████████████████████████ █████████████████████████████████████████████████████████████████████████████████
Установите официальное приложение WireGuard для Android или iPhone.
Запустите приложение и выберите создание туннеля с помощью QR кода.
Проверка подключения
Для проверки подключения после запуска туннеля вам понадобится терминал. Для примера вы можете установить Terminal Emulator.