# Практика 5-6 OpenVPN L2-3 - туннелирование
Сетап точно такой же, как и в предыдущих практиках с SSH-туннелированием, поэтому все моменты вплоть до настройки DHCP и прокидывания VLAN опущены.
## Настройка OpenVPN
Скрипты тащат, скрипты - круто, поэтому качаем скрипт от angristan для лёгкой установки OpenVPN.

Создали клиента, сразу на месте подправим его конфиг, комментируя следующие строчки:
```
#ignore-unknown-option block-outside-dns
#setenv opt block-outside-dns
```
`ignore-unknown-option block-outside-dns` комментируем, чтобы клиент блокировал все DNS-запросы вне туннеля
`setenv opt block-outside-dns` - чтобы не блокировать все DNS-запросы вне туннеля для виндовых тачек (иначе это вызывает проблемы с соединением)

Также редачим конфиг сервера по пути `/etc/openvpn/server.conf`. Открываем наш любимый vim (никакой не nano!) и комментируем следующие строки:
```
#push "dhcp-option DNS 94.140.14.15"
#push "dhcp-option DNS 94.140.14.15"
#push "redirect-gateway def1 bypass-dhcp"
```
Делается это для того, чтобы компы получали настройки по-умолчанию от фаерволла, а не от нашего VPN-сервака.
## Туннелирование на уровне L3
В конфигах как клиента, так и сервера, `device` оставляем `tun` для того, чтобы прокинуть туннель на уровне **L3**.
Предположим, что один из компов (какой-нибудь внутренний сервак на линуксе) ломанули и получили к нему полный доступ. В этом случае мы можем получить доступ до внутренней сети.

Ставим на клиенте (ломаном линухе) OpenVPN и забираем конфиг с сервера через SCP:
```
scp user@192.168.115.152:/home/user/client.ovpn ~/
```

И подключаемся к серваку через `openvpn client.ovpn`

Вуаля, туннель готов. Проблема осталась только в том, что он не видит соседние тачки и не может их нормально пинговать. Первое решается тем, что мы прописываем существующие за туннелем сетки вручную в `/etc/openvpn/ccd/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
```
А также прописываем маршруты до этих самых сеток вручную:
```
ip route add 192.168.1.0/24 dev tun0
ip route add 172.16.10.0/24 dev tun0
ip route add 172.16.20.0/24 dev tun0
```
А второе решается прописыванием NAT на крякнутом линухе, как это делалось в предыдущей практике с SSH:
`iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE`
Не забываем также раскомментить `net.ipv4.ip_forward = 1` в `/etc/sysctl.conf` на ломаном линуксе, чтобы трафик мог перекидываться между интерфейсами. Сохраняем через `sysctl -p`.
И вуаля!

На стену тоже заходит

Теперь организуем L2!
## Туннелирование на уровне L2
На деле тут всё даже гораздо проще, за исключением того, что его невозможно реализовать, если устройство не выступает посредником между стеной и остальной сетью. Поэтому возвращаемся к топологии с Raspberry Pi.
В конфигах сервера и клиента правим `device` с `tun` на `tap`, после чего соединяем интерфейсы OpenVPN и внутренней сети в один bridge:
```
ip link add br0 type bridge
ip link set ens3 master br0
ip link set ens4 master br0
ip link set tap0 master br0
```
И на кали получаем айпишник по DHCP:
