# Практическое задание №4.Wireguard

Для выполнения практических занятий необходимо переключиться на проект [GROUP]:[team]-lab:sandbox.

### Пользовательская установка wireguard

Для начала надо развернуть новый инстанс (при ограничении ресурсов может потребоваться удалить все предыдущие инстансы) так, как это было сделанно в [первой практической работе](https://docs.resds.ru/books/opgs-osnovy-postroeniya-giperkonvergentnykh-sistem/page/prakticheskoe-zadanie-1-sozdanie-virtualnoy-mashiny-v-novom-proekte).

Зайти в режим привилегированного пользователя
```bash
sudo su
```
установить нужные пакеты:
```bash
apt update
apt install -y wireguard qrencode
```
#### Настройка системы
 Разрешить перенаправление сетевых пакетов на уровне ядра. Для этого откройте файл /etc/sysctl.conf и добавьте в конец такие строки:
```bash
vi /etc/sysctl.conf
```
```plain
net.ipv4.ip_forward = 1
net.ipv6.conf.default.forwarding = 1
net.ipv6.conf.all.forwarding = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.proxy_arp = 0
net.ipv4.conf.default.send_redirects = 1
net.ipv4.conf.all.send_redirects = 0
```
Затем необходимо выполнить команду sysctl -p чтобы система перечитала конфигурацию:
```bash
sysctl -p
```
#### Генерация ключей сервера
Для сервера надо создать приватный и публичный ключ. Эти ключи, потом надо будет записать в конфигурационный файл сервера и клиента, сами файлы ключей вам не нужны, поэтому можете создавать их где хотите, например, в домашней папке. Так же полученный ключ можно записать в переменную окружения:
```bash
wg genkey | sudo tee server_private.key | wg pubkey | sudo tee server_public.key
```
Ключи созданы, утилита tee запишет их в файл, а также выведет на экран, что очень удобно для сохранения значения в переменную
#### Генерация ключей клиента
Аналогичным образом создаём ключи для клиента. Команда та же:
```bash
wg genkey | sudo tee client_private.key | wg pubkey | sudo tee client_public.key
```
#### Конфигурационный файл сервера
Конфигурационный файл сервера необходимо разместить по пути /etc/wireguard/wg0.conf и заполнить следующим образом(обратить внимание, что значение ключей в файле необходимо заменить):
```bash
vi /etc/wireguard/wg0.conf
```

```plain
[Interface]
Address = 10.10.10.1/24 
ListenPort = 51820
PrivateKey = “содержимое файла server_private.key”
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
MTU = 1420
[Peer]
PublicKey = “содержимое файла client_public.key”
AllowedIPs = 10.10.10.2/32
```
Файл разделен на две секции:
*	Interface - настройка сервера;
* 	peer - настройка клиентов, которые могут подключаться к серверу, секций Peer может быть несколько.

В данном случае будет настроен сервер WireGuard для работы с IPv4, со следующими основными параметрами:

*	Address - адрес сервера в сети VPN;
*	ListenPort - порт, на котором будет ожидать подключения WireGuard;
*	PrivateKey - приватный ключ сервера, сгенерированный ранее;
*	PostUp - команда, которая выполняется после запуска сервера. В данном случае включается поддержка MASQUERADE для интерфейса enp0s8, а также разрешается прием пакетов на интерфейсе wg0. Сетевые интерфейсы вам придется заменить на свои.
*	PostDown - выполняется после завершения работы WireGuard, в данном случае удаляет все правила, добавленные в PostUp.

Секции Peer содержат настройки клиентов, которые могут подключится к серверу:
*	PublicKey - публичный ключ клиента, сгенерированный ранее;
*	AllowedIPs - IP адрес, который может взять клиент. Обратите внимание, маска для IPv4 должна быть 32.

Теперь можно переходить к созданию конфигурационного файла непосредственно для клиента.

Конфигурационный файл клиента
Конфигурационный файл клиента будет выглядеть примерно так:
```bash
vi client.conf
```
```plain
[Interface]
PrivateKey = “содержимое файла client_private.key”
Address = 10.10.10.2
DNS = 172.17.1.10
MTU = 1384
[Peer]
PublicKey = “содержимое файла server_public.key”
Endpoint = “ip адрес вашего инстанса”:51820
AllowedIPs = 0.0.0.0/0
```
Обратите внимание, что все ключи мы генерируем на сервере, а затем уже скидываем конфигурационный файл клиента на компьютер, который надо подключить к сети. Рассмотрим подробнее что за что отвечает:
*	PrivateKey - приватный ключ клиента, сгенерированный ранее;
*	Address - IP адрес интерфейса wg0 клиента;
*	DNS - серверы DNS, которые будут использоваться для разрешения доменных имён;
*	PublicKey - публичный ключ сервера, к которому надо подключится.
*	Endpoint - здесь надо указать IP адрес сервера, на котором установлен WireGuard и порт;
*	AllowedIPs - IP адреса, трафик с которых будет перенаправляться в сеть VPN, в данном примере выбраны все адреса.

#### Запуск сервера
Для запуска сервера используйте такую команду:
```bash
sudo systemctl start wg-quick@wg0
```
С помощью systemd можно настроить автозагрузку интерфейса:
```bash
sudo systemctl enable wg-quick@wg0
```
#### Подключение клиента
Вывести в консоль qr код, для подключения к vpn. Подключаться к ВПН с использованием клиента wireguard с мобильного телефона
Для этого в консоли сгенерировать qr код:
```bash
qrencode -t ansiutf8 < client.conf
```
Далее необходимо проверить, что установленный сервер работает.

<b>Инструкция по проверке подключения находится в конце данного руководства.</b>


### Установка wireguard из готового контейнера
Контейнер сам по себе является операционной системой минимального размера, с установленным внутри необходимым программным обеспечением.  Контейнеры могут быть преднастроенными, и всё, что необходимо с ними сделать, это установить, передав нужные аргументы. Для работы с контейнерами чаще всего используются docker контейнеры, настроенные на необходимый режим работы путём передачи в них переменных окружения.

Перед установкой Docker нужно выполнить все необходимые настройки системы.
#### Установка Docker
Docker является набором утилит, для работы с контейнерами. Установку лучше всего выполнять из репозиториев самого Docker.
Для начала необходимо установить набор утилит, помогающих работать со сторонними репозиториями.
```bash
sudo apt-get update
sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release
```
Далее необходимо скачать ключи доступа к репозиториям (одной командой):
```bash
curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
| sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
```
После этого необходимо добавить нужные репозитории (одной командой):
```bash
echo   "deb [arch=$(dpkg --print-architecture) \
signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
```
Добавив репозитории, можно установить все необходимые пакеты
```bash
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io nftables
```
#### Запуск контейнера
Как только все необходимые приготовления сделаны, необходимо запустить контейнер с нужными параметрами (одной командой):
```bash
sudo docker run -ti -d  --restart=always --network host \
--entrypoint "/wireguard-ui" -v /tmp/wireguard-ui:/data \
--privileged embarkstudios/wireguard-ui:latest  \
--data-dir=/data --wg-listen-port=51820 \
--wg-endpoint="«ip адрес вашего виртуального сервера»:51820" \
--wg-allowed-ips=0.0.0.0/0 --wg-dns="172.17.1.10" \
--wg-device-name="wg0" --listen-address=":80" \
--nat --nat-device="eth0" --client-ip-range="10.0.8.1/24"
```
#### Настройка VPN тоннелей
Как только контейнер запущен, необходимо подключиться к web интерфейсу VPN сервера для того, чтобы добавить клиентов для подключения. Для этого необходимо открыть в браузере адрес:
http://«ip адрес вашего виртуального сервера»
В открывшемся окне нажать + в правом нижнем углу 
[![](https://docs.resds.ru/uploads/images/gallery/2022-06/scaled-1680-/j9YKMLslDveN0D6I-image-1655218320829.png)](https://docs.resds.ru/uploads/images/gallery/2022-06/j9YKMLslDveN0D6I-image-1655218320829.png)

В появившемся окне ввести имя клиента и нажать create 
[![](https://docs.resds.ru/uploads/images/gallery/2022-06/scaled-1680-/SwoVTSIY08MC4Gin-image-1655218366871.png)](https://docs.resds.ru/uploads/images/gallery/2022-06/SwoVTSIY08MC4Gin-image-1655218366871.png)

Клиент для подключения создан, так же создан конфигурационный файл для клиента и QR код, по которому можно скачать содержимое этого конфигурационного файла
[![](https://docs.resds.ru/uploads/images/gallery/2022-06/scaled-1680-/4yKegPQKPDHH32ZI-image-1655218396847.png)](https://docs.resds.ru/uploads/images/gallery/2022-06/4yKegPQKPDHH32ZI-image-1655218396847.png)
После создания клиента VPN сервер готов к подключениям внешних клиентов, и можно переходить к проверке.

### Автоматизация развёртывания облачного сервиса.
Для автоматического развёртывания облачного сервиса, необходимо при создании виртуальной машины дополнительно указать скрипт запуска и развёртывания необходимых сервисов. Для развёртывания этого сервиса необходимо создать скрипт, запускающий контейнер.
> Добавлять в контейнер установку Docker не нужно, так как вы будете запускать из виртуального инстанса с предустановленным и запущенным Docker
#### Создание преднастроенной виртуальной машины
Необходимо создать виртуальную машину(в данной практической работе необходимо использовать образ ubuntu-server-20:docker), дополнительно заполнив раздел конфигурация
[![](https://docs.resds.ru/uploads/images/gallery/2022-06/scaled-1680-/zGSX14D1ZYaWjwyL-image-1655218465613.png)](https://docs.resds.ru/uploads/images/gallery/2022-06/zGSX14D1ZYaWjwyL-image-1655218465613.png)
В разделе конфигурация в текстовое поле ввести скрипт, автоматизирующий установку и развёртывание облачного сервиса.
Сам скрипт автоматизации должен включать в себя запуск wireguard контейнера, и запись необходимых параметров в системные файлы.
<details>
  <summary><b>Пример конфига</b></summary>  
<p style="font-family:'Lucida Console', monospace">
#!/bin/bash

cat << EOF | sudo tee -a /etc/sysctl.conf <br>
net.ipv4.ip_forward = 1 <br>
net.ipv6.conf.default.forwarding = 1<br>
net.ipv6.conf.all.forwarding = 1<br>
net.ipv4.conf.all.rp_filter = 1<br>
net.ipv4.conf.default.proxy_arp = 0<br>
net.ipv4.conf.default.send_redirects = 1<br>
net.ipv4.conf.all.send_redirects = 0<br>
EOF

sudo sysctl -p

ip=$(ip a | grep 172.17 | awk '{print $2}' | awk -F "/" '{print $1}') <br>
  
sudo docker run -ti -d -p 80:80 -p 51820:51820 --restart=always --network host --entrypoint "/wireguard-ui" -v /tmp/wireguard-ui:/data --privileged embarkstudios/wireguard-ui:latest --data-dir=/data --wg-listen-port=51820 --wg-endpoint="$ip:51820" --wg-allowed-ips=0.0.0.0/0 --wg-dns="172.17.1.10" --wg-device-name="wg0" --listen-address=":80" --nat --nat-device="eth0" --client-ip-range="10.0.8.1/24"

sudo reboot -h now
</p>
</details>
В конце данного скрипта должна быть инструкция на перезагрузку сервера

После запуска виртуальной машины с указанным скриптом необходимо дождаться запуска виртуальной машины и находящихся на ней сервисов.

#### Настройка VPN тоннелей
Как только контейнер запущен, необходимо подключиться к web интерфейсу VPN сервера для того, чтобы добавить клиентов для подключения. Для этого необходимо открыть в браузере адрес:

http://«ip адрес вашего виртуального сервера»

В открывшемся окне нажать + в правом нижнем углу 
[![](https://docs.resds.ru/uploads/images/gallery/2022-06/scaled-1680-/5AZ8dMoe5lFNMesz-image-1655218540071.png)](https://docs.resds.ru/uploads/images/gallery/2022-06/5AZ8dMoe5lFNMesz-image-1655218540071.png)

В появившемся окне ввести имя клиента и нажать create 

[![](https://docs.resds.ru/uploads/images/gallery/2022-06/scaled-1680-/RaJGnfaJjk9KDoA8-image-1655218561388.png)](https://docs.resds.ru/uploads/images/gallery/2022-06/RaJGnfaJjk9KDoA8-image-1655218561388.png)

Клиент для подключения создан, так же создан конфигурационный файл для клиента и QR код, по которому можно скачать содержимое этого конфигурационного файла 
[![](https://docs.resds.ru/uploads/images/gallery/2022-06/scaled-1680-/r5dDEjBzvNnEdTTA-image-1655218586460.png)](https://docs.resds.ru/uploads/images/gallery/2022-06/r5dDEjBzvNnEdTTA-image-1655218586460.png)
После создания клиента VPN сервер готов к подключениям внешних клиентов, и можно переходить к проверке.

### Проверка
Для начала необходимо установить клиент для подключения к VPN на мобильный телефон:
|[Android](https://play.google.com/store/apps/details?id=com.wireguard.android)| [IOS](https://apps.apple.com/ru/app/wireguard/id1441195209) |
|-|-|
|[![](https://docs.resds.ru/uploads/images/gallery/2022-06/scaled-1680-/PP2nSSSELN12es76-image-1655218856712.png)](https://docs.resds.ru/uploads/images/gallery/2022-06/PP2nSSSELN12es76-image-1655218856712.png)|[![](https://docs.resds.ru/uploads/images/gallery/2022-06/scaled-1680-/1MVrnDqOHjYHCi23-image-1655218708586.png)](https://docs.resds.ru/uploads/images/gallery/2022-06/1MVrnDqOHjYHCi23-image-1655218708586.png)|


Проверку необходимо выполнить со своего персонального устройства. Для начала убедиться, что вы работаете из сети СПбГУТ (Необходимо быть подключенным к WiFi сети)
Перед подключением к VPN серверу необходимо проверить свой текущий ip адрес, под которым вас идентифицируют внешние службы. Сделать это можно открыв сайт [ifconfig.resds.ru](https://ifconfig.resds.ru/). На этой странице будет показано, c каким ip адресом вы обращайтесь как к этой странице.

Для проверки работоспособности VPN сервера необходимо к нему подключиться, и проверить, изменился ли ваш адрес, под которым вы обращаетесь к внешним службам. Если задание практической части было сделано правильно, то вы должны обращаться к внешним службам от адреса вашего VPN сервера.  
Для подключения к VPN серверу необходимо:
1. Открыть скачанное приложение WireGuard
0. Нажать Add a tunnel для добавления VPN тоннеля
0. Выбрать Create from QR code
0. Отсканировать QR код с настройками вашего тоннеля
0. В появившемся меню ввести произвольное имя тоннеля и нажать Save
0. Подключиться к созданному тоннелю, нажав на переключатель в списке подключений
Теперь снова необходимо открыть сайт ifconfig.resds.ru. Если значения изменились, можно сделать вывод о том, что ваш трафик идёт через сервер WireGuard

В случае возникновения проблем у WireGuard нет подробных логов, где можно было бы посмотреть какая ошибка произошла, а причин проблем может быть очень много. Чаще всего — это несоответствующие ключи, закрытый порт или неверный адрес сервера. Для исправления этих ошибок необходимо заново проверить все выполненные настройки.