Задача: Связать через 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.
Шаг №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:
[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] >
Шаг №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
-сервер
Шаг №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
сервера.
Работает.
Заметка выше работоспособна. Сперва я ее обкатал на тестовом полигоне, а после перенес на боевое использование, теперь буду задействовать iRedMAIL
для отдельной сети.
На этом у меня все, с уважением автор блога Олло Александр aka ekzorchik.