Поиск по сайту:

Как установить WireGuard VPN с веб-интерфейсом на Ubuntu


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

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

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

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

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

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

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

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

  • Сервер Linux с публичным IP-адресом (VPS от таких провайдеров, как DigitalOcean, Linode или AWS, подходит отлично).
  • Доступ root или права sudo на этом сервере.
  • Базовое понимание SSH (вы должны уметь подключаться к своему серверу).

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

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

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

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

В нашем случае у нас будет:

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

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

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

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

sudo apt update && sudo apt upgrade -y

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

sudo apt install wireguard -y

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

Установите WireGuard в Ubuntu

Шаг 2: Включение пересылки IP на Ubuntu

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

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

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

sudo nano /etc/sysctl.conf

Ищите эту строку (она может быть закомментирована с помощью # в начале):

#net.ipv4.ip_forward=1

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

net.ipv4.ip_forward=1

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

sudo sysctl -p

Включить переадресацию IP на Ubuntu

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

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

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

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 (Трансляция сетевых адресов), которое сообщает вашему серверу маскировать VPN-трафик так, как если бы он исходил от самого сервера, при его пересылке в интернет.

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: Для пакетов, приходящих из нашей VPN-сети (10.0.0.0/24 — это подсеть, которую мы назначим клиентам VPN).
  • -o eth0: Выход через интерфейс eth0.
  • -j MASQUERADE: Перезаписывает исходный IP-адрес на публичный IP сервера.

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

sudo ufw enable
sudo ufw reload

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

Теперь начинается самая интересная часть — настройка веб-интерфейса с использованием 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

Проверить статус Wireguard-UI

Шаг 5: Доступ к Wireguard-UI

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

http://YOUR_SERVER_IP:5000

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

Username: admin
Password: admin

Панель управления Wireguard-UI

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

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

После входа в систему вы попадёте на панель управления WireGuard-UI. Чтобы начать настройку вашего сервера, нажмите на «WireGuard Server» в левой боковой панели и установите имя интерфейса 10.0.0.1/24 (интерфейс WireGuard по умолчанию), а порт прослушивания — 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 на 10.0.0.1/24, который будет внутренним VPN-адресом сервера.

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

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

Настроить сервер WireGuard

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

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

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

Для разрешённых IP-адресов введите 0.0.0.0/0, ::/0, что гарантирует маршрутизацию всего трафика клиента через VPN; если вы хотите получить доступ только к внутренней сети сервера, можно указать соответствующую подсеть (например, 10.0.0.0/24).

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

Добавить клиент WireGuard

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

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

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

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

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

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

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

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

Давайте убедимся, что всё работает правильно. Сначала, пока ваш VPN отключен, зайдите на whatismyipaddress.com и обратите внимание на отображаемый IP-адрес.

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

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

ping google.com

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

Чтобы посмотреть активные подключения на вашем сервере, подключитесь по 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 (веб-сервер высокой производительности) в качестве обратного прокси и Let’s Encrypt, чтобы получить бесплатный SSL-сертификат, чтобы вы могли получить доступ к интерфейсу WireGuard по адресу https://vpn.yourdomain.com вместо использования IP-адреса с HTTP.

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

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

sudo apt update
sudo apt install nginx -y

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

Проверить страницу Nginx

Установите Certbot для Let’s Encrypt

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

sudo apt install certbot python3-certbot-nginx -y

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

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

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

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

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

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

server {
    listen 80;
    listen [::]:80;
    server_name vpn.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 vpn.yourdomain.com;

    # SSL certificate paths (Certbot will fill these in)
    ssl_certificate /etc/letsencrypt/live/vpn.yourdomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/vpn.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-сертификат от Let’s Encrypt и настроит его использование в Nginx.

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

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

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

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

sudo systemctl reload nginx

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

Let’s 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://vpn.yourdomain.com

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

Резюме

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