---
# System prepended metadata

title: Практика №5. OpenVPN L3 - туннелирование

---

# Практика №5. OpenVPN L3 - туннелирование

##  Задание к практической работе №5

- Построить инфраструктуру в системе pnet
- Организация OpenVPN L3 тоннеля вовнутрь инфраструктуры

---
## Выполнение практической работы

### Построить инфраструктуру в системе pnetlab

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

При выполнении данного пункта было решено модифицировать инфраструктуру из предыдущей практики №4. На устройствах pfSense и Switch сохраняются VLAN 10 и VLAN 20 c сетями 172.16.10.0/24 и 172.16.20.0/24 соотстветсвенно. SecretDebianOlezhi с предыдущей практики является "мостовым" устройством, чужим во внутренней инфраструктуре. Так же здесь добавлено новое устройство на основе ОС Debian (OpenVPN-Olezha-Client), которое будет играть роль клиента для OpenVPN на уровне L3 в этой практике, в том числе является устройством владельца Kali-Olezha2022.

![](https://i.imgur.com/oRRlC3D.png)

В данной лабораторной работе применяются технологии OpenVPN.

> **VPN (Virtual Private Network)** -- обобщенное название технологий позволяющих обеспечить построение логической (виртуальной) сети поверх физической, чаще всего поверх сети интернет или иных сетей с низким уровнем доверия.
> 
> Для построения сетей VPN обычно используются **туннели**, **туннелирование** это процесс установления соединения между двумя точками с использованием инкапсуляции, когда данные одного протокола помещаются в "конверты" другого протокола с целью обеспечить их прохождение в неподходящей среде, обеспечения целостности и конфиденциальности, защиты с помощью шифрования и т.д. и т.п. Под VPN следует понимать виртуальную сеть, которая образуется путем установления туннельных соединений между отдельными узлами.

**OpenVPN** -- свободная реализация VPN с открытым исходным кодом. Для защиты соединения также используется SSL. Для передачи данных внутри SSL-канала OpenVPN использует собственный протокол с транспортом UDP. OpenVPN обеспечивает высокую безопасность и считается одним из самых защищенных протоколов. Также имеются дополнительные возможности в виде передачи с сервера на клиент необходимых настроек и маршрутов, что позволяет легко создавать сложные сетевые конфигурации без дополнительной настройки клиентов.

Кроме туннелей, работающих на сетевом уровне (L3) -- TUN, OpenVPN позволяет создавать соединения канального (L2) уровня -- TAP, позволяя связывать сети на уровне Ethernet. Однако следует помнить, что в этом случае в туннель будет инкапсулироваться широковещательный трафик, а это может привести к повышенной нагрузке на оборудование и снижению скорости соединения.

К недостаткам можно отнести работу в пользовательском пространстве и некоторую сложность настроек. Скорость внутри OpenVPN туннелей также может быть значительно ниже скорости канала.


:::danger
**!!ВАЖНОЕ ЗАМЕЧАНИЕ!!**
После закрытия лабаторной работы IP некоторых устройств менются, поэтому неудивительно, что на некоторых скриншотах разные IP одних и тех же устройств!
:::

### Организация OpenVPN L3 тоннеля вовнутрь инфраструктуры

Перед началом работы необходимо обновить информацию о последних пакетах, прописав:

```
sudo get update
```
Это позволит устанавливать нам утилиты последних версий.

![](https://i.imgur.com/Xc1z8n5.png)

Затем необходимо скачать с [github](https://github.com/angristan/openvpn-install) OpenVPN при помощи следующего скрипта:
```
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh

```

Команда, которая даст ему права на выполнение:

```
chmod +x openvpn-install.sh
```

![](https://i.imgur.com/cgcEPeb.png)

После того, как скачали, убедимся в этом, просмотрев текущую директорию при помощи `ls`. Как видно на скришноте ниже, openvpn-install.sh установился и теперь его необходимо запустить, чтобы скачать сам OpenVPN.

![](https://i.imgur.com/l0tvQ4r.png)

Для того, чтобы запустить файл используем следующее:
```
sudo ./openvpn-install.sh
```

![](https://i.imgur.com/LWecwjC.png)

Для начала нужно будет установить наш внешний IP, который будет доступен для клиентов. Он автоматически вписывается в первый ввод, поэтому можно просто нажать enter. В следующем вводе просто вписываем тот же IP для удобства, что и до этого.
Затем установщик спросит хотим ли мы включить IPv6, который по умолчанию отключен. Нам он не нужен в ходе лабороторной работы - отказываемся, нажимая `n`.
Слушать будем дефолтный порт, поэтому оставляем `1`.
Протокол оставляем на UDP, оставляя `1`.

![](https://i.imgur.com/5lwaAKn.png)

Всё остальное так же оставляем без изменений.

![](https://i.imgur.com/PZKO57Z.png)

Когда установщик просит указать имя клиента, то просто вписываем стандартное`client` и оставляем его без пароля, выбирая `1`.

![](https://i.imgur.com/as5IJZf.png)

Убедимся, что конфиг клиента создался, проверив директорию при помощи `ls`. На скрине ниже видно, что всё прошло успешно.

![](https://i.imgur.com/GVyQYeM.png)

Посмотрим на сокеты. SS -- утилита для сканирования сокетов.
```
sudo ss -tunlp
```
:::info
**Объяснения флагов:**
`-t` : отображение TCP-сокетов,
`-u` : отображение UDP-сокетов,
`-l` : отображение только прослушивающихся сокетов,
`-n` : отображение процесса, использующих сокет,
`-p` : не отображать имена служб.
:::

Пока что здесь только открытый 1194 порт от OpenVPN. В будущем, чтобы передать файл, нам необходимо будет открыть 22 порт с ssh.

![](https://i.imgur.com/0y0p8b5.png)

Необходимо поправить конфигурационные файлы.

```
sudo nano /etc/openvpn/server.conf
```

![](https://i.imgur.com/brXrBra.png)

В данной практике нам не нужен пуш DNS и не нужен дефолтный роутер, который OpenVPN нам настроил, поскольку, в данной работе мы всё же хотим проникнуть внутрь сети и использовать за роутер pfsense. Закомментируем все ненужные строки при помощи '#'.

![](https://i.imgur.com/F9Wprv7.png)

Обязательно перезапускаем службу openvpn после изменения настроек.

```
sudo service openvpn restart
```

![](https://i.imgur.com/PnY4wIt.png)

Дальше нужно будет изменить конфигурацию клиента client.ovpn.

![](https://i.imgur.com/ReyniVE.png)

Уберём explicit-exit-notify. Он нам не нужен, поскольку этот параметр отвечает за то, что сервер получает сообщение о разъединении в случае отключения клиента, нам это не обязательно. Два остальных отвечают за блок DNS, даже если они не передались, поэтому они тоже не нужны и их стоит закомментировать.


![](https://i.imgur.com/ktfaYKK.png)

Включаем сервис ssh для того, чтобы передать файл client.ovpn клиенту.

```
systemctl enable ssh
service ssh start
```

![](https://i.imgur.com/2Jm3aBG.png)

Проверим, что всё поднялось и работает.

```
sudo ss -tunlp
```

![](https://i.imgur.com/zp1UMFn.png)

Первым делом настроим на клиенте /etc/network/interfaces под стать тому, что отображено ниже на скриншоте:

![](https://i.imgur.com/5J8QKYX.png)

Далее при помощи scp (scp в Linux позволяет выполнить безопасное копирование и перенос файлов) передаём файл на OpenVPN-Olezha-Client.
Воспользуемся следующим шаблоном:
`scp user@ip:/home/user/file /home/user/file` , где user - наименование пользователя машины, к которой мы будем подключаться, ip - ip этой машины, дальше идёт директория и наименование файла на сервере, а в след за ним директория и наименование файла на подключаемой машине.

```
scp olezha@192.168.192.131:/home/olezha/client.ovpn ./client.conf
```

![](https://i.imgur.com/LnIq6ZN.png)

Проверяем, что файл на месте при помощи `ls`. На скриншоте ниже показано, что файл передался.

![](https://i.imgur.com/ChXTO85.png)

Дальше необходимо установить OpenVPN на OpenVPN-Olezha-Client.

```
apt install openvpn
```

![](https://i.imgur.com/boA5NpN.png)

После установки необходимо перместить файл, который мы получили при помощи scp, в директорию /etc/openvpn/. Сделаем это:
```
mv client.conf /etc/openvpn/
```

![](https://i.imgur.com/II8PCGZ.png)

Затем необходимо запустить данный конфиг, используя утилиту openvpn и синтаксис `openvpn file`:

```
openvpn /etc/openvpn/client.conf
```

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

![](https://i.imgur.com/dUTo4VG.png)

Пробуем с сервера пропинговать туннель tun0, который поднялся на скрине выше, с ip 10.8.0.2. Всё хорошо пингуется.

![](https://i.imgur.com/6VcB9Ix.png)

Попробуем прослушать интерфейс tun0 и посмотреть те самые пинги с kali linux. Для этого необходимо скачать tcpdump:

```
apt install tcpdump
```
и запустить прослушивание:

```
tcpdump -i tun0
```
, где `-i` указывает на название интерфейса. 
После запуска видим, что протокол ICMP отрабатывает как надо.

![](https://i.imgur.com/LeqpMgr.png)

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

Пропишем в файле client следующее:

```
iroute 192.168.1.0 255.255.255.0
iroute 172.16.10.0 255.255.255.0
iroute 172.16.20.0 255.255.255.0
```
Всё это сети, которые находятся во внутренней инфраструктуре, которые будут теперь автоматически добавлены в таблицу маршрутизации при подключении.

![](https://i.imgur.com/35FKHRn.png)

Снова необходимо перезапустит сервис openvpn.

![](https://i.imgur.com/T3H34sc.png)

Далее прописываем сами маршруты, чтобы наша машина знала, как добраться до той или иной сетки. Воспользуемся шаблоном:
`ip route add net/mask via gateway`, где net - адрес сети, mask - маска сети, а gateway, в нашем случае, это ip машины клиента, то есть, другой конец тоннеля tun0.
Таким образом, получим следующее:

```
sudo ip route add 192.168.1.0/24 via 10.8.0.2
sudo ip route add 172.16.10.0/24 via 10.8.0.2
sudo ip route add 172.16.20.0/24 via 10.8.0.2
```

Выведем маршруты и увидим, что всё добавилось.

![](https://i.imgur.com/Sri9y2C.png)

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

```
openvpn /etc/openvpn/client.conf
```

![](https://i.imgur.com/XisXRQS.png)

Попробуем пропинговать фаервол, но видим, что обратно мы ответ не получаем. Хотя бы не host unreachable!

![](https://i.imgur.com/tDaAl2c.png)

Устанавливаем прослушивание тоннеля на клиенте OpenVPN-Olezha-Client, как уже делали в данной и предыдущих практиках:
```
tcpdump -i tun0
```
Как мы можем заметить, протокол IMCP отрабатывает, но только в одну сторону, ответ просто не приходит, а вот запрос да.

![](https://i.imgur.com/0KBl7ZG.png)

Для того, чтобы всё заработало необходимо нужно разрешить роутинг и настроить наттинг.

![](https://i.imgur.com/SdggXCV.png)

Необходимо изменить параметр net.ipv4.ip_forward для разрешения роутинга.

> **net.ipv4.ip_forward** это параметр ядра Linux, который позволяет пересылать IP-пакеты между различными интерфейсами и сетями. Установка значения 1 для параметра net.ipv4.ip_forward позволяет настроить Linux-систему в качестве маршрутизатора и перенаправлять IP-пакеты между различными интерфейсами и сетями.

![](https://i.imgur.com/3Y8sOcG.png)

Дальше используем `sysctl - p`, чтобы применить изменения без перезагрузки системы.

![](https://i.imgur.com/HHLP9kr.png)

Далее нам необходима следующая настройка:
```
iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
```

Что делает эта команда, мы уже разбирали в 4 практике, но кратко она настраивает NAT на нашем клиента. Когда устройства отправляет пакеты, их IP-адрес заменяется на IP-адрес интерфейса ens3, что позволяет им выходить в интернет с общим IP-адресом маршрутизатора.

![](https://i.imgur.com/ksc8Y6w.png)

Вновь переподключаемся с помощью `openvpn /etc/openvpn/client.conf`, чтобы изменения вступили в силу.

![](https://i.imgur.com/KTgYLew.png)

Снова пробуем пропинговать фаервол и теперь нам даже приходят ответы.

![](https://i.imgur.com/T5l2hIl.png)

Пробуем подключиться к нему и видим, что мы сидим от лица нашего клиента с IP 192.168.1.103.

![](https://i.imgur.com/4uIgmY2.png)

Также попобуем пропинговать внутрь одного из VLAN и проверим, доходят ли пакеты обратно. IP-адрес OlezhaW10 172.16.20.1 (это мы узнали при помощи `ipconfig`).

![](https://i.imgur.com/3LBRULS.png)

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

![](https://i.imgur.com/5aegGym.png)
