WireGuard — open-source-проект с открытым исходным кодом, который позволяет легко и удобно настраивать шифрованные туннели.
Коротко, чем мне нравится WireGuard:
Из минусов:
В сети много различных гайдов и инструкций по настройке и установке. Для ознакомления рекомендую следующее:
В этой инструкции я опишу простые способы начала использования WireGuard и интересные решения — побольше примеров и практики, поменьше воды и теории.
В панели идем в Облачные серверы > Добавить > Маркетплейс > Сеть > Wireguard GUI.
Выбираю Нидерланды, убираю бэкапы, нажимаю «Заказать сервер».
Необходимо минут 5 на создание виртуальной машины и установку ПО, затем придет сообщение на почту, что сервер готов к работе.
Перейду по адресу из письма и войду в интерфейс со своим паролем.
Web-интерфейс — минималистичный и интуитивно понятный.
Добавляю новых клиентов для подключения с Android и Windows PC.
Доступны два способа подключения к серверу с клиентского устройства:
На скриншоте выше видны кнопки для открытия QR-кода и скачивания конфигурационного файла.
Для запуска на смартфоне нужно скачать с GooglePlay официальный клиент Wireguard.
Далее нужно открыть приложение > отсканировать QR-код с web-интерфейса > нажать «Подключиться».
Проверяю IP-адрес на сайте 2ip.ru. Вижу IP-адрес сервера — значит, все работает.
Для подключения нужно:
В целом, это все, уже можно пользоваться. Весь процесс занял около 15 минут:
Еще есть много тонких настроек конфигурации, но на практике хватает способа, который показан выше с минимальными настройками и затратами. Как правило, WireGuard можно один раз поднять, настроить и забыть — работает стабильно.
Информации выше достаточно для того, чтобы легко начать пользоваться, а дальше я буду описывать дополнительные функции и интересные решения.
Для начала проверю скорость интернета с самого сервера. Для этого придется установить speedtest cli tools
:
curl -s https://packagecloud.io/install/repositories/ookla/speedtest-cli/script.deb.sh | sudo bash
sudo apt-get install speedtest
Скорость 194 Mbs — отлично.
Теперь проверим на Windows PC с подключением WireGuard:
172 Mbs — неплохо (ожидал на уровне 180, но вполне нормально).
В целом, решение c WebGUI и установка через маркетплейс Timeweb Cloud в одну кнопку очень упрощает процесс, но хочется больше контроля и удобства для обслуживания. Например, может требоваться установка на другом хостинге или на своем удаленном сервере, где нет маркетплейса.
Так как мне очень нравится Docker, буду использовать его для установки точно такого же WireGuard с веб-интерфейсом.
Начинаю с чистой чистой системы: Создать сервер > Ubuntu 22.04
После создания и подключения к серверу нужно обновить пакеты и установить docker
и docker-compose
:
apt update && apt upgrade -y
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
Создаю новый файл docker-compose.yml
:
nano docker-compose.yml
В редакторе вставляю следующую конфигурацию:
version: '3.8'
services:
wireguard:
image: weejewel/wg-easy:7
environment:
WG_HOST: '188.225.31.8' # Hostname or IP address
PASSWORD: 'MegaSuperPass@42' # web-gui password
volumes:
- ./wireguard:/etc/wireguard
ports:
- 51820:51820/udp
- 51821:51821/tcp
cap_add:
- NET_ADMIN
- SYS_MODULE
sysctls:
- net.ipv6.conf.all.disable_ipv6=0
- net.ipv4.ip_forward=1
- net.ipv4.conf.all.src_valid_mark=1
restart: always
В поле WG_HOST
пропишите IP-адрес вашего сервера, в поле PASSWORD
— пароль от веб-интерфейса WireGuard.
Сохраняю изменения, после чего выполняю команду для запуска:
docker compose up -d
После запуска можно проверить и открыть в браузере по адресу http://IP-адрес:51821
, в моем случае: http://188.225.31.8:51821
.
В итоге получим тот же знакомый web-интерфейс.
Сам проект называется wg-easу
. В репозитории можно ознакомиться с дополнительными настройками.
Дополнительно есть возможность в разделе environment
docker-compose файла, изменить некоторую конфигурацию:
PASSWORD
— пароль для WebGUI.WG_HOST
— hostname или IP-адрес.WG_DEVICE
— устройство Ethernet, через которое должен пересылаться трафик WireGuard. WG_PORT
— общедоступный UDP-порт сервера (51280).WG_MTU
— MTU, который будут использовать клиенты. Сервер использует WG MTU по умолчанию. WG_PERSISTENT_KEEPALIVE
— значение в секундах для проверки соединения. Если это значение равно 0, то соединения не будут поддерживаться в рабочем состоянии. WG_DEFAULT_ADDRESS
— диапазон адресов, которые будут выдаваться клиентам.WG_DEFAULT_DNS
— DNS-сервер.WG_ALLOWED_IPS
— разрешенные IP-адреса, которые будут использовать клиенты.Данный способ установки позволяет чуть удобнее управлять конфигурацией, перезапускать, переносить и править настройки. Также становится удобнее запускать на этом сервере другие сервисы, тоже в Docker, при необходимости.
Этот пункт редко встречается в инструкциях, но мне кажется будет полезным.
При подключении к WireGuard весь трафик пойдет через туннель и к локальным ресурсам напрямую обратиться не получится
В конфигурации WireGuard есть значение AllowedIPs
, где можно указать, какие адреса пойдут через WG. По умолчанию это 0.0.0.0.0/0
, т.е. весь трафик идет через туннель. Для доступа к локальным ресурсам приходится делать наоборот, и все адреса, за исключением нужных (серого списка IP-адресов), добавлять в AllowedIPs
.
Для этого в файле docker-compose.yml
можно добавить environment
-переменную и перезапустить контейнер.
environment:
WG_ALLOWED_IPS: '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'
А в WireGuard WebGUI из маркетплейса перезапустить контейнер с добавлением флага:
-e WG_ALLOWED_IPS='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'
Или на клиентском устройстве отредактировать конфигурационный файл подключения:
[Peer]
PublicKey = PublicKey
PresharedKey = PresharedKey
AllowedIPs = 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
Endpoint = Endpoint
На мой взгляд, WireGuard— один из простых и удобных в использовании сервисов для безопасного доступа в сеть и построения шифрованных каналов связи. Для разных задач я настраивал и использовал PPTP, SSTP, L2TP/IPsec и другие — у каждого есть свои плюсы и минусы. Для каждой задачи нужно подбирать наиболее подходящие инструменты. На данный момент Wireguard справляется со всем необходимыми для меня задачами и не доставляет проблем.
Проект активно развивается, все больше различных устройств поддерживают Wireguard, а некоторые команды разработчиков создают еще дополнительные UI для расширения конфигурации и более удобного управления через GUI (например, проект NetMaker).
Здравствуйте. Все сделал, как написано, и всё работает. Большое спасибо за статью! Что осталось непонятно, это как поменять пароль на WEB UI после установки сервера. Имеется в виду как менять его периодически?
Добрый день, спасибо
На данный момент актуальная версия проекта wg-easy: ghcr.io/wg-easy/wg-easy:13
Где вместо открытого пароля уже используется переменная
PASSWORD_HASH
и зашифрованный bcrypt пароль, пример формата:$$2b$$12$$NRiL4Kw4dKid.ix2WvZltOmaQBZjoX30shjHJXRVdEGshAxYWXXMe
В своем репозитории авторы сделали инструкцию и скрипт для шифрования: https://github.com/wg-easy/wg-easy/blob/master/How_to_generate_an_bcrypt_hash.md
Остается только подставить его в compose файле или использовать файл
.env
При перезапуске контейнера, пароль web ui изменитсяДанный способ усиливает безопасность и пароль уже не будет в явном виде хранится на сервере.