воскресенье, 27 сентября 2015 г.

Mikrotik RouterOS. Создаем OpenVPN сервер для подключения клиентов Windows и Android.

Сегодня мы рассмотрим довольно изъезженную тему про поднятие OpenVPN сервера на Mikrotik. Но в отличие от множества мануалов, которые можно найти в сети мы будем настраивать именно TUN (в терминологии Mikrotik - IP), а не TAP (Ethernet) сервер, причем таким образом, чтобы к нему могли подключаться как Windows клиенты, так и клиенты на Android. Большинство мануалов в сети, например, этот предполагают поднятие OpenVPN сервера в Mode: Ethernet. Однако при таком варианте настройки Windows клиенты будут подключаться к нему без проблем, а вот при попытке подключения с Android ничего не получится, т.к. два распространенные клиента под Android - OpenVPN Connect и OpenVPN for Android не умеют работать с TAP-интерфейсом.

Вообщем, наша цель - создать такой сервер, чтобы мы без проблем коннектились к нему и из под Windows, и из под Android и не испытывали при этом никаких проблем. Предполагается что вы уже знакомы с генерацией сертификатов для OpenVPN-сервера и можете сгенерировать их либо в самом Mikrotik'е, либо с использованием OpenSSL. Последний вариант, кстати, хорошо расписан в этой статье. Поэтому здесь мы подробно не будем останавливаться на этом.

Настраиваем OpenVPN следующим образом:


Стандартный для OpenVPN TCP порт 1194 мы изменили на 8888, также не забываем что нам нужно разрешить на него входящие подключения в firewall'е. В mode выставляем ip, что соответствует tun интерфейсу, а в netmask - ставим 30. Как все это будет работать - вы поймете чуть позже. 

В openvpn-profile мы ничего не настраиваем, т.е. Local Address и Remote Address оставляем пустыми. Вместо этого мы будем назначать адреса вручную в PPP -> Secrets для каждого клиента в отдельности. Предположим что у нас их два, один - смартфон на Android (android01), второй - клиент на Windows (правда назвал я его зачем-то android02):


Теперь давайте разберемся ... у нас используется tun интерфейс, при этом должна использоваться маска подсети /30 (почему так - описывать здесь не буду, почитайте мануалы по OpenVPN) ... Что же такое маска /30 (255.255.255.252), чтобы было нагляднее - давайте я приведу вам пример нескольких подсетей с такой маской, включая адреса хостов:

Сеть 1:
Сеть: 172.16.0.0/30
Кол-во хостов: 4
Базовый адрес сети: 172.16.0.0
Широковещательный адрес сети: 172.16.0.3
Первый адрес хоста: 172.16.0.1
Последний адрес хоста: 172.16.0.2
Маска сети: 255.255.255.252

Сеть 2:
Сеть:172.16.0.4/30
Кол-во хостов:4
Базовый адрес сети:172.16.0.4
Широковещательный адрес сети:172.16.0.7
Первый адрес хоста:172.16.0.5
Последний адрес хоста:172.16.0.6
Маска сети:255.255.255.252


Т.о. мы получаем что при использовании tun-адаптера local и remote address должны быть из одной подсети /30, так, для клиента android01 мы прописали local address 172.16.0.1, а remote address 172.16.0.2, для android02 - 172.16.0.5 и 172.16.0.6 соответственно. Теперь напишем клиентский конфиг:

client
dev tun
proto tcp
remote openvpn-server-ip 8888
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert android01.crt
key android01.key
verb 3
pull
auth-user-pass auth.cfg
redirect-gateway def1
dhcp-option DNS 8.8.8.8
dhcp-option DNS 8.8.4.4
tls-cipher TLS-RSA-WITH-AES-256-CBC-SHA

Обратите внимание, здесь в auth-user-pass задается имя файла с логином и паролем auth.cfg (файл состоит из двух строк, на первой логин, на второй пароль), redirect-gateway def1 - нужна для переопределения основного шлюза, т.е. чтобы при подключении к OpenVPN-серверу весь траффик шел через него, и последняя строка tls-cipher задает используемый тип шифрования. Без нее мы получим проблему с TLS failed при соединении, которая подробно описана вот здесь (вообще на форуме Mikrotik'a очень много тем про ошибку TLS при подключении, но решения так нигде и не приведено, по-крайней мере сходу оно не находится, причем как утверждают там же на ранних версиях RouterOS все работало, а вот после обновления версии прошивки почему-то перестало).

Проверяем подключение в OpenVPN Connect и OpenVPN for Android:


Как видно, все работает. Под Windows, с использованием OpenVPN 2.3.8 x86_64-w64-mingw32 все также отлично подключается:



9 комментариев :

  1. А в какой версии routeros это проверялось? В 6.32.2 по данному методу не удалось подружить android и микрот.

    ОтветитьУдалить
    Ответы
    1. RouterOS 6.27. А что именно не получилось?

      Удалить
    2. Проблема была с ключем пользователя. Пересоздал - все заработало. Спасибо за статью)

      Удалить
  2. а если не использовать сертификаты клиента?

    ОтветитьУдалить
    Ответы
    1. А смысл в этом? Т.е. в чем сложности создать клиентские сертификаты?

      Удалить
  3. А есть ли возможность назначать конкретные ip пользователям с конкретными сертификатами? Чтобы дальше была возможность фаерволом доступ граничить: простым смертным - только на определенный хост, админу - везде? На linuxовом шлюзе у меня это делается профилями в /etc/openvpn/ccd через ifconfig-push

    ОтветитьУдалить
  4. IP можно из пула выдавать, а пользователям присваивать разные профайлы, в которых определять AddressList и доступы в файрволе прописывать по AddresList'ам

    ОтветитьУдалить
  5. Ребята, я три дня сопрягал андройды и винды. Задолбался. Настроил по инструкции с этого сайта, только маску сделал 27 и выдачу адресов из пула. И всё работает. Спасибо, низкий поклон.

    ОтветитьУдалить
  6. Низкий поклон, друзья.
    tls-cipher TLS-RSA-WITH-AES-256-CBC-SHA
    Вот эта строчка помогла.

    ОтветитьУдалить