---
# System prepended metadata

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

---

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


## Построить инфраструктуру в системе EVE-NG (есть возможность ее импортировать)
Для работы был скачан образ pnet-lab не требующий импорта. Образ был успешно разархивирован и запущен в vmware.
![](https://i.imgur.com/PZdgk5n.jpg)

Далее в редакторе была построена инфраструктура организации.
- Kali Linux - Linux Kali 2022 (2CPU, 2GB RAM)
- pfSense - PfSense Firewall 2.6.0, default config (Qemu version 4.1.0, 2CPU, 2GB RAM, Primary Console VNC)
- Switch - Cisco IOL-L2-ADVIPSERVICESK9 (2 port-groups)
- Debian - Linux Debian 10 (1CPU, 1GB RAM)
- Linux-vulnerable - Linux Debian 10 (1CPU, 1GB RAM)
- Win-10 - Windows 10 (full) (2CPU, 2GB RAM)
- Win-7 - Windows 7 (full) (QEMU 2.12, 4CPU, 4GB RAM)
- Network:
    - Pfsense Default config (WAN-DHCP, LAN - static IP)
    - Internet - Cloud-1
    - VLAN-10 - 172.16.10.0/24, GW 172.16.10.254
    - VLAN-20 - 172.16.20.0/24, GW 172.16.20.254

![](https://hackmd.io/_uploads/HkP1BjoE3.jpg)


:::spoiler Switch config
```
version 15.2
service timestamps debug datetime msec
service timestamps log datetime msec
no service password-encryption
service compress-config
!
hostname Switch
!
boot-start-marker
boot-end-marker
!
!
!
no aaa new-model
!
!
!
!
!
!
!
!
ip cef
no ipv6 cef
!
!
!
spanning-tree mode pvst
spanning-tree extend system-id
!
vlan internal allocation policy ascending
!
!
!
!
!
!
!
!
!
!
!
!
!
!
interface Ethernet0/0
 description Debian
 switchport trunk encapsulation dot1q
 switchport mode trunk
!
interface Ethernet0/1
 description Linux-Vulnerable
 switchport mode access
!
interface Ethernet0/2
 description win-7
 switchport access vlan 10
 switchport mode access
!
interface Ethernet0/3
!
interface Ethernet1/0
 description win-10
 switchport access vlan 20
 switchport mode access
!
interface Ethernet1/1
!
interface Ethernet1/2
!
interface Ethernet1/3
!
ip forward-protocol nd
!
!
no ip http server
no ip http secure-server
!
!
!
!
!
control-plane
!
!
line con 0
 logging synchronous
line aux 0
line vty 0 4
 login
!
!
end
```
:::
:::spoiler Настройка файервола
```
WAN (wan)        -> vtnet0        -> v4/DHCP4: 192.168.19.163/24
LAN (lan)        -> vtnet1        -> v4: 172.16.1.1/24
OPT1 (opt1)      -> vtnet1.10     -> v4: 172.16.10.254/24
OPT2 (opt2)      -> vtnet1.20     -> v4: 172.16.20.254/24
```
Настроенные VLAN
![](https://i.imgur.com/KcDS8r7.jpg)

На дефолт vlan
![](https://i.imgur.com/6b8Lkq4.jpg)

На vlan10
![](https://i.imgur.com/bfCFrDz.jpg)

На vlan20
![](https://i.imgur.com/Sl8MHkB.jpg)

Настройка правил фаерволла для созданных vlan
![](https://i.imgur.com/ySuq2vJ.jpg)
![](https://i.imgur.com/RqxHEFM.jpg)

:::
## Настроить каждое устройство в соответсвии со следующими параметрами
### Kali-2021, Win-7, Win-10, Debian - получение адреса DHCP
pfSense выступает в роли DHCP сервера и выдает ip для машин.

### Настройка Kali

Получение ip по DHCP
![](https://i.imgur.com/qiyRuP5.jpg)
Нужно отредактировать пароль пользователя root, чтобы в последствии возможно было подключаться от root.
`sudo passwd root` 
![](https://i.imgur.com/PQWGRXh.jpg)
*пароль был поставлен такой же, как и от юзер акка*

#### Настройка OpenVPN
Скачиваем скрипт по развертыванию сервера `curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh`
Потом запускаем его `./openvpn-install.sh`. Меняем public IPv4 address так, чтобы он совпадал с нашим основным ip.
![](https://hackmd.io/_uploads/SkCSQTL4n.jpg)
Далее оставляем все по умолчанию. Называем клиента client
![](https://hackmd.io/_uploads/SJPkVpL4n.jpg)

Время править конфиг. В конфиге сервера `nano /etc/openvpn/server.conf` правим следующие строки:
```
dev tun1 #Для уровня L3
dev tap #Для уровня L2
server 10.8.1.0 255.255.255.0
#push "dhcp-option DNS 94.140.14.15"
#push "dhcp-option DNS 94.140.14.15"
#push "redirect-gateway def1 bypass-dhcp"
```
Интерфейс и подсеть были исправлены, дабы избежать конфликтов с SSH настройками. DNS должен быть от файервола, а не от OpenVPN сервера, и дефолт-гейтвеем должен быть pfsense.
![](https://hackmd.io/_uploads/Byi-Sa8E3.jpg)


### Win-7
![](https://i.imgur.com/rrOIbwj.jpg)

### Win-10
![](https://i.imgur.com/ajapyAk.jpg)


### Debian
*dhclient, чтобы он запросил IP у DHCP сервера*
`apt install bridge-utils`
`nano /etc/network/interfaces`
![](https://i.imgur.com/UyBNl4P.jpg)
После - ребутнуть либо через `systemctl restart networiking`, либо всю машину целиком
![](https://i.imgur.com/7B2Gq3H.jpg)
*dhclient, чтобы он запросил IP у DHCP сервера*
`apt update`
`apt install openvpn`

Забираем сгенерированный конфиг через `scp root@192.168.19.165:/home/user/client.ovpn ./client.conf`
![](https://hackmd.io/_uploads/SJOXD6I42.jpg)

Правим конфиг:
```
dev tap #Для уровня L2
#explicit-exit-notify
#ignore-unknown-option block-outside-dns
#setenv opt block-outside-dns # Prevent Windows 10 DNS leak
```

Explicit-exit-notify. В режиме клиента, при выходе/перезапуске, эта опция указывает серверу немедленно закрыть объект экземпляра клиента, а не ждать таймаута. Ignore-unknown-option (игнорирует ошибку https://community.openvpn.net/openvpn/ticket/570?cversion=0&cnum_hist=1) block-outside-dns (запрещает все dns запросы, которые пытаются идти в обход туннеля).
Подробнее про большинство настроек конфига: https://github.com/OpenVPN/openvpn/blob/master/sample/sample-config-files/client.conf

![](https://hackmd.io/_uploads/ryVHOa842.jpg)

Перемещаем конфиг в нужную директорию `mv client.conf /etc/openvpn/`

### Linux-vulnerable
*dhclient, чтобы он запросил IP у DHCP сервера*
`apt update`
`apt install openvpn`

Забираем сгенерированный конфиг через `scp root@192.168.19.165:/home/user/client.ovpn ./client.conf`
![](https://hackmd.io/_uploads/SJOXD6I42.jpg)

Правим конфиг:
```
#explicit-exit-notify
#ignore-unknown-option block-outside-dns
#setenv opt block-outside-dns # Prevent Windows 10 DNS leak
```

Explicit-exit-notify. В режиме клиента, при выходе/перезапуске, эта опция указывает серверу немедленно закрыть объект экземпляра клиента, а не ждать таймаута. Ignore-unknown-option (игнорирует ошибку https://community.openvpn.net/openvpn/ticket/570?cversion=0&cnum_hist=1) block-outside-dns (запрещает все dns запросы, которые пытаются идти в обход туннеля). 
Подробнее про большинство настроек конфига: https://github.com/OpenVPN/openvpn/blob/master/sample/sample-config-files/client.conf

![](https://hackmd.io/_uploads/ryVHOa842.jpg)

Перемещаем конфиг в нужную директорию `mv client.conf /etc/openvpn/`



## L3 Туннелирование
~~Выставить в /etc/openvpn/server.conf dev tun1~~

Первым делом подключаемся с Linux по vpn к Кали
`openvpn /etc/openvpn/client.conf`
![](https://hackmd.io/_uploads/SkC55pLN2.jpg)

Проверяем, что с Кали идет пинг на Linux
![](https://hackmd.io/_uploads/SyOEiaUVh.jpg)

Добавляем маршрутизацию для туннеля vpn `sudo nano /etc/openvpn/ccd/client`
![](https://hackmd.io/_uploads/SJajjp84h.jpg)

### Настройка Linux
Теперь пропишем правило, которое будет менять ip Kali на ip Linux'a. Чтобы при взаимодействии другие устройства понимали, куда отправлять пакеты.
`iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE`
Также необходимо отредактировать `nano /etc/sysctl.conf`, чтобы пакеты могли передаваться между интерфейсами Linux'a
![](https://i.imgur.com/y55JBLc.jpg)
`sysctl -p` чтобы сохранить

### Настройка Kali
Также необходимо прописать маршруты в ip route, чтобы пакеты *уходили* в нужную сторону.
```
ip route add 172.16.1.0/24 dev tun1
ip route add 172.16.10.0/24 dev tun1
ip route add 172.16.20.0/24 dev tun1
```
![](https://hackmd.io/_uploads/HyuX268V3.jpg)

### Проверка
Kali может пропинговать win-7 (`172.16.10.5`) и зайти в админ панель pfsense. Однако, в админ панели отображается, что вход был выполнен с устройства `172.16.1.13`, что является айпишником Linux'a.
![](https://hackmd.io/_uploads/SyN5pT8E3.jpg)
![](https://hackmd.io/_uploads/BkmJAa8Nn.jpg)



## L2 Туннелирование
~~Выставить в /etc/openvpn/server.conf dev tap~~

Первым делом подключаемся с Debian по vpn к Кали
`openvpn /etc/openvpn/client.conf`
![](https://hackmd.io/_uploads/ByS_8AIE2.jpg)

Потом объединяем `tap0` интерфейс в bridge
`brctl addif br0 tap0`
![](https://i.imgur.com/ynKxBfi.jpg)

Теперь можно на Кали запросить ip по DHCP `dhclient tap0` и быть *легитимным* участником чужой сети.
![](https://hackmd.io/_uploads/r1SJPR8Vn.jpg)
