Настройка Mikrotik в качестве Wi-Fi клиента и организация туннеля OpenVPN

Постановка задачи: Необходимо подключить роутер к Wi-Fi сети в качестве клиента, при этом роутер должен выполнять все свои функции — работать как точка доступа Wi-Fi и обеспечивать подключение кабельных клиентов. Так же необходимо обеспечить подключение к удаленному серверу OpenVPN.

В качестве роутера был выбран Mirkotik hAP lite (RB941-2nD-TC). В прошивке 6.35 RouterOS появился функционал Wi-Fi repeater, который позволит подключиться к существующей сети и одновременно работать как точка доступа Wi-Fi.

Для получения данного функционала необходимо установить дополнительный пакет wireless-rep.

Первичная настройка WDS на Mirkotik

/interface wireless setup-repeater number=wlan1 ssid=Wi-Fi-SSID passphrase=passphrase

После этой команды произойдет следующее:

  • Сброс настроек мастер-интерфейса (wlan1)
  • Удалятся виртуальные интерфейсы, привязанные к этому мастер-интерфейсу из всех возможных bridges
  • Удалятся все виртуальные интерфейсы данного мастер-интерфейса
  • Создастся Security profile «interfacename-ssid-repeater», если такой профиль уже существует, то обновляются настройки существующего
  • Настройка мастер-интерфейса. Режим работы выбирается следующим образом: если точка доступа к которой происходит подключение поддерживает режим работы bridge (это режим работы роутеров mikrotik) — устанавливается station-bridge, если точка доступа поддерживает WDS — используется station-wds, в иных случаях используется station-pseudobridge
  • Создает интерфейс Virtual AP с таким же SSID и Security profile как и мастер
    Если мастер-интерфейс не состоит ни в каком bridge, создает новый bridge и добавляет в него мастер-интерфейс и интерфейс virtual AP

После выполнения команды необходимо отредактировать конфигурацию под свои нужды.
Создаем Security profile для локальной сети Wi-Fi и подключаем его к виртуальному интерфейсу wlan2

/interface wireless
add authentication-types=wpa2-psk eap-methods="" group-ciphers=tkip,aes-ccm management-protection=allowed mode=dynamic-keys name=Local-Wi-Fi supplicant-identity="" unicast-ciphers=tkip,aes-ccm wpa2-pre-shared-key=local-passphrase
add disabled=no master-interface=wlan1 mode=ap-bridge name=wlan2 security-profile=Local-Wi-Fi ssid=SSID-Local-Wi-Fi

Затем переносим интерфейс wlan2 в bridge к физическим LAN портам и удаляем bridge с wlan1.

Добавляем правила маскарадинга для интерфейса wlan1 или меняем существующее (если оно есть)

add action=masquerade chain=srcnat comment="masquerade" log-prefix="" out-interface=wlan

На этом базовая настройка роутера закончена.

Следующий этап настройка VPN.
К сожалению реализация клиента OpenVPN для Mikrotik имеет несколько недостатков:

  • Работает только по протоколу TCP
  • Не поддерживает компрессию LZO
  • Требует обязательной авторизации через логин/пароль

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

Файл конфигурации для UPD клиентов с поддержкой компрессии

local x.x.x.x
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
dh dh1024.pem
key server.key
tls-auth ta.key 0
server 10.10.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
client-to-client
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log

Файл конфигурации для подключения Mikrotik

local x.x.x.x
port 1194
proto tcp
dev tun
ca ca.crt
cert server.crt
dh dh1024.pem
key server.key
server 10.11.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
client-to-client
keepalive 10 120
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log
verb 3
auth-user-pass-verify /etc/openvpn/user_verify.pl via-file
username-as-common-name
script-security

Скрипт авторизации пользователя

#!/usr/bin/perl
 
use strict;
use warnings;
use Digest::MD5  qw(md5 md5_hex md5_base64);
 
my $password_file = '/etc/openvpn/users';
my $ARG = undef;
if ( $ARG = shift @ARGV ) {
    if ( !open( UPFILE, "<$ARG" ) ) {
        print "Could not open username/password file: $ARG\n";
        exit 1;
    }
}
else {
    print "No username/password file specified \n";
    exit 1;
}
 
my $username = <UPFILE>;
my $password = <UPFILE>;
 
if ( !$username || !$password ) {
    print "Username/password not found: $ARG\n";
    exit 1;
}
 
chomp $username;
chomp $password;
 
close(UPFILE);
 
if ( !open( USER_PASSWORD, "<$password_file" ) ) {
    print "Could not open username/password db file: $ARG\n";
    exit 1;
}
foreach my $line (<USER_PASSWORD>) {
    chomp($line);
    my ( $read_user, $read_password ) = split(/:/, $line);
    if ( $read_user eq $username ) {
        my $hex_password = md5_hex $password;
        if ( $hex_password eq $read_password) {
            close(USER_PASSWORD);
            exit 0;
        }
        exit 1;
    }
}
 
close(USER_PASSWORD);
 
exit 1;

Файл паролей имеет вид

uservpn1:7c6a180b36896a0a8c02787eeafb0e4c
uservpn2:6cb75f652a9b52798eb6cf2201057c7

Для генерации хеша паролей используется следующая команда:

echo -n 'password1' | md5sum
7c6a180b36896a0a8c02787eeafb0e4c  -

Для Debian 7 достаточно создать создать второй файл конфигурации OpenVPN и перезапустить сервис. После этого появятся два интерфейса TUN — один для UDP подключений, второй для TCP.

Если OpenVPN сервер не настроен, создаем сертификаты сервера

cd /usr/share/doc/openvpn/examples/easy-rsa/2.0/
source ./vars
./clean-all
./build-ca
./build-key-server server
openvpn --genkey --secret ta.key

Копируем следующие файлы в /etc/openvpn
ca.crt
dh1024.pem
server.crt
server.key
ta.key

Теперь необходимо создать сертификаты для подключения Mikrotik.

./build-key-pkcs12 mikrotik

Загружаем файлы ca.crt, mikrotik.crt, mikrotik.key в mirotik и делаем импорт

/certificate import file-name=ca.crt
passphrase: 
     certificates-imported: 1
     private-keys-imported: 0
            files-imported: 1
       decryption-failures: 0
  keys-with-no-certificate: 0
 
/certificate import file-name=mirotik.crt
passphrase: 
     certificates-imported: 1
     private-keys-imported: 0
            files-imported: 1
       decryption-failures: 0
  keys-with-no-certificate: 0
 
/certificate import file-name=mikrotik.key
passphrase: 
     certificates-imported: 0
     private-keys-imported: 1
            files-imported: 1
       decryption-failures: 0
  keys-with-no-certificate: 0

Создаем интерфейс ovpn-client с указанием импортированного сертификата и связки логин/пароль

/interface ovpn-client
add certificate=mikrotik.crt_0 connect-to=x.x.x.x name=openvpn-int password=password1 user=uservpn1

Для того чтобы весь трафик проходил через VPN правила маршрутизации и маскарадинга.

/ip firewall nat
add action=masquerade chain=srcnat log-prefix="" out-interface=openvpn-int
/ip firewall address-list
add address=192.168.x.0/24 list=LocalAddress
/ip firewall mangle
add action=mark-routing chain=prerouting dst-address=!x.x.x.x dst-address-list=!LocalAddress log-prefix="" new-routing-mark=VPN passthrough=yes src-address=192.168.x.0/24
/ip route
add distance=1 gateway=openvpn-int routing-mark=VPN

Комментарии запрещены.