OpenVPN на Mikrotik через USB модем
[flickr:id=45934223265]
Тестовый стенд
Задача
Необходимо настроить просмотр камеры видеонаблюдения на даче, где интернет только через мобильного оператора связи. Так же я не хочу использовать P2P, считаю что это небезопасно, хочу настроить VPN туннель и заходить по ссылке.
Из оборудования несколько IP камер видеонаблюдения, роутер Mikrotik, usb модем билайн, виртуальный хостинг.
Схема включения последовательно выглядит так. Питание камер по POE, через свитч, инжектор или от 12В не имеет значения.
- Камера 1...N
- Роутер Mikrotik OpenVPN клиент
- USB модем Beeline (серый IP)
- Сервер VPS со статическим IP адресом (OpenVPN сервер)
Перед покупкой Mikrotik я протестировал схему с использованием OpenWRT на TP-Link, приведу пример. Но скорее всего вы будете долго мучаться с подключением через USB модем. Но схема тоже рабочая.
Схема представлена на рисунке
[flickr:id=39882920023]
Между сервером и роутером OpenVPN туннель.
Настройка OpenVPN сервера для работы с mikrotik
Установка OpenVPN сервера
sudo apt-get install openvpn easy-rsa
Создание сертификатов на сервере
Создаем директорию
make-cadir ~/openvpn-ca
cd ~/openvpn-ca
Отредактируем переменные по-умолчанию
nano vars
# Don't leave any of these fields blank.
export KEY_COUNTRY="RU"
export KEY_PROVINCE="SPB"
export KEY_CITY="Saint-Petersburg"
export KEY_ORG="Orbit"
export KEY_EMAIL="alex@sinyawskiy.ru"
export KEY_OU="Survielance"
# X509 Subject Field
export KEY_NAME="SinyawskiyRSA"
Загрузим окружение и создадим основной сертификат удостоверяющего центра (Certificate authority)
source vars
./clean-all
./build-ca
Создаем ключ Диффи-Хеллмана
./build-key-server SinyawskiyRSA
./build-dh
Создаем сертификат и ключ для каждого клиента (можно и один ключ)
./build-key client1
./build-key client2
Далее копируем сертификаты в папку с конфигурацией сервера
cd keys/
cp ca.crt /etc/openvpn/
cp SinyawskiyRSA.crt /etc/openvpn/
cp SinyawskiyRSA.key /etc/openvpn/
cp dh2048.pem /etc/openvpn/
Копируем сертификаты клиентов
client1.crt
client1.key
client2.crt
client2.key
Выдача статических адресов клиентам и маршрутов
nano /etc/openvpn/server.conf
port 1194
proto tcp
dev tun
ca ca.crt
cert SinyawskiyRSA.crt
key SinyawskiyRSA.key
dh dh2048.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
client-config-dir ccd
route 192.168.88.0 255.255.255.0
route 192.168.77.0 255.255.255.0
keepalive 10 120
key-direction 0
cipher AES-128-CBC
auth SHA1
user openvpn
group openvpn
persist-key
persist-tun
status openvpn-status.log
verb 3
username-as-common-name
client-cert-not-required
plugin /usr/lib/openvpn/openvpn-plugin-auth-pam.so login
Создадим папку для клиентских конфигов
mkdir -P /etc/openvpn/ccd
Конфигурация client1
nano /etc/openvpn/ccd/client1
Указан маршрут в 192.168.1.0/24 сеть
ifconfig-push 10.8.0.5 10.8.0.6
iroute 192.168.1.0 255.255.255.0
push "route 10.8.0.0 255.255.255.0"
Конфигурация client2
nano /etc/openvpn/ccd/client2
Указан маршрут в 192.168.77.0/24 сеть
ifconfig-push 10.8.0.9 10.8.0.10
iroute 192.168.77.0 255.255.255.0
push "route 10.8.0.0 255.255.255.0"
OpenVPN выдает адреса из таблицы. Первый выделяемый, второй адрес шлюза
[ 1, 2] [ 5, 6] [ 9, 10] [ 13, 14] [ 17, 18]
[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]
[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]
[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]
[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]
[101,102] [105,106] [109,110] [113,114] [117,118]
[121,122] [125,126] [129,130] [133,134] [137,138]
[141,142] [145,146] [149,150] [153,154] [157,158]
[161,162] [165,166] [169,170] [173,174] [177,178]
[181,182] [185,186] [189,190] [193,194] [197,198]
[201,202] [205,206] [209,210] [213,214] [217,218]
[221,222] [225,226] [229,230] [233,234] [237,238]
[241,242] [245,246] [249,250] [253,254]
Проверка сервера
openvpn --config /etc/openvpn/server.conf --mode server
Добавим пользователя под которым будем логиниться из openvpn клиента
Создаем пользователя без директории
useradd -M client1
useradd -M client2
Зададим пароли
passwd client1
passwd client2
Загрузка сертификатов на mikrotik
Загружаем через webfig
Files -> Upload -> Обзор
Выбираем client1.crt client1.key
[flickr:id=46848782631]
Далее сертификаты надо импортировать в сертификаты
System -> Certificates -> Import
[flickr:id=46796545162]
Импортируем по очереди client1.crt и client.key, пока в таблице напротив client1 не появится KT
[flickr:id=46848782711]
После этого нужно удалить их и вкладки Files.
Настройка OpenVPN клиента на mikrotik
Заходим на роутер через webfig
PPP -> Add New -> OVPN Client
Заполняем поля все как на картинке:
[flickr:id=45934074115]
Проверяем на сервере
tail -f /var/log/syslog
Jan 23 13:44:34 ovpn-server[21903]: 10.100.10.155:39806 TLS: Username/Password authentication succeeded for username 'client1' [CN SET]
Jan 23 13:44:34 ovpn-server[21903]: 10.100.10.155:39806 WARNING: 'keydir' is present in local config but missing in remote config, local='keydir 1'
Jan 23 13:44:34 ovpn-server[21903]: 10.100.10.155:39806 Data Channel Encrypt: Cipher 'AES-128-CBC' initialized with 128 bit key
Jan 23 13:44:34 ovpn-server[21903]: 10.100.10.155:39806 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Jan 23 13:44:34 ovpn-server[21903]: 10.100.10.155:39806 Data Channel Decrypt: Cipher 'AES-128-CBC' initialized with 128 bit key
Jan 23 13:44:34 ovpn-server[21903]: 10.100.10.155:39806 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Jan 23 13:44:34 ovpn-server[21903]: 10.100.10.155:39806 Control Channel: TLSv1.2, cipher TLSv1/SSLv3 DHE-RSA-AES256-GCM-SHA384
Jan 23 13:44:34 ovpn-server[21903]: 10.100.10.155:39806 [client1] Peer Connection Initiated with [AF_INET]10.100.10.155:39806
Jan 23 13:44:34 ovpn-server[21903]: client1/10.100.10.155:39806 OPTIONS IMPORT: reading client specific options from: ccd/client1
Jan 23 13:44:34 ovpn-server[21903]: client1/10.100.10.155:39806 MULTI: Learn: 10.8.0.5 -> client1/10.100.10.155:39806
Jan 23 13:44:34 ovpn-server[21903]: client1/10.100.10.155:39806 MULTI: primary virtual IP for client1/10.100.10.155:39806: 10.8.0.5
Jan 23 13:44:34 ovpn-server[21903]: client1/10.100.10.155:39806 MULTI: internal route 192.168.88.0/24 -> client1/10.100.10.155:39806
Jan 23 13:44:34 ovpn-server[21903]: client1/10.100.10.155:39806 MULTI: Learn: 192.168.88.0/24 -> client1/10.100.10.155:39806
Jan 23 13:44:34 ovpn-server[21903]: client1/10.100.10.155:39806 PUSH: Received control message: 'PUSH_REQUEST'
Jan 23 13:44:34 ovpn-server[21903]: client1/10.100.10.155:39806 send_push_reply(): safe_cap=940
Jan 23 13:44:34 ovpn-server[21903]: client1/10.100.10.155:39806 SENT CONTROL [client1]: 'PUSH_REPLY,route 10.8.0.1,topology net30,ping 10,ping-restart 120,route 10.8.0.0 255.255.255.0,ifconfig 10.8.0.5 10.8.0.6' (status=1)
Jan 23 13:45:01 CRON[18071]: (root) CMD (command -v debian-sa1 > /dev/null && debian-sa1 1 1)
Настройка NAT на сервере
Для того, чтобы камера работала, необходимо прокинуть port камеры 554 (rtsp) обязательно протокол tcp и udp.
iptables -t nat -A PREROUTING -i ens18 -p tcp --dport 5542 -j DNAT --to-destination 192.168.88.12:554
iptables -t nat -A PREROUTING -i ens18 -p udp --dport 5542 -j DNAT --to-destination 192.168.88.12:554
iptables -t nat -A PREROUTING -i ens18 -p tcp --dport 5541 -j DNAT --to-destination 192.168.88.11:554
iptables -t nat -A PREROUTING -i ens18 -p udp --dport 5541 -j DNAT --to-destination 192.168.88.11:554
iptables -t nat -A POSTROUTING -j MASQUERADE
Для вывода списка правил nat используется команда
iptables -t nat -L
Для удаления всех правил nat используется команда
iptables -t nat -F
Далее необходимо сохранить правила
iptables-save > /etc/iptables.rules
Применять их при запуске
nano /etc/network/if-pre-up.d/iptables
#!/bin/sh
iptables-restore < /etc/iptables.rules
exit 0
nano /etc/network/if-post-down.d/iptables
#!/bin/sh
iptables-save -c > /etc/iptables.rules
if [ -f /etc/iptables.rules ]; then
iptables-restore < /etc/iptables.rules
fi
exit 0
Проверка через FFmpeg
ffmpeg -i rtsp://admin:admin123@10.8.1.5:554/Streaming/Channels/2 1.mpeg
Включение нескольких инстансов VLC
Для просмотра потоков нескольких камер на одном экране
Инструменты -> Настройки
Снять галочки:
- Разрешить только одну копию
- Ограничиться одной копией при запуске из менеджера
[flickr:id=39883645673]
P.S.: Статья посвещается любимой конюшне в Сестрорецке.