# Практика №5. OpenVPN L3 - туннелирование
Возьмем инфрастуктуру из четвртой практической работы и добавим еще одну линукс-машинку, которую подключим к свитчу.

Так же с прошлой практики оставляем настройку моста br0 и интерфейсов ens3 и ens4 на Debian.
Нужно обновить репозиторий на нашем устройстве - Kali Linux.

Далее нужно установить openvpn. Сделать это можно с помощью команды:
`curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh`
Затем нужно сделать этот файл исполняемым:
`chmod +x openvpn-install.sh`

Командой `sudo ./openvpn-install.sh` запустим скрипт для создания нашего собственного впн.

В качестве публичного ip укажем тот, который был присвоен Kali Linux.

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

Файл успешно создался и находится в домашней директории.

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

Нужно изменить конфигурационный файл. Командой `sudo nano /etc/openvpn/server.conf` открываем файл через текстовый редактор и коментируем следующие три строки.
**'dhcp-option DNS 94.140.14.14'** и **'dhcp-option DNS 94.140.14.14'** - преобразовывают доменные имена адресов.
**'redirect-gateway def1 bypass-dhcp'** - в качестве gateway клиента нельзя будет установить gateway сервера.
Перезагружаем openvpn, чтобы новые настройки применились.

Далее переходим в настройки файла клиента.

Изименяем конфигурационный файл и сохраняем его.
**explicit-exit-notify** - посылает уведомление об отключении от сервера vpn.
**setenv optblock-outside-dns** - устанавливает переменную среды
**Windows 10 DNS leak** - предотвращает утечку активности пользователя Windows 10.
**ignore-unknown-option block-outside-dns** -обеспечивает безопасное подключение и позволяет принимать настройки DNS только от сервера.

Затем переходим к клиенту Linux-OpenVPN и с помощью команды `nano /etc/network/interfaces` открываем настройки интерфейсов и настраиваем интерфейс и dhcp.

Затем с помощью команды `nano /etc/hosts` открываем файл и меняем название хоста на Linux-VPN-Client.

Потом с помощью `nano etc/hostname` так же открываем файл и делаем тоже самое. После этого машинку нужно ребутнуть.

Затем необходимо обновить репозиторий и установить openvpn на наш клиент.

Между тем на Kali Linux необходимо включить ssh, чтобы можно было передать наш созданный файл с впн.

Возвращаемся к нашему клиенту, и с помощью команды `scp user@192.168.186.130:/home/user/client.ovpn /etc/openvpn/client.conf` передаем наш созданный файл.
**scp (secure copy)** - позвоялет безопасно файлы и каталоги.
**user** - это имя пользователя на Kali Linux
**192.168.186.130** - это Ip-адрес Kali Linux
**/home/user/client.ovpn** - файл, который будем забирать
**/etc/openvpn/client.conf** - куда он будет передан

Командой `nano /etc/openvpn/client.conf` можно открыть файл и убедиться, что он был успешно передан.

Командой `openvpn /etc/openvpn/client.conf` запустим наш файл с vpn и подключимся к серверу.

Можно проверить, что так же появилось новое подключение и пропинговать наш клиент. Всё работает.
**10.8.0.2** - ip-адрес клиента.

Затем вновь вернемся к нашеу клиенту и в новой вкладке установим tcpdump, а затем запустим его командой `tcpdump -i tun0`.
**tun0** - созданный интерфейс.
При этом на Kali lInux начнем пинговать Ip фаерволла 192.168.1.1, в результате чего можно заметить, что видны эхо-запросы.

Далее на Kali Linux необходимо переместиться в директорию /etc/openvpn/ccd, в котором добавим маршрут внутренней сети, чтобы сервер о ней знал.

С помощью команды `nano client` откроем файл клиента и добавим маршрут до внутренней сети и сохраним изменения.

Затем нужно аерезагрузить openvpn, чтобы настройки применились.

На клиенте тоже перезапускаем openvpn.

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

Затем на клиенте запускаем вновь tcpdump для tun0, на Kali Linux снова пингуем ip фаерволла. Как видно трафик идет, но пинга нет. Показываются лишь запросы с 10.8.0.1. Kali Linux пытается проверить подключение к межстетевому экрану, но установить ег оне может. Для этого нужно внестри коррективы в некоторые файлы на клиенте.

Нужно разрешить routing. Командой `nano /etc/sysctl.conf` открываем конфигурационный файл - sysctl прелназначен для управления параметрами ядра во время выполнения, убираем комментарий - включаем пересылку пакетов - и сохраняем.

Командой `sysctl -p` применяем изменения.

Затем нужно настроить NAT командой `iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE`
**iptables** - утилита, которая основана на правилах, контролирующих входящие и исходящие пакеты.
**-j NASQUERADE -** нужен, чтобы маскировать IP-адрес узла за внешним IP-адресом шлюза.
**POSTROUTING -** изменяет пакеты на выходе из внешнего устройства брандмауэра.

Вновь перезапускаем openvpn.

Открываем новую вкладку и запускаем tcpdump, а на Kali Linux пингуем ip адрес фаерволла. Пинг теперь проходит.

Можно на нашем сервере открыть сайт pfsense и увидеть ip-адрес.

Этот ip был получен нашим клиентом по dhcp.
