# OpenVPN Lab
> **Задачи:**
1. Установить openvpn сервер
2. Настроить vpn сервер и перенести клиентский конфиг на конечную машину
3. Настроить доступ из локальной сети клиента до сети сервера и наоборот
<br>
### Установка openvpn сервера
Установка vpn сервера будет выполняться с помощью скрипта
`curl -L https://install.pivpn.io | bash`
> Данный vpn предназначался для Raspberry Pi, но установщик так же поддерживает и полноценные рабочие станции и имеет под капотом удобный клиент для работы с конфигурациями.
После выполнения команды, мы видим ряд интерактивных окон, с помощью которых мы можем совершить первичную конфигурацию нашего ovpn сервера.<br><br><br>

Первым делом нам предлагают настроить сеть
<br>

Далее установщик замечает, что на сервере стоит не RPI OS, но это не страшно, так как Debian/Ubuntu также подойдут
<br>

Данный скрипт также позволяет инсталлировать WireGuard, но в рамках этой практики он нам не нужен. Выбираем **OpenVPN**
<br><br>
### Настройка Openvpn сервера
Пользуясь утилитой pivpn добавляем нового клиента
```
root@Debian-10:/etc/openvpn$ pivpn add nopass
How many days should the certificate last? 1080
========================================================
Done! user.ovpn successfully created!
user.ovpn was copied to:
/home/user/ovpns
for easy transfer. Please use this profile only on one
device and create additional profiles for other devices.
========================================================
```
Теперь в директории ~/ovpns будет лежать наш клиентский конфиг, с помощью которого можно будет коннектиться к нашему vpn серверу.
Теперь нужно добавить маршруты для нашего клиента, чтобы расширить область его видимости в vpn сети.
Push routs мы добавим не в server.conf, а в отдельный файл нашего пользователя в директории **ccd**, чтобы прокидывать маршруты для отдельных клиентов, а не для всех пользователей нашего vpn сервера.
В файле `/etc/openvpn/ccd/user` уже содержится информация о том, в какую подсеть и с каким адресом попдает клиент при подключении `ifconfig-push 10.19.94.2 255.255.255.0`.
Сейчас нам нужно просто указать другие подсети, которые мы хотим открыть для клиента, для этого мы в этом же файле пропишем `push "route 172.16.11.0 255.255.255.0"` и `push "route 172.16.12.0 255.255.255.0"`
---
Но наш локальный сервер не виден из WAN сети, поэтому мы настроим на pfsense port forwarding до vpn сервера, а клиенты в свою очередь в конфигурацинном файле будут указывать ip адрес этого pfsense.
<br>
Теперь нужно доставить клиентский конфиг конечному узлу, с которого будет инциализированно подключение к vpn сети. Делать это будем с помощью python server'а, который мы поднимем на том же порту, что и vpn, но использовать будем tcp, а не udp, что позволит нам избежать конфликта открытых портов, а pfsense с уже настроеным port forwarding'ом позволит достучаться до нашего конфига.
<br>

<p style="text-align: center;">Запуск python server</p>

<p style="text-align: center;">wget конфиг на клиенте</p>
Далее в самом конфиге в качестве сервера нужно выставить адрес pfsense
<br><br>
### Настройка доступа до локальной сети сервера и клиента
Теперь можно инициализировать подключение `sudo openvpn configname.ovpn`

Проверяем, что у нас появился виртуальный интерфейс tun0 и получил свой ip адрес
<br>

Так же проверяем, что наш vpn работает и прокинутые push route работают
<br>
---
В итоге мывидим локальную сеть сервера со стороны клиента, теперь получим доступ до локальной сети клиента со стороны сервера.
Для начала нужно в pfsense выставить статичный маршрут, который все пакеты, идущие в LAN сеть клиента отправит к ovpn серверу.

<br>
Далее на самом vpn сервере нужно включить ip forward `sysctl -w net.ipv4.ip_forward=1`, для того, чтобы мы могли направить пришедший пакет дальше, так же нужно добавить статичный маршрут `ip route 172.16.4.0/24 via 10.144.191.5 dev tun0`, чтобы знать куда именно направить пришедший пакет. Так же нам нужно написать правило для iptables, чтобы направить пришедший трафик на правильный интерфейс используя nat.
`iptables -t nat -A POSTROUTING -s 172.16.3.0/24 -o tun0 -j MASQUERADE`
Проверим доступность локальной сети клиента, для этого выполним пинг из сети `172.16.3.0/24`

## Итог
Мы подняли OpenVPN сервер и настроили VPN туннель, который связывает 2 локальные сети и имеем доступ с любой машины в одной из этих сетей до другой.