Wireguard с веб-интерфейсом

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

Оглавление

Покупаем сервер
Устанавливаем Wireguard
Ошибки в ходе установки
Устанавливаем веб-интерфейс WGDashboard
Общие впечатления

Покупаем сервер #

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

Поэтому взял на тест LLHOST, про который писали на Хабре в комментариях. По деньгам получается ≈260₽ за минимальную версию (1 vCPU, 1 RAM, 25GB SSD) в Нидерландах. За неделю ничего не упало и не отвалилось, можно оплатить русской картой и ip во всех сервисах, что я использовал, был Нидерланды. На 23 августа это стабильный еще рабочий сервер на любых операторах связи.

Еще ранее у меня полгода был Fornex — отличный и стабильный, но дорогой (сейчас тарифы от 500₽) и в комментариях все к той же статье понравился вариант Just Hosting за 70₽, но ширина канала всего 10Mbit.

Если вы решили использовать LLHOST, то я рекомендую накатить чистый образ системы. Изначально по тарифу для VPN Wireguard работает из коробки. При этом настройки по умолчанию несовместимы, например, с использованием в роутерах Кинетик, когда нужные ресурсы будут доступны при подключении к Wi-Fi. Сам процесс настройки:

Устанавливаем Wireguard #


# Заходим на сервер под доступами:
ssh root@<ip адрес сервера>

# Обновляем систему и устанавливаем Wireguard:
apt update && apt upgrade -y
apt install -y wireguard

# Генерируем ключи сервера:
wg genkey | tee /etc/wireguard/privatekey | wg pubkey | tee /etc/wireguard/publickey

# Ставим права для приватного ключа:
chmod 600 /etc/wireguard/privatekey

# Создаем конфигурацию сервера:
vim /etc/wireguard/wg0.conf


# Вставляем в файл. По умолчанию интерфейс eth0:
[Interface]
PrivateKey = <privatekey>
Address = 10.0.0.1/24
ListenPort = 51830
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE


# Настраиваем IP форвардинг:
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p

# Включаем systemd демон с Wireguard:
systemctl enable wg-quick@wg0.service
systemctl start wg-quick@wg0.service
systemctl status wg-quick@wg0.service

Wireguard Active Exited in Ubuntu 22.04
Если все установилось корректно, то будет зеленый индикатор со статусом Active.

Ошибки в ходе установки #

Ошибка Решение Команда
/usr/bin/ wg -quick: line 295: iptables: command not found Установить Iptables sudo apt-get install iptables
Трафик отсутствует Установить UFW; Добавить порт в разрешенные sudo apt install ufw; sudo ufw allow 51830/udp
Не установлен Git Установить Git sudo apt install git
Интерфейс отличается eth0 Проверить название интерфейса ip route list default
Открытый порт Wireguard
Команда показывает список правил ufw.

Устанавливаем веб-интерфейс WGDashboard #

# Скачиваем и устанавливаем из репозитория
git clone -b v3.0.6 https://github.com/donaldzou/WGDashboard.git wgdashboard

# Открываем папку
cd wgdashboard/src

# Устанавливаем WGDashboard
sudo chmod u+x wgd.sh
sudo ./wgd.sh install

# Меняем права для папки с конфигом
sudo chmod -R 755 /etc/wireguard

# Запускаем WGDashboard
./wgd.sh start

# В случае ошибки последовательно три команды
apt -y install python3-pip
pip install -r requirements.txt
./wgd.sh start

# Открываем веб-интерфейс на порту 10086. Используйте юзернейм admin и пароль admin
http://<ip адрес сервера>:10086
Графический интерфейс WGDashboard
В случае успеха откроется веб-интерфейс WGDashboard. В примере у автора два действующих клиента

Общие впечатления #

— Генерация QR-кода для клиентов на iOS и Android;
— Скачивание конфига в виде файла для роутеров Keenetic и поддержкой OpenWRT;
— Мониторинг статистики клиентов;
— Низкие требования к ресурсам сервера;
— Из коробки не работает автостарт, нужно настраивать отдельно.

Полезные ссылки

Документация WGDashboard.
Видео с настройкой WGDashboard.
Видео по установке Wireguard.
Инструкция «выборочный обход на iOS»

Send
Share
Pin
18 comments
Айфоновод Маковедов 2023

Привет, все это сложно, рекомендую – https://github.com/WeeJeWel/wg-easy

Миша Тугушев 2023

Спасибо за дополнение. WF-Easy классный, но мне не зашел. После установки у меня так толком не получилось поменять стандартные настройки, например порт и диапазон ip-адресов 🤷‍♂️

Alex Shvartser 2023

Привет!
А если уже стоит WG, можно к нему прикрутит вебморду ?

Миша Тугушев 2023

Привет, да. Начни с абзаца Устанавливаем WGDashboard. Он предполагает, что если WG работает, то никаких проблем не будет. Но готовый WG от хостера у меня не заработал с WGDashboard.

Alex Shvartser 2023

Ну я сам настраивал по какой-то из шпаргалок на хабре)
Нужно сначала бекап VPS сделать)
А еще вопрос можно?)
А нету случаем такого дополнения в браузеру(Мозилла или Хром),
Что бы только на браузере на компе юзать VPN?
А то на работе когда включаешь, отваливается вся местная сеть от компа)

Миша Тугушев 2023

Не знаю 🤷‍♂️

Владислав Палько 2023

Как войти какой логин и пароль?

Миша Тугушев 2023

логин:admin, пароль: admin

Алексей Белый 2023

Подскажите, это под какой линукс мануал?

Миша Тугушев 2023

Тестировалось на Ubuntu 20.04 и 22.04

Алексей Белый 2023

Sep 03 19:18:39 vsepodryad systemd[1]: Starting WireGuard via wg-quick(8) for wg0...
Sep 03 19:18:39 vsepodryad wg-quick[53892]: [#] ip link add wg0 type wireguard
Sep 03 19:18:39 vsepodryad wg-quick[53892]: [#] wg setconf wg0 /dev/fd/63
Sep 03 19:18:39 vsepodryad wg-quick[53913]: Key is not the correct length or format: `<privatekey>’
Sep 03 19:18:39 vsepodryad wg-quick[53913]: Configuration parsing error
Sep 03 19:18:40 vsepodryad wg-quick[53892]: [#] ip link delete dev wg0
Sep 03 19:18:40 vsepodryad systemd[1]: wg-quick@wg0.service: Main process exited, code=exited, status=1/FAILURE
Sep 03 19:18:40 vsepodryad systemd[1]: wg-quick@wg0.service: Failed with result ‘exit-code’.
Sep 03 19:18:40 vsepodryad systemd[1]: Failed to start WireGuard via wg-quick(8) for wg0.

Андрей Анатольевич 2023

Спасибо большое, Бро!

Поднял WG скриптом из GitHub, а морду поднял заклинаниями из твоей статьи! Завелось с полтычка.

Миша Тугушев 2023

Пожалуйста!

Никита Бардин 2023

admin/admin и получаю ошибку 500

Никита Бардин 2023

ERROR in app: Exception on / [GET]
Traceback (most recent call last):
File “/usr/local/lib/python3.8/dist-packages/flask/app.py”, line 1455, in wsgi_app
response = self.full_dispatch_request()
File “/usr/local/lib/python3.8/dist-packages/flask/app.py”, line 869, in full_dispatch_request
rv = self.handle_user_exception(e)
File “/usr/local/lib/python3.8/dist-packages/flask/app.py”, line 867, in full_dispatch_request
rv = self.dispatch_request()
File “/usr/local/lib/python3.8/dist-packages/flask/app.py”, line 852, in dispatch_request
return self.ensure_sync(self.view_functions[rule.endpoint])(**view_args)
File “/root/wgdashboard/src/dashboard.py”, line 734, in index
return render_template(‘index.html’, conf=get_conf_list(), msg=msg)
File “/root/wgdashboard/src/dashboard.py”, line 502, in get_conf_list
temp = {“conf”: i, “status”: get_conf_status(i), “public_key”: get_conf_pub_key(i)}
File “/root/wgdashboard/src/dashboard.py”, line 417, in get_conf_pub_key
conf.read(WG_CONF_PATH + “/” + config_name + “.conf”)
File “/usr/lib/python3.8/configparser.py”, line 697, in read
self._read(fp, filename)
File “/usr/lib/python3.8/configparser.py”, line 1017, in _read
for lineno, line in enumerate(fp, start=1):
File “/usr/lib/python3.8/codecs.py”, line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xd0 in position 3481: invalid continuation byte

Timur Bautdinov 9 mo

Спасибо за мануал.

Как сделать так, чтобы гуй запускался автоматом после перезагрузки сервера?

Миша Тугушев 9 mo

Пожалуйста. Настроить по мануалу от разработчиков https://github.com/donaldzou/WGDashboard?tab=readme-ov-file#autostart-wgdashboard-on-boot--v22

EBA 4 mo

Подскажите плиз, кто разбирается.
Суть такая установил WireGuard Easy, создал первые две учетки, установил их на 2 разных устройства и всё работает без проблем. Спустя примерно полгода. потребовалось подкинуть ещё учеток для других устройств, с легкостью создал их в панели WireGuard Easy, но при попытке подключить новые устройства, получаю ошибку
в клиентском приложении на винде: Unable to resolve one or more DNS hostname endpoints: No such host is known.
в клиентском приложении на маке: Ошибка при разрешении DNS. Один или несколько IP-адресов серверов не могу быть разрешены
При этом на первых/старых устройствах все продолжает работать, но если попытаться даже те, рабочие учетки использовать на новых устройствах, все равно получаю данные ошибки.

Миша Тугушев 4 mo

Без файла конфигурации к сожалению ничего не сказать. Можете выложить без ключей и тогда будет понятно. Посоветовал бы посмотреть логи подключения на этих машинах. Посмотрите на это решение https://superuser.com/questions/1788561/no-dns-on-server-after-bringing-up-wireguard-server.

Мне в целом не нравится WireGuard Easy из-за запуска в докере более, чем трех хостов. Всегда начинаются какие-то проблемы.

Denis D. 3 mo

День добрый. Сделал все как описано в статье на локальной машине – все заработало. Потом попытался повторить на VDS сервере с Ubuntu 20.04 – не получилось – не устанавливался Wireguard. Установил в итоге с помощью скрипта официального, правда на некоторых шагах приходилось действовать из-под rootа. Теперь WG запускает скрипт по добавлению нового пира только под rootом. WGDashboard встал нормально по мануалу из статьи. Можно зайти и увидеть все созданные скриптом ./wireguard-install.sh пиры. Но создать новый не получается. При попытке создать новый пир CPU и RAM забивается на 100%, в логах сообщение: Out of memory: Killed process 104850 (gunicorn) total-vm:661232kB, anon-rss:459268kB, file-rss:0kB, shmem-rss:0kB, UID:0 pgtables:1196kB oom_score_adj:0. В общем, подскажите пожалуйста, куда рыть чтоб все заработало. Права на wireguard И wgdashboard дал основному пользователю, но не помогло....

Test Test 3 mo

Добрый день!
Большое спастио за мануал! Получилось всё практически с первого раза (пришлось проделать дополнительный шаг с установкой пайтон и т.п.)
Подскажите.
Видел выше, что можно добавить дэшборд для уже установленного WG.

  1. Морда – запустилась. Но интерфейсы (peers) от предыдещей версии WG – отсутствуют. Как сделать их доступными для управления в морде?
  2. При подключении к морде, используется незащищенное соедниение. Соответственно, креды передаются в незащищенном виде и чувствительны к перехвату. Как установить защищенное, https-соединение?
Test Test 3 mo

И, подскажите, как можно удалить данный пакет?

Ivan Nemtsev 2 mo

Народ, всем привет!
А как ограничить скорость конкретному клиенту?

Ivan Nemtsev 2 mo

А ларчик просто открывался (с)

tc qdisc add dev ens3 root handle 1:0 hfsc default 1

tc class add dev ens3 parent 1:0 classid 1:1 hfsc sc rate 100mbit ul rate 100mbit

tc class add dev ens3 parent 1:0 classid 1:2 hfsc sc rate 1000kbit ul rate 1000kbit

tc filter add dev ens3 protocol all parent 1: u32 match ip dst 10.66.66.9 flowid 1:2

Denis D 22 d

Всем привет. Помогите не работает, выдает ошибку:

| Starting WGDashboard with Gunicorn in the background. |

./wgd.sh: line 104: gunicorn: command not found
| Log files is under log/

В браузере не открывается.

Denis D 22 d

Разобрался сам. Решение тут:
https://github.com/donaldzou/WGDashboard/issues/152

Миша Тугушев 20 d

👍