Создание домашней сети на базе устройств MikroTik: Часть 4 – Создание OpenVPN туннеля

В данной статье мы создадим защищенный туннельный интерфейс на базе OpenVPN.
Почему OpenVPN спросите Вы, ведь есть же PPTP, L2TP.
Отвечаю: я тестировал соединения на базе этих двух протоколов. К сожалению они не показали достаточно стабильного соединения между собой. Происходили частые падения туннельных интерфейсов.
Возможно, это было связано с какой-то прошивкой. Но это не столь важно. Важно то, что настроив один раз туннель на OpenVPN, я забыл про разрывы связи совсем и до сих пор все работает отлично.

Прежде чем настраивать OpenVPN сервер и создавать туннель, разберемся с тем, как он работает на Mikrotik. Т.к. на RouterOS v6 есть ограничения.
Обратимся к официальному источнику – Wiki Mikrotik(Eng) и Manual Interface(Eng).
В OpenVPN используются два типа интерфейса:
tun – в RoS он определяется, как ip, это туннельный уровень.
tap – в RoS он определяется, как ethernet, это канальный уровень.
Только начиная с прошивки 6.39.x была добавлена топология subnet для tun режима.
Выдержка из Changelog:
*) ovpn – added support for “push-continuation”;
*) ovpn – added support for topology subnet for IP mode;
*) ovpn – fixed duplicate default gateway presence when receiving extra routes;
*) ovpn – improved performance when receiving too many options;

Не поддерживается в 6 версии операционной системы:
UDP протокол, т.е. необходимо использовать исключительно TCP!
LZO сжатие
TLS аутентификация
Аутентификация без имени пользователя и пароля
Если Вы будете читать эту статью, и уже будет доступна 7 версия RouterOS, то в ней, все это, уже должно работать (но это не точно)!

К сожалению, сложно сказать, почему Mikrotik пришли именно к такому решению и именно таким ограничениям, но мы имеем то, что имеем.
По ТСР, сервер в типичном случае будет получать ТСР-сегменты OpenVPN, которые содержат другие ТСР-сегменты от клиента. В результате в цепи получается двойная проверка на целостность информации, что совершенно не имеет смысла, т.к. надежность не повышается, а скорости соединения и пинга снижаются.
UDP конечно предпочтительней, но его нет…

OpenVPN предлагает пользователю несколько видов аутентификации.
Предустановленный ключ — самый простой метод.
Сертификатная аутентификация — наиболее гибкий в настройках метод.
С помощью логина и пароля — может использоваться без создания клиентского сертификата (серверный сертификат всё равно нужен).

Мы будем использовать Сертификатную аутентификацию для обеспечения хорошей защищенности нашего соединения.

Для создания туннеля, нам понадобятся сертификаты и ключи к ним. Данные сертификаты можно создать, как на Windows, Linux, так и на самом роутере.
Я сторонник создания сертификатов на своем ПК, чтобы они были у меня в файлах и я мог их достать в случаях “А вдруг что”.

  1. Создание сертификатов для OpenVPN соединения

Я буду создавать сертификаты на операционной системе Windows, для всех остальных ОС принцип похож. Можно загуглить.
Для начала необходимо скачать и установить дистрибутив OpenVPN: Страница Загрузок OpenVPN
Запускаем установщик openvpn-install
Если Вы не собираетесь использовать все возможности туннелирования на своей Windows машине и Вам нужно исключительно создать сертификаты, то можно снять галки с пунктов TAP Virtual Ethernet Adapter и OpenVPN GUI.

Выбираем нужные пункты

пунктыПосле скачивания и установки в указанную Вами папку в ней будет список файлов. у меня это папка C:\Program Files\OpenVPN\
Нам необходимо перейти в папку easy-rsa
Нужно открыть консоль Windows (для Windows Vista/7/8/8.1/10 нужно запускать от Администратора)
Переходим в папку easy-rsa по пути установки командой cd
Например:
cd C:\Program Files\OpenVPN\easy-rsa

Запускаем файл init-config.bat
C:\Program Files\OpenVPN\easy-rsa>init-config.bat
C:\Program Files\OpenVPN\easy-rsa>copy vars.bat.sample vars.bat
Скопировано файлов: 1.

В папке появится файл vars.bat, открываем его текстовым редактором, нас интересуют строчки в самом конце, их нужно заполнить
Я подставил свои параметры, у Вас данные параметры будут другие:
set KEY_COUNTRY=RU
set KEY_PROVINCE=Moscow
set KEY_CITY=Moscow
set KEY_ORG=HOME
set KEY_EMAIL=my@email.ru
set KEY_CN=server
set KEY_NAME=server
set KEY_OU=HOME
set PKCS11_MODULE_PATH=server
set PKCS11_PIN=12345
Там где написано server, не трогаем. Сохраняем файл.

Далее открываем редактором файл openssl-1.0.0.cnf
Находим строчку default_days 365 и заменяем число 365 на 3650 или свое. Тем самым мы увеличим время жизни наших сертификатов на 10 лет.
Сохраняем и закрываем.

Дополнительно:
Если Вы тот еще параноик, то Вы можете отредактировать еще один параметр:
set KEY_SIZE=1024
Для пущей сложности данный параметр можно изменить на 2048 и на 4096(для современных версий OpenVPN)
Но будьте готовы к долгому ожиданию(на слабых ПК очень долгому), пока сгенерируется ключ.

Пишем в консоль команды
vars
clean-all

В ответ должно прийти
Скопировано файлов: 1.
Скопировано файлов: 1.

Создаем ключ Диффи-Хеллмана
build-dh
Вывод из консоли:
C:\Program Files\OpenVPN\easy-rsa>build-dh
WARNING: can’t open config file: /etc/ssl/openssl.cnf
Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
……….+………

Известные проблемы:
При подаче команды clean-all или build-dh в самом начале генерации сертификатов, может проявится одна ошибка, выглядит она так:
C:\Users\TEST>build-dh
“openssl” не является внутренней или внешней
командой, исполняемой программой или пакетным файлом.
Бороться с этим необходимо следующим образом. Нужно указать путь до файла openssl.exe в файле vars.bat в ручную.
А точнее стираем слово rem в строке (rem – это комментирование строки):
rem set “PATH=%PATH%;C:\Program Files\OpenVPN\bin”
Получаем:
set “PATH=%PATH%;C:\Program Files\OpenVPN\bin”
Сохраняем файл и производим весь процесс сначала
vars
clean-all
build….. и т.д

Создаем основной сертификат
build-ca

При генерации основного сертификата в консоли будут отображаться вопросы. Просто нажимаем Enter, т.к. все эти параметры мы ввели в файле vars.bat
Нажимаем Enter до тех пор, пока не отобразиться строка приглашения
C:\Program Files\OpenVPN\easy-rsa

Далее создаем сертификат сервера и его ключ:
build-key-server server

На вопросы так же нажимаем Enter, но не торопимся, в самом конце будет задано два вопроса
Sign the certificate?
1 out of 1 certificate requests certified, commit?

На оба эти вопроса отвечаем Y
Вывод из консоли:
Certificate is to be certified until Oct 16 07:03:55 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Теперь создаем сертификат и ключ клиента:
build-key client

Также не торопимся с ответами, как только увидим строку “Common Name (eg, your name or your server’s hostname)” нужно ответить client
В самом конце также будут два вопроса, отвечаем также Y
Причем: для каждого клиента, нужно будет создать отдельные ключи и называть их по разному, например client1client2 или как-то иначе, все зависит от Вашего воображения. Также не забывайте вводить эти имена при запросе Common Name
Вывод из консоли:
C:\Program Files\OpenVPN\easy-rsa>build-key client
WARNING: can’t open config file: /etc/ssl/openssl.cnf
Generating a 1024 bit RSA private key
…………++++++
…………………………………………………………………..++++++
writing new private key to ‘keys\client.key’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [RU]:
State or Province Name (full name) [Moscow]:
Locality Name (eg, city) [Moscow]:
Organization Name (eg, company) [Home]:
Organizational Unit Name (eg, section) [Home]:
Common Name (eg, your name or your server’s hostname) [server]:client
Name [server]:client
Email Address [my@email.ru]:
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
WARNING: can’t open config file: /etc/ssl/openssl.cnf
Using configuration from openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName :PRINTABLE:’RU’
stateOrProvinceName :PRINTABLE:’Moscow’
localityName :PRINTABLE:’Moscow’
organizationName :PRINTABLE:’Home’
organizationalUnitName:PRINTABLE:’Home’
commonName :PRINTABLE:’client’
name :PRINTABLE:’client’
emailAddress :IA5STRING:’my@email.ru’
Certificate is to be certified until Oct 16 07:16:56 2027 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated

Пример создания клиентских сертификатов:
build-key client1
build-key office1

На этом создание файлов сертификатов и ключей завершено.
Все файлы будут лежать в папке C:\Program Files\OpenVPN\easy-rsa\keys\

Примерно такой список файлов должен получиться у Вас

2. Настройка OpenVPN сервера и интерфейса туннеля на hAP ac

Переходим к созданию туннеля на роутере hAP ac

Необходимо загрузить сертификаты сервера, ключ сервера и основной сертификат в роутер. Файлы:

ca.crt

server.crt

server.key

Открываем раздел Files и переносим туда наши файлы (или используем FTP).

Загруженные файлы сертификатов и ключа

Теперь нам необходимо импортировать данные сертификаты в RouterOS, чтобы она могла ими оперировать.

Меню сертификатов

Импортируем наши сертификаты и ключи

Выбираем нужные сертификаты и ключ и импортируем их

Консольно:

/certificate import file-name=ca.crt passphrase=””
/certificate import file-name=server.crt passphrase=””
/certificate import file-name=server.key passphrase=””

Займемся настройкой OpenVPN, переходим в меню PPP

Меню PPP

Добавляем новый профиль для нашего туннеля

Нам необходимо выделить IP адреса, которые мы будем использовать для туннельных интерфейсов.
Я выбрал подсеть 172.16.10.0/24 соответственно сервер будет иметь адрес 172.16.10.1, а клиенты далее по маске. 2,3,4 и т.д.

Заполняем необходимые параметры профиля

Заполняем оставшиеся параметры профиля

Консольно:

/ppp profile add name=ovpn-server local-address=172.16.10.1 change-tcp-mss=yes use-upnp=no use-mpls=yes use-compression=no use-encryption=yes only-one=default

Добавляем авторизационные данные для каждого клиента, который будет подключаться к OpenVPN серверу.

Открываем вкладку с записями данных авторизации

Т.к. у сервера IP 172.16.10.1 выдаем клиенту IP 172.16.10.2

Добавляем нашего клиента

Консольно:

/ppp secret add name=client password=123456789 service=ovpn profile=ovpn-server remote-address=172.16.10.2

Теперь нужно включить саму службу OpenVPN

Нажимаем кнопку для отображения параметров сервера

Выполняем настройки сервера

Консольно:

/interface ovpn-server server set enabled=yes port=1194 mode=ip netmask=24 default-profile=ovpn-server certificate=server.crt_0 require-client-certificate=yes auth=sha1,md5 cipher=blowfish128, aes128, aes192, aes256

В принципе этих настроек достаточно, но я предпочитаю наблюдать за интерфейсом, для этого мы можем зафиксировать интерфейс за конкретным клиентом. Сделаем привязку.

Биндим интерфейс

Достаточно ввести имя клиента из PPP Secret и имя самого интерфейса

Консольно:

/interface ovpn-server add name=ovpn-inclient user=client

Может показаться, что мы все уже настроили, но это не совсем так. Остался последний штрих. Необходимо разрешить прохождение запросов на OpenVPN сервер через Firewall.
Для этого переходим в меню межсетевого экрана

Переходим в меню Firewall

Добавляем новую запись

Разрешаем входящий трафик на порту 1194 с интерфейса WAN

Само разрешение

Консольно:

/ip firewall filter add chain=input protocol=tcp dst-port=1194 in-interface=WAN action=accept comment=”Accept OpenVPN Requests”

На этом настройка OpenVPN на роутере hAP ac завершена, переходим к роутеру hEX.

3. Настройка OpenVPN клиента и интерфейса туннеля на hEX

На данном роутере нам необходимо проделать гораздо меньше операций для запуска клиента.

Помним, что создали сертификат клиента! Загружаем его в роутер и импортируем по аналогии с hAP ac.

Загружаем и импортируем ключ клиента

Консольно:

/certificate import file-name=client.crt passphrase=””

/certificate import file-name=client.key passphrase=””

Создаем профиль для OpenVPN в меню PPP

Добавляем новый профиль

Консольно:

/ppp profile add name=ovpn-client change-tcp-mss=yes use-upnp=no use-mpls=yes use-compression=no use-encryption-yes

Добавляем интерфейс OpenVPN для подключения к OpenVPN серверу.

Как мы помним из первой части цикла статей, внешний IP адрес у нас 98.76.54.32

Добавляем интерфейс клиента OpenVPN

Задаем имя интерфейса

Заполняем параметры для подключения к серверу OpenVPN

Консольно:

/interface ovpn-client add name=ovpn-outclient connect-to=98.76.54.32 port=1194 mode=ip user=client password=123456789 profile=ovpn-client certificate=client.crt_0 auth=md5 cipher=blowfish128

Шифрование Вы можете выбрать любое, которое установили доступным для сервера. После создания интерфейса туннель должен уже быть активен. В списке IP адресов Вы должны увидеть IP 172.16.10.2, полученный от OpenVPN сервера.

Также в статусе можно увидеть, с какими параметрами подключен интерфейс.

Признаки активного соединения

Вот мы и закончили создание OpenVPN туннеля между двумя роутерами hAP ac и hEX.

Аналогами данного решения может послужить вариант PPTP туннеля. А шифрование можно организовать в самом EoIP посредством IPsec.

В следующей статье мы создадим интерфейсы, которые свяжут два наших роутера в единый сетевой мост для прохождения сетевого трафика, заблокируем прохождение DHCP  запросов между роутерами, чтоби их DHCP сервера не мешали друг другу.

 

Источник оригинальной статьи:

https://gregory-gost.ru/