Как настроить WireGuard-сервер с помощью WireGuard-UI на Ubuntu

Когда вы подключаетесь к WiFi в кофейне или выходите в Интернет из любой публичной сети, ваши данные проходят через сегмент сети, который вы не контролируете. Любой человек, находящийся между вами и посещаемыми вами сайтами, потенциально может перехватить ваш трафик. Даже в домашней сети ваш интернет-провайдер может видеть каждый сайт, который вы просматриваете.

wireguard решает эту проблему, создавая зашифрованный туннель между вашим устройством и сервером, которому вы доверяете. Вместо того чтобы ваш трафик шел напрямую в интернет, он сначала проходит через этот защищенный туннель к вашему WireGuard-серверу, который затем пересылает его по назначению, поэтому все, кто следит за сетью, видят только зашифрованные данные, идущие к вашему WireGuard-серверу, и ничего больше.

WireGuard – это современный протокол VРN, который отлично справляется с этой задачей. В отличие от старых технологий, требующих сотен тысяч строк кода, WireGuard выполняет ту же задачу всего за 4 000 строк, что означает меньшее количество ошибок, лучшую производительность и более легкий аудит безопасности.

Но вот в чем дело: хотя сам WireGuard прост, управление несколькими клиентами, создание конфигурационных файлов и отслеживание того, кто имеет доступ, может стать утомительным только через командную строку, поэтому наличие веб-интерфейса оказывается очень кстати.

В этом руководстве мы настроим полноценный Сервер WireGuard с дружественным веб-интерфейсом, который позволит вам управлять всем через браузер, например, добавлять новые устройства, генерировать QR-коды для мобильных клиентов и отслеживать соединения, не трогая ни одного файла конфигурации вручную.

Что вам понадобится

Прежде чем мы начнем, убедитесь, что у вас есть:

  • Linux-сервер с публичным IP-адресом.
  • Root-доступ или привилегии sudo на этом сервере.
  • Базовое понимание SSH (вы должны знать, как подключиться к вашему серверу).

Это руководство предполагает, что вы используете Ubuntu 22.04 или Ubuntu 24.04, но это отлично работает и на Debian и других дистрибутивах.

Понимание архитектуры

Прежде чем начать вводить команды, давайте немного разберемся в том, что мы собираем.

Система WireGuard состоит из пиров – устройств, которые могут общаться друг с другом через зашифрованные туннели.

В нашем случае это:

  • Сервер: Ваша Linux-машина с публичным IP-адресом, которая выступает в качестве центрального узла, к которому подключаются все ваши устройства.
  • Клиенты: Ваш ноутбук, телефон, планшет или любое другое устройство, которое вы хотите защитить. Каждый клиент получает свою собственную пару криптографических ключей и конфигурацию.
  • web-интерфейс: Легкое веб-приложение – WireGuard-UI, которое запускается на вашем сервере и предоставляет вам приборную панель для управления всем.

Когда клиент хочет подключиться, он устанавливает прямой зашифрованный туннель к серверу, а затем сервер маршрутизирует интернет-трафик клиента или просто разрешает доступ к ресурсам в локальной сети сервера, в зависимости от того, как вы его настроите.

Шаг 1: Установка WireGuard на сервер Ubuntu

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

sudo apt update && sudo apt upgrade -y

Далее установите сам WireGuard:

sudo apt install wireguard -y

Поскольку WireGuard встроен в ядро Linux (для Linux 5.6 и выше), эта команда в первую очередь устанавливает инструменты пользовательского пространства, необходимые для настройки и управления интерфейсами WireGuard.

Шаг 2: Включение переадресации IP-адресов в Ubuntu

По умолчанию Ubuntu не пересылает пакеты между сетевыми интерфейсами, что является функцией безопасности, благодаря которой ваш сервер не будет действовать как маршрутизатор, если вы явно не укажете ему на это, но для WireGuard-сервера нам нужна эта функциональность.

Когда ваш телефон подключается к серверу и пытается посетить веб-сайт, сервер должен переслать запрос из интерфейса WireGuard* в свой публичный сетевой интерфейс, а затем переслать ответ обратно.

Чтобы включить постоянную переадресацию IP-адресов, нам нужно отредактировать файл конфигурации системы:

sudo nano /etc/sysctl.conf

Найдите эту строку (она может быть закомментирована со знаком # в начале):

#net.ipv4.ip_forward=1

Удалите #, чтобы откомментировать ее, или добавьте строку, если она не существует:

net.ipv4.ip_forward=1

Сохраните файл, а затем примените изменения без перезагрузки:

sudo sysctl -p

Шаг 3: Настройка брандмауэра и маршрутизации для WireGuard

Ваш WireGuard-сервер должен принимать входящие соединения на порт, который использует WireGuard (по умолчанию UDP-порт 51820). Он также должен правильно маршрутизировать трафик между интерфейсом сервера и интерфейсом вашей публичной сети.

Сначала определим ваш публичный сетевой интерфейс:

ip route | grep default

Вы увидите вывод типа:

default via 192.168.1.1 dev eth0 proto dhcp src 192.168.1.100 metric 100

Имя интерфейса здесь eth0, но в вашей системе оно может быть другим, это может быть ens3, enp0s3 или что-то подобное.

Теперь давайте настроим брандмауэр ufw (брандмауэр по умолчанию в Ubuntu):

Allow SSH (if you haven't already)
sudo ufw allow 22/tcp
Allow WireGuard
sudo ufw allow 51820/udp
Allow the web interface (we'll use port 5000)
sudo ufw allow 5000/tcp

Далее нам нужно добавить правило NAT (Network Address Translation), которое указывает вашему серверу маскировать трафик так, как будто он исходит от самого сервера при пересылке его в интернет.

sudo nano /etc/ufw/before.rules

Добавьте эти строки в верхней части файла, сразу после комментариев заголовка, но перед строкой *filter и замените eth0 на реальное имя вашего интерфейса:

NAT table rules for WireGuard
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE
COMMIT

Вот что это значит:

  • *nat: Мы работаем с таблицей NAT.
  • -s 10.0.0.0/24: Для пакетов, приходящих из нашей WireGuard-сети (10.0.0.0/24 – подсеть, которую мы назначаем клиентам).
  • -o eth0: Выходит через интерфейс eth0.
  • -j MASQUERADE: Переписываем IP-адрес источника на публичный IP-адрес сервера.

Сохраните и выйдите, затем включите и перезагрузите UFW:

sudo ufw enable
sudo ufw reload

Шаг 4: Установка WireGuard-UI на Ubuntu Server

Теперь наступает самое интересное – настройка веб-интерфейса с помощью WireGuard-UI, который представляет собой чистое и простое веб-приложение, написанное на языке go.

Для начала создайте каталог WireGuard-UI:

sudo mkdir -p /opt/wireguard-ui
cd /opt/wireguard-ui

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

sudo wget https://github.com/ngoduykhanh/wireguard-ui/releases/download/v0.6.2/wireguard-ui-v0.6.2-linux-amd64.tar.gz

После загрузки распакуйте его и сделайте исполняемым:

sudo tar -xzf wireguard-ui-v0.6.2-linux-amd64.tar.gz
sudo chmod +x wireguard-ui

Перед запуском интерфейса создадим службу systemd, чтобы она запускалась автоматически при загрузке.

sudo nano /etc/systemd/system/wireguard-ui.service

Вставьте эту конфигурацию:

[Unit]
Description=WireGuard UI
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/wireguard-ui
ExecStart=/opt/wireguard-ui/wireguard-ui
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

Сохраните и выйдите, затем включите и запустите службу:

sudo systemctl daemon-reload
sudo systemctl enable wireguard-ui
sudo systemctl start wireguard-ui

Проверьте, что она запущена:

sudo systemctl status wireguard-ui

Шаг 5: Доступ к интерфейсу Wireguard-UI

Откройте веб-браузер и перейдите по следующему URL-адресу, не забудьте заменить YOUR_SERVER_IP на реальный публичный IP-адрес вашего сервера.

http://YOUR_SERVER_IP:5000

Вы увидите страницу входа в систему, где вы можете использовать следующие учетные данные по умолчанию:

Username: admin
Password: admin

Важно: Измените их сразу после входа в систему. Нажмите на свое имя пользователя в правом верхнем углу, затем Настройки и обновите пароль.

Шаг 6: Настройка сервера WireGuard

После входа в систему вы попадете на панель WireGuard-UI. Чтобы начать настройку сервера, нажмите на WireGuard Server в левой боковой панели и установите для Interface Name значение 10.0.0.1/24 (интерфейс WireGuard по умолчанию), а для Listen Port – 51820.

В поле Post Up Script введите:

iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

а в поле Post Down Script введите:

iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Обязательно замените eth0 на реальное имя сетевого интерфейса, если оно отличается, и установите Address to 10.0.0.1/24, который будет внутренним IP-адресом сервера.

Когда вы нажмете Apply Config, WireGuard создаст интерфейс wg0, прослушает соединения на порту 51820, назначит вашему серверу IP и настроит правила брандмауэра для правильной пересылки трафика.

Пользовательский интерфейс также автоматически сгенерирует приватный и открытый ключи вашего сервера. После применения настроек интерфейс должен отображаться как Active, что означает, что ваш сервер WireGuard запущен и работает.

Шаг 7: Добавление первого клиента WireGuard

Теперь давайте добавим устройство к вашей приватной сети, которым может быть ваш ноутбук, телефон или любое другое клиентское устройство. На левой боковой панели нажмите Клиенты, затем нажмите Добавить нового клиента.

Дайте клиенту описательное имя, например Мой ноутбук или iPhone, и, при желании, введите e-mail, чтобы впоследствии идентифицировать устройство. Нажмите Авто, чтобы автоматически назначить следующий доступный IP-адрес (скорее всего, 10.0.0.2).

Для параметра Allowed IPs введите 0.0.0.0/0, ::/0, что гарантирует, что весь трафик клиента будет проходить через приватный сервер; если вам нужен доступ только к внутренней сети сервера, вы можете вместо этого указать подсеть (например, 10.0.0.0/24).

Когда все настроено, нажмите Submit, и веб-интерфейс автоматически сгенерирует полную конфигурацию WireGuard для этого клиента, включая его собственную пару криптографических ключей.

Шаг 8: Подключение клиентского устройства

Теперь вам нужно перенести конфигурацию на устройство, и WireGuard-UI упрощает эту задачу благодаря QR-кодам для мобильных устройств и загружаемым файлам конфигурации для компьютеров.

Для мобильных устройств (телефон/планшет):

  • Установите приложение WireGuard из магазина приложений (оно доступно как для iOS, так и для Android).
  • В веб-интерфейсе WireGuard-UI найдите только что созданный клиент и нажмите на значок QR-кода.
  • Откройте приложение WireGuard на телефоне, нажмите кнопку + и выберите Создать из QR-кода.
  • Отсканируйте QR-код, отображаемый в браузере.
  • Дайте имя своему соединению и нажмите Создать туннель.

Вот и все! Переключитесь на подключение, и теперь ваше мобильное устройство направляет весь свой трафик через ваш WireGuard-сервер.

Для настольного компьютера/ноутбука:

  • Установите WireGuard с сайта wireguard.com.
  • В интерфейсе WireGuard-UI нажмите на значок загрузки рядом с вашим клиентом, чтобы загрузить файл .conf.
  • Откройте приложение WireGuard на своем компьютере, нажмите Импортировать туннель(ы) из файла и выберите загруженный файл конфигурации.
  • Нажмите Активировать для подключения.

Шаг 9: Тестирование

Давайте убедимся, что все работает правильно. Во-первых, пока ваше соединение отключено, посетите сайт myip.com и обратите внимание на отображаемый IP-адрес.

Затем подключитесь к WireGuard и обновите страницу, ваш IP-адрес должен теперь отображать публичный IP вашего сервера вместо вашего первоначального, подтверждая, что трафик направляется через сервер.

Чтобы дополнительно убедиться в правильности работы DNS, вы можете выполнить следующую команду на подключенном устройстве:

ping google.com

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

Чтобы увидеть активные соединения на вашем сервере, войдите по SSH и выполните команду:

sudo wg show

Вы увидите вывод типа:

interface: wg0
  public key: [your server's public key]
  private key: (hidden)
  listening port: 51820
peer: [client's public key]
  endpoint: [client's IP]:random_port
  allowed ips: 10.0.0.2/32
  latest handshake: 45 seconds ago
  transfer: 2.50 MiB received, 15.23 MiB sent

Это показывает, что ваш клиент подключен, когда он последний раз общался с сервером и сколько данных было передано.

Шаг 10: Используйте HTTPS для WireGuard-UI

Сейчас, когда вы заходите в веб-интерфейс WireGuard по адресу http://YOUR_SERVER_IP:5000, ваши учетные данные и все конфигурационные данные передаются через интернет в виде обычного текста, и любой, кто перехватывает трафик между вашим браузером и сервером, может увидеть ваш пароль администратора и, возможно, перехватить вашу сессию.

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

В качестве обратного прокси мы используем Nginx и Lets Encrypt для получения бесплатного SSL сертификата, чтобы вы могли получить доступ к интерфейсу WireGuard по адресу https://security.yourdomain.com вместо IP-адреса с HTTP.

Установка веб-сервера Nginx

Сначала вам нужно создать DNS-запись для вашего домена (https://security.yourdomain.com), указывающую на IP-адрес вашего сервера, а затем установить веб-сервер Nginx.

sudo apt update
sudo apt install nginx -y

После установки вы можете зайти на сайт http://security.yourdomain.com в браузере и увидите стандартную страницу приветствия Nginx, что означает, что Nginx работает и доступен из Интернета.

Установите Certbot для Lets Encrypt

Далее установите Lets Encrypt, который является бесплатным центром сертификации, предоставляющим SSL-сертификаты, а certbot – это инструмент, автоматизирующий процесс получения и обновления этих сертификатов.

sudo apt install certbot python3-certbot-nginx -y

В пакет python3-certbot-nginx входит плагин, который автоматически настраивает Nginx, что значительно упрощает процесс.

Настройка Nginx в качестве обратного прокси

Теперь давайте создадим конфигурацию Nginx, которая будет перенаправлять запросы с https://security.yourdomain.com на ваше приложение WireGuard-UI, работающее на localhost:5000.

Создайте новый файл конфигурации.

sudo nano /etc/nginx/sites-available/wireguard-ui

Вставьте эту конфигурацию (замените security.yourdomain.com на ваш реальный домен):

server {
    listen 80;
    listen [::]:80;
    server_name security.yourdomain.com;
    # This will be used by Certbot for the SSL certificate challenge
    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }
    # Redirect all other HTTP traffic to HTTPS
    location / {
        return 301 https://$host$request_uri;
    }
}
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
    server_name security.yourdomain.com;
    # SSL certificate paths (Certbot will fill these in)
    ssl_certificate /etc/letsencrypt/live/security.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/security.yourdomain.com/privkey.pem;
    # Modern SSL configuration
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers on;
    # Security headers
    add_header Strict-Transport-Security «max-age=31536000; includeSubDomains» always;
    add_header X-Frame-Options «SAMEORIGIN» always;
    add_header X-Content-Type-Options «nosniff» always;
    # Proxy settings
    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_http_version 1.1;

        # WebSocket support (if WireGuard-UI uses it)
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection «upgrade»;

        # Forward real client information
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;

        # Timeouts
        proxy_connect_timeout 60s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}

Теперь включите эту конфигурацию, создав символическую ссылку:

sudo ln -s /etc/nginx/sites-available/wireguard-ui /etc/nginx/sites-enabled/

Проверьте конфигурацию Nginx на наличие синтаксических ошибок:

sudo nginx -t

Вы должны увидеть:

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Если вы видите какие-либо ошибки, вернитесь и проверьте конфигурационный файл на наличие опечаток.

Получение SSL-сертификата

Когда все настроено правильно, пришло время выполнить команду certbot, которая автоматически получит SSL-сертификат от Lets Encrypt и настроит Nginx на его использование.

sudo certbot --nginx -d security.yourdomain.com

Весь процесс займет около 30 секунд, и по его завершении вы увидите сообщение об успехе:

Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/security.yourdomain.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/security.yourdomain.com/privkey.pem

Теперь перезагрузите Nginx, чтобы все применить:

sudo systemctl reload nginx

Автоматическое продление сертификата

Сертификаты Lets Encrypt действительны только в течение 90 дней, что сделано специально, чтобы стимулировать регулярное продление и ограничить потенциальный ущерб в случае компрометации закрытого ключа.

К счастью, Certbot автоматически устанавливает таймер обновления при установке, и вы можете убедиться, что служба обновления активна, выполнив команду:

sudo systemctl status certbot.timer

и вы увидите, что она активна (запущена). Этот таймер проверяется дважды в день и автоматически обновляет любой сертификат, срок действия которого истекает через 30 дней.

Чтобы убедиться, что все работает, не выполняя фактического обновления, запустите:

sudo certbot renew -dry-run

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

Обновление брандмауэра

Поскольку теперь мы получаем доступ к WireGuard-UI через Nginx через стандартный порт HTTPS (443), нам нужно разрешить это в нашем брандмауэре и, как вариант, закрыть прямой доступ к порту 5000.

sudo ufw allow 443/tcp

Если вы хотите запретить прямой доступ к WireGuard-UI через порт 5000 (заставляя всех использовать HTTPS-интерфейс), вы можете удалить это правило:

sudo ufw delete allow 5000/tcp

Перезагрузите брандмауэр:

sudo ufw reload

Шаг 11: Настройте WireGuard-UI на прослушивание только Localhost

Поскольку Nginx теперь обрабатывает все внешние соединения, мы должны настроить WireGuard-UI на прием соединений только с локальной машины, что не позволит никому обращаться к нему напрямую через порт 5000, даже если они обнаружат, что порт открыт.

Остановите службу WireGuard-UI:

sudo systemctl stop wireguard-ui

Отредактируйте файл службы:

sudo nano /etc/systemd/system/wireguard-ui.service

Измените строку ExecStart, чтобы привязка осуществлялась только к localhost:

[Unit]
Description=WireGuard UI
After=network.target
[Service]
Type=simple
WorkingDirectory=/opt/wireguard-ui
Environment="BIND_ADDRESS=127.0.0.1:5000"
ExecStart=/opt/wireguard-ui/wireguard-ui
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target

Сохраните и выйдите, затем перезагрузите systemd и перезапустите службу:

sudo systemctl daemon-reload
sudo systemctl start wireguard-ui
sudo systemctl status wireguard-ui

Наконец, откройте браузер и перейдите по адресу – https://security.yourdomain.com

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

Заключение

К настоящему моменту вы успешно развернули полностью рабочий WireGuard-сервер с безопасным веб-интерфейсом управления. Вместо того чтобы вручную работать с ключами, конфигурационными файлами и правилами маршрутизации, WireGuard-UI предоставляет вам простую панель управления для добавления новых устройств, генерации QR-кодов и мониторинга активных соединений.

Зарубин Иван Эксперт по Linux и Windows

Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.

Похожие статьи

Комментарии (0)