Сегодня я хочу познакомиться с одной интерпретацией поднятия связки Webинтерфейса и WireGuard сервера в одном лице, посмотреть, как все это делается от и до, какие моменты и, как и что дабы применить в одном из своих проектов, а также адаптировать после с учетом ниже указанного к своему ранее развернутому ("Поднимем WireGuard VPN туннель на Ubuntu 20.04"), но без Web-интерфейса.

Шаг №1: Устанавливаем Docker в Ubuntu 22.04 Server опираясь на заметку: "Как установить Docker на Ubuntu 22.04"

Шаг №2: Устанавливаем Docker Compose в Ubuntu 22.04 Server опираясь на заметку: "Как развернуть Docker Compose в Ubuntu 22.04 Server"

Шаг №3: Далее действую опиряюсь на шаги инсталляции https://github.com/wg-easy/wg-easy

ekzorchik@srv-home:~$ sudo docker run -d \
--name=wg-easy \
-e WG_HOST=172.33.33.102 \
-e PASSWORD=712mbddr@ \
-v ~/.wg-easy:/etc/wireguard \
-p 51820:51820/udp \
-p 51821:51821/tcp \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
--sysctl="net.ipv4.ip_forward=1" \
--restart unless-stopped \
ghcr.io/wg-easy/wg-easy
Unable to find image 'ghcr.io/wg-easy/wg-easy:latest' locally
latest: Pulling from wg-easy/wg-easy
4abcf2066143: Pull complete
e7ced292c644: Pull complete
b32c0114bba5: Pull complete
f3748d9674b0: Pull complete
a2a524de099d: Pull complete
114bdfdcdd40: Pull complete
575154ec3698: Pull complete
ab0bdf69dac2: Pull complete
268d6f1b88e2: Pull complete
4f4fb700ef54: Pull complete
Digest: sha256:daa94b77901bdef3cb10151416c095e64cf66a6539fa8f748c09812b60b97f49
Status: Downloaded newer image for ghcr.io/wg-easy/wg-easy:latest
11a3f085a580a6a30f9f2013251dd1f6feb83351751c542cf8291631f08d73c0
ekzorchik@srv-home:~$

Шаг №4: Можно подключиться к контейнеру через консоль дабы после развертывания посмотреть, что у него внутри, ну это так для ознакомления:

ekzorchik@srv-home:~$ docker run -it ghcr.io/wg-easy/wg-easy /bin/bash
5fe7dab06db2:/app#
856a8302e0f9:/app# tree
.
├── config.js
├── lib
│   ├── Server.js
│   ├── ServerError.js
│   ├── Util.js
│   └── WireGuard.js
├── package-lock.json
├── package.json
├── server.js
├── services
│   ├── Server.js
│   └── WireGuard.js
├── tailwind.config.js
└── www
├── css
│   └── app.css
├── img
│   ├── apple-touch-icon.png
│   ├── favicon.png
│   └── logo.png
├── index.html
├── js
│   ├── api.js
│   ├── app.js
│   ├── i18n.js
│   └── vendor
│       ├── apexcharts.min.js
│       ├── sha256.min.js
│       ├── timeago.full.min.js
│       ├── vue-apexcharts.min.js
│       ├── vue-i18n.min.js
│       └── vue.min.js
├── manifest.json
└── src
└── css
└── app.css
9 directories, 27 files
856a8302e0f9:/app#
5fe7dab06db2:/app# exit
exit
ekzorchik@srv-home:~$

Шаг №5: Серверная часть конфигурации WireGuard сервера располагается:

ekzorchik@srv-home:~$ sudo apt-get install -y tree
ekzorchik@srv-home:~$ tree ~/.wg-easy/
/home/ekzorchik/.wg-easy/
├── wg0.conf
└── wg0.json
0 directories, 2 files
ekzorchik@srv-home:~$
ekzorchik@srv-home:~$ sudo bash -c "cat /home/ekzorchik/.wg-easy/wg0.conf"
# Note: Do not edit this file directly.
# Your changes will be overwritten!
# Server
[Interface]
PrivateKey = gPr+C37dq3+jdCHHT5yF9gv5JOZssGRQapyqsxaD7HM=
Address = 10.8.0.1/24
ListenPort = 51820
PreUp =
PostUp =  iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE; iptables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT;
PreDown =
PostDown =  iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE; iptables -D INPUT -p udp -m udp --dport 51820 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT;

Шаг №6: Переходим в браузере по адресу вашего сервера указав порт 51821. Пример — http://SERVER_IP:51821 и авторизуемся с паролем, который указывали "-e PASSWORD", у меня это 712mbddr@

Обращаемся к Web-интерфейсу WireGuard.

После авторизации вижу, что пока нет настроенных клиентов

После авторизации вижу, что пока нет настроенных клиентов

Чтобы создать конфигурацию для нового клиента

нажимаю "+ New Client"

  • New Client: client1

и нажимаю Create, по итогу получаем

Созданное клиентское подключение, конфиг клиента.

Скачиваем конфигурационный файл для клиента

Скачиваем конфигурационный файл для клиента

Открываем текстовый редактором client1.conf и видим содержимое

[Interface]
PrivateKey = 6AzaSrST2ICmlNSTUq81f9SR8VdQmLabRh4qOl8CbHQ=
Address = 10.8.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = htaY5e3OJm4JPGpnCBVWqcKhJvzjzVIpHwNTZUksQDc=
PresharedKey = Adbwnuu7zHz9hl+YmmRXXbe0EF0DFjgO4WsJ+VRyL+w=
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 0
Endpoint = 172.33.33.102:51820

Шаг №7: Посмотреть логи контейнера wg-easy:

ekzorchik@srv-home:~$ docker container ls --all | grep wg-easy
5fe7dab06db2   ghcr.io/wg-easy/wg-easy   "docker-entrypoint.s…"   12 minutes ago   Exited (0) 10 minutes ago             loving_lalande
ekzorchik@srv-home:~$
ekzorchik@srv-home:~$ docker container logs wg-easy

Шаг №8: Если с учетом добавленного клиента WireGuard посмотреть конфигурационный файл wg0.conf, то его (клиента) данные добавляется после создания конфигурационного файла для клиента:

ekzorchik@srv-home:~$ sudo bash -c "cat /home/ekzorchik/.wg-easy/wg0.conf"
# Note: Do not edit this file directly.
# Your changes will be overwritten!
# Server
[Interface]
PrivateKey = gPr+C37dq3+jdCHHT5yF9gv5JOZssGRQapyqsxaD7HM=
Address = 10.8.0.1/24
ListenPort = 51820
PreUp =
PostUp =  iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE; iptables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT;
PreDown =
PostDown =  iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE; iptables -D INPUT -p udp -m udp --dport 51820 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT;
# Client: client1 (b28ed0bf-e7f0-4bc6-a1d7-0550daa8d5c4)
[Peer]
PublicKey = gmSbBSAOt0yFLSXK4S4IQ0us+BKbl4zrVkds4Uda/xk=
PresharedKey = Adbwnuu7zHz9hl+YmmRXXbe0EF0DFjgO4WsJ+VRyL+w=
AllowedIPs = 10.8.0.2/32
ekzorchik@srv-home:~$

Шаг №9: В системе Ubuntu 22.04 Server WireGuard сервис не как сервис развернут, а развернут как контейнер в докере:

ekzorchik@srv-home:~$ sudo docker images
REPOSITORY                TAG       IMAGE ID       CREATED       SIZE
ghcr.io/wg-easy/wg-easy   latest    ffa9223d7784   3 weeks ago   147MB
ekzorchik@srv-home:~$

Останавливаем Docker сервис WireGuard завершает работу:

ekzorchik@srv-home:~$ sudo systemctl stop docker
Warning: Stopping docker.service, but it can still be activated by:
docker.socket
ekzorchik@srv-home:~$

Запускаем Docker сервис WireGuard начинает работать:

ekzorchik@srv-home:~$ sudo systemctl start docker
ekzorchik@srv-home:~$ sudo netstat -tulpn | grep docker
tcp        0      0 0.0.0.0:51821           0.0.0.0:*               LISTEN      6428/docker-proxy
tcp6       0      0 :::51821                :::*                    LISTEN      6434/docker-proxy
udp        0      0 0.0.0.0:51820           0.0.0.0:*                           6448/docker-proxy
udp6       0      0 :::51820                :::*                                6454/docker-proxy
ekzorchik@srv-home:~$

Шаг №10: Хочу еще обратить внимание что конфигурационный файл это ~/.wg-easy, так что в него вносим изменения, а после перезапускаем docker

Шаг №11: C учетом справки можно заранее предопределить параметры, с которыми поднимать WireGuardсервер в Docker(е):

Параметры передаваемые при развертывании wg-easy.

Шаг №12: Удаляем текущую установку wg-easy с системы Ubuntu 22.04 Server:

sudo nano uninstallwg.sh
#!/bin/bash
docker stop wg-easy
rm -rf /home/ekzorchik/.wg-easy/
#remove containter id wg-easy
docker container rm -f $(docker container ls -al | grep wg-easy | awk '{print $1}')
#remove images id wg-easy
docker rmi $(docker images | grep wg-easy | awk '{print $3}')
ekzorchik@srv-home:~$ sudo chmod +x uninstallwg.sh
ekzorchik@srv-home:~$ sudo ./uninstallwg.sh

Шаг №13: Предварительно удаляю текущую установку wg-easy, а затем хочу посмотреть, как делается, что сеть WireGuard не 10.8.0.1/24, а 10.10.10.1/24, т.е. новое развертывание, как править уже настроенное пока не разобрал:

ekzorchik@srv-home:~$ docker run -d \
--name=wg-easy \
-e WG_HOST=172.33.33.102 \
-e WG_DEFAULT_ADDRESS=10.10.10.2 \
-e WG_DEFAULT_DNS=8.8.8.8 \
-e PASSWORD=712mbddr@ \
-v ~/.wg-easy:/etc/wireguard \
-p 51820:51820/udp \
-p 51800:51821/tcp \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
--sysctl="net.ipv4.ip_forward=1" \
--restart unless-stopped \
ghcr.io/wg-easy/wg-easy
Unable to find image 'ghcr.io/wg-easy/wg-easy:latest' locally
latest: Pulling from wg-easy/wg-easy
4abcf2066143: Pull complete
e7ced292c644: Pull complete
b32c0114bba5: Pull complete
f3748d9674b0: Pull complete
a2a524de099d: Pull complete
114bdfdcdd40: Pull complete
575154ec3698: Pull complete
ab0bdf69dac2: Pull complete
268d6f1b88e2: Pull complete
4f4fb700ef54: Pull complete
Digest: sha256:daa94b77901bdef3cb10151416c095e64cf66a6539fa8f748c09812b60b97f49
Status: Downloaded newer image for ghcr.io/wg-easy/wg-easy:latest
10ed2a1853bc61be33f37bfac35845fcbd1cc132a9f08920aeaaf21e789d0a76
ekzorchik@srv-home:~$

после чего доступ в Web-интерфейс идет как, http://IP&DNS:51800 - Pass:712mbddr@ и при создании первого клиента ему присваивает IP адрес 10.10.10.2 и т.д, а вот у сервера 10.10.10.1:

ekzorchik@srv-home:~$ sudo bash -c "cat /home/ekzorchik/.wg-easy/wg0.conf"
# Note: Do not edit this file directly.
# Your changes will be overwritten!
# Server
[Interface]
PrivateKey = OC03oZ9Y+dnRCQ8X3v0VTXieyT1QZvqdgUKdiF2ZaV0=
Address = 10.10.10.1/24
ListenPort = 51820
PreUp =
PostUp =  iptables -t nat -A POSTROUTING -s 10.10.10.2/24 -o eth0 -j MASQUERADE; iptables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT;
PreDown =
PostDown =  iptables -t nat -D POSTROUTING -s 10.10.10.2/24 -o eth0 -j MASQUERADE; iptables -D INPUT -p udp -m udp --dport 51820 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT;

# Client: 1 (e645c1ee-dca3-4d2a-b30e-6573e2f3a805)
[Peer]
PublicKey = 5K9t03+PQw2Jxef1if0htegCl84AuinEz2oGD6YcNHk=
PresharedKey = vhqrsOcUMEkyJEbhsCvRDC+aSH+YpQECad4WkrytVx4=
AllowedIPs = 10.10.10.2/32

Но как по мне, мне проще взять свою заметку: "Поднимем WireGuard VPN туннель на Ubuntu 20.04" с учетом своих нюансов, а именно:

  • Замена iptables на firewalld
  • Замена 10.8.0.0/24 на любую другую
  • и не удалять все при изменении развертывания docker файла при новых настройках либо же все свое адаптировать под вот эту заметку тогда да имеет место быть данная заметка.

Шаг №14: При использовании функционала данной заметке есть как по мне неоспоримое преимущество — это отображение в Web-интерфейсе статуса подключения клиента, т.е. кто подключен, количество переданных и отравленных пакетов.

Итого: Я разобрал для себя, как поднимается WireGuard сервер и к нему Web-интерфейс в Docker(е) дабы обезопасить основную систему и управлять лишь свойствами контейнера и передаваемыми для него параметрами с учетом документации от проекта wg-easy.

На этом заметка завершена, с уважением автор блога Олло Александр aka ekzorchik, будет что-то еще в процессе использования, то все это также отразится в последующих заметках.