Настройка 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; </user_password></upfile></upfile> |
Файл паролей имеет вид
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 |