Задача: Связать через OpenVPN хост Ubuntu 20.04 Server и домашний Mikrotik RB2011UiAS-2HnD

Как я уже раньше на заметках блога https://lin.ekzorchik.ru говорил, мне нужен еще один OpenVPN туннель до моей локальной сети, но делать/уже сделал его буду на Ubuntu 20.04 Server до домашнего Mikrotik за которым боевой сервер (Supermicro SYS-5019S-M: Debian 10 + Proxmox 6, ZFS разделы, 64Gb оперативной памяти (2 модуля 378A4G43MB1-CTD). В моей домашней сети будет VLAN 2 с сетью 10.10.10.0/24 в котором создана виртуальная машина и на ней поднята роль iRedMAIL, цель которой обслуживать мой почтовый домен на собственных мощностях. Сейчас данной заметкой я проработал практически от и до, как связать Ubuntu 20.04 Server (OpenVPN server) – Mikrotik RB2011UiAS-2HnD (OpenVPN клиент).

Функционал Mikrotik по части OpenVPN не поддерживает:

  • UDP соединения
  • LZO сжатие
  • TLS аутентификацию
  • Аутентификация через связку логин и пароль

Схема тестового полигона, а уже на его основе перенесено на боевое железо выше.

Srv-vpn (Ubuntu 20.04 Server OpenVPN Server) – srv-chr (Mikrotik)

За Mikrotik сеть 10.10.10.0/24

  • W10X64 – 10.10.10.201

Шаг №1: На VPS поднимаем серверную часть OpenVPN опираясь на ранее опубликованную заметку где я разобрал как установить OpenVPN на Ubuntu 20.04 Server.

Как развернуть OpenVPN сервис на Ubuntu 20.04

Шаг №2: Т.к. OpenVPN клиент на Mikrotik умеет работать с OpenVPN только по tcp, а не по udp, то изменяю конфиг:

ekzorchik@srv-vpn:~$ sudo systemctl stop openvpn
ekzorchik@srv-vpn:~$ sudo cp /etc/openvpn/server/server.conf /etc/openvpn/server/server.conf.backup
ekzorchik@srv-vpn:~$ sudo rm /etc/openvpn/server/server.conf

ekzorchik@srv-vpn:~$ sudo mkdir /etc/openvpn/ccd
ekzorchik@srv-vpn:~$ nano /etc/openvpn/ccd/client1 – именуем как имя сертификата
iroute 10.10.10.0 255.255.255.0

ekzorchik@srv-vpn:~$ sudo nano /etc/openvpn/server/server.conf
local 172.33.33.117
port 1195
proto tcp
dev tun0
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA1
#tls-crypt tc.key
topology subnet
server 10.9.0.0 255.255.255.0
route 10.10.10.0 255.255.255.0 10.9.0.1
push "route 10.10.10.0 255.255.255.0"
#push "redirect-gateway def1 bypass-dhcp"
push "redirect-gateway def1"
#push "autolocal def1 bypass-dhcp"
ifconfig-pool-persist ipp.txt
#push "dhcp-option DNS 8.8.8.8"
#push "dhcp-option DNS 8.8.4.4"
keepalive 10 120
cipher AES-128-CBC
user nobody
group nogroup
persist-key
persist-tun
verb 3
client-config-dir /etc/openvpn/ccd
client-to-client
#crl-verify crl.pem
#explicit-exit-notify
status       /var/log/openvpn/openvpn-status.log
log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log

После не забываем сохранить внесенные изменения и перезапускаем сервис OpenVPN:

ekzorchik@srv-vpn:~$ sudo systemctl restart openvpn && sudo systemctl status openvpn | head -n5
● openvpn.service - OpenVPN service
     Loaded: loaded (/lib/systemd/system/openvpn.service; enabled; vendor preset: enabled)
     Active: active (exited) since Tue 2022-02-15 12:26:17 UTC; 15ms ago
    Process: 3141 ExecStart=/bin/true (code=exited, status=0/SUCCESS)
   Main PID: 3141 (code=exited, status=0/SUCCESS)
ekzorchik@srv-vpn:~$

Шаг №3: Изменяю порт в firewall-cmd:

ekzorchik@srv-vpn:~$ sudo firewall-cmd --remove-port=1195/udp --permanent
success
ekzorchik@srv-vpn:~$ sudo firewall-cmd --add-port=1195/tcp --permanent
success
ekzorchik@srv-vpn:~$ sudo firewall-cmd --add-masquerade --permanent
success
ekzorchik@srv-vpn:~$ sudo firewall-cmd --reload
success
ekzorchik@srv-vpn:~$

Шаг №4: Отправляю хост (OpenVPN-сервер) в перезагрузку:

ekzorchik@srv-vpn:~$ sudo reboot

Шаг №5: Из клиентского конфигурационного файла, сформированного при установке OpenVPN сервера, вырезаю отдельно формируемые сертификаты, которые нужно будет передать на Mikrotik и импортировать:

<ca>
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
-----END PRIVATE KEY-----
</key>
ekzorchik@srv-vpn:~$ ls ca.crt client1.{crt,key}
ca.crt  client1.crt  client1.key 

Шаг №6: Копирую клиентские сертификаты (client1.crt & client1.key) на Mikrotik любым способом, который Вам доступен. К примеру рабочей станцией подключаемся через клиент WinSCP к VPN серверу и Mikrotik:

Клиентские сертификаты скопированные на Mikrotik

[ekzorchik@MikroTik] > certificate import file-name=client1.crt 
passphrase: 
     certificates-imported: 1
     private-keys-imported: 0
            files-imported: 1
       decryption-failures: 0
  keys-with-no-certificate: 0

[ekzorchik@MikroTik] > certificate import file-name=client1.key 
passphrase: 
     certificates-imported: 0
     private-keys-imported: 1
            files-imported: 1
       decryption-failures: 0
  keys-with-no-certificate: 0

[ekzorchik@MikroTik] >

Шаг №7: Настраиваю клиентское подключение к OpenVPN серверу:

[ekzorchik@MikroTik] > interface ovpn-client add connect-to=172.33.33.117 auth=sha1 certificate=client1.crt_0 name=openvpn2 user=client1 port=1195 profile=default cipher=aes128
[ekzorchik@MikroTik] >

Настраиваю клиентское подключение к OpenVPN серверу:

Шаг №8: Проверяю, а поднялось ли соединение? Соединение установлено успешно:

[ekzorchik@MikroTik] > ip address print where interface=openvpn2 
Flags: X - disabled, I - invalid, D - dynamic 
 #   ADDRESS            NETWORK         INTERFACE                                
 0 D 10.9.0.2/24        10.9.0.0        openvpn2                                 
[ekzorchik@MikroTik] > ping address=10.9.0.1 interface=openvpn2 
  SEQ HOST                                     SIZE TTL TIME  STATUS             
    0 10.9.0.1                                   56  64 0ms  
    1 10.9.0.1                                   56  64 0ms  
    sent=2 received=2 packet-loss=0% min-rtt=0ms avg-rtt=0ms max-rtt=0ms 

Проверяю, а поднялось ли соединение? Соединение установлено успешно:

Проверяю, а вижу ли я IP-адрес Mikrotik(а):

ekzorchik@srv-vpn:~$ ping 10.10.10.100
PING 10.10.10.100 (10.10.10.100) 56(84) bytes of data.
64 bytes from 10.10.10.100: icmp_seq=1 ttl=64 time=0.383 ms
^C
--- 10.10.10.100 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.383/0.383/0.383/0.000 ms
ekzorchik@srv-vpn:~$

На заметку: если из сети за Mikrotik я не вижу OpenVPN-сервер, то

C:\windows\system32>ping 10.9.0.1
4 packets transmitted, 0 received, 100% packet loss, time 30ms

Дело в том, что на Микротике нужно создать правило masquerade:

[admin@MikroTik] > ip firewall nat add chain=srcnat out-interface=openvpn1 action=masquerade

Из после из сети за Mikrotik я вижу OpenVPN-сервер

Из после из сети за Mikrotik я вижу OpenVPN-сервер

Шаг №9: Настраиваю Firewall на Mikrotik(е):

/ip firewall filter add chain=forward action=accept connection-state=established,related log=no log-prefix="" comment="Allow Established and Related connections for forward and input chains"
/ip firewall filter add chain=input action=accept connection-state=established,related log=no log-prefix=""

/ip firewall filter add chain=forward action=drop connection-state=invalid in-interface=ether1 log=no log-prefix="" comment="Drop invalid connections for forward and input chains only from WAN interfaces:"
/ip firewall filter add chain=input action=drop connection-state=invalid in-interface=ether1 log=no log-prefix=""

/ip firewall filter add chain=input action=accept protocol=icmp in-interface=ether1 packet-size=0-128 log=no log-prefix="" comment="Allow ICMP ping from WAN only width 128 bits packets:"
/ip firewall filter add chain=input action=accept protocol=tcp in-interface=ether1 dst-port=8291 log=no log-prefix="" comment="Allow remote control by Winbox:"

/ip firewall filter add chain=input action=drop in-interface=ether1 log=no log-prefix="" comment="Drop all other connections to Mikrotik and to local network:"
/ip firewall filter add chain=forward action=drop connection-nat-state=!dstnat in-interface=ether1 log=no log-prefix=""

Шаг №10: Теперь можно на OpenVPN сервере создать правила проброс порта до рабочей системы за Mikrotik, к примеру как сделано у меня для сервиса OwnCloud, Proxmox:

ekzorchik@srv-vpn:~$ sudo firewall-cmd --add-forward-port=port=8006:proto=tcp:toport=8006:toaddr=10.10.10.102 --permanent
ekzorchik@srv-vpn:~$ firewall-cmd --reload

где 10.10.10.102 — это тестовый полигон Proxmox в локальной сети за Mikrotik CHR

Получается, что при обращении к OpenVPN:8006 у меня откроется сервис за Mikrotik(ом).

Шаг №11: У меня был выявлен такой нюанс, да OpenVPN сеть работает, если делать проброс порта, тоже работает. Но мне еще нужно чтобы, подключившись по SSH к OpenVPNсерверу я могу из консоли взаимодействовать с сетью за Mikrotik, т.е. мог использовать OpenVPN как перевалочный пункт: ping устройства, подключаться по SSH. Чтобы это стало возможным, нужно удалить direct.xml файл:

ekzorchik@srv-vpn:~$ ping 10.10.10.102
PING 10.10.10.102 (10.10.10.102) 56(84) bytes of data.
^C
--- 10.10.10.102 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms
ekzorchik@srv-vpn:~$ 

ekzorchik@srv-vpn:~$ nano /etc/firewalld/direct.xml
<?xml version="1.0" encoding="utf-8"?>
<direct>
  <rule ipv="ipv4" table="nat" chain="POSTROUTING" priority="0">-s 10.9.0.0/24 '!' -d 10.9.0.0/24 -j SNAT --to 2.57.186.62</rule>
</direct>

ekzorchik@srv-vpn:~$ rm /etc/firewalld/direct.xml
ekzorchik@srv-vpn:~$ firewall-cmd --reload
success

ekzorchik@srv-vpn:~$ ping 10.10.10.102
PING 10.10.10.102 (10.10.10.102) 56(84) bytes of data.
64 bytes from 10.10.10.102: icmp_seq=1 ttl=127 time=5.80 ms
64 bytes from 10.10.10.102: icmp_seq=2 ttl=127 time=6.13 ms
^C
--- 10.10.10.102ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 5.796/5.963/6.130/0.167 ms

ekzorchik@srv-vpn:~$ 

Шаг №12: Чтобы из сети за Mikrotik(ом) я мог выходить в интернет где WAN-IP значился бы IP OpenVPN-сервера, то на Mikrotik(е) нужно: (у меня просто два и более OpenVPN подключения от Mikrotik)

Winbox – IP&DNS:PORT – user&pass – IP – Routes – Add

  • Dst. Address: 0.0.0.0/0
  • Gateway: openvpn2
  • Routing Mark: vpn2

Winbox – IP&DNS:PORT – user&pass – IP – Firewall – вкладка Mangle – Add

  • Chain: prerouting
  • Src. Address List: vpnallowopenvpn2 (список IP адресов из сети 10.10.10.0/24)
  • Action: mark routing
  • New Routing Mark: vpn2
  • Passthrough: отмечаем галочкой

И после хост 10.10.10.102 выходит в интернет через WAN-IP OpenVPN2

Обязательно для сети 10.10.10.0/24 нужен DNS Servers

Winbox – IP&DNS:PORT – user&pass – IP – DHCP Server – вкладка Networks и для сети 10.10.10.0/24 в параметре DNS Servers указываю к примеру 8.8.8.8

После из сети 10.10.10.0/24 проверяю, что есть выход в интернет, проверив открыв сайт 2ip вижу, что мой WAN-IP – это адрес моего OpenVPN сервера.

После из сети 10.10.10.0/24 проверяю, что есть выход в интернет, проверив открыв сайт 2ip вижу, что мой WAN-IP – это адрес моего OpenVPN сервера.

Работает.

Заметка выше работоспособна. Сперва я ее обкатал на тестовом полигоне, а после перенес на боевое использование, теперь буду задействовать iRedMAIL для отдельной сети.

На этом у меня все, с уважением автор блога Олло Александр aka ekzorchik.