Задание №6. Mikrotik

Устанавливаем соединение с Mikrotik

Немного теории про шлюз и туннель

Используем маршрутизатор Mikrotik LTAP Mini LTE Kit

В маршрутизаторе установлена СИМ-карта для доступа маршрутизатора в сеть Инертнет. Через сеть Интернет связь с помощью туннеля OpenVPN организована связь до виртуального маршрутизатора OPNsense, который обеспечивает связь маршрутизатора Mikrotik с вашим виртуальным сервером.

Схема:

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

IP маршрутизатора: 192.168.111.2

Сделаем Ping до маршрутизатора:

ping 192.168.111.2

Если в ответе увидим

64 bytes from 192.168.111.2: icmp_seq=1 ttl=64 time=0.072 ms

то связь с маршрутизатором есть.

Если ответов не будет, значит связи с маршрутизатором нет.

Прервём выполнение команды ping нажатием Ctrl+C

Для удаленного доступа на маршрутизатор используем программу ssh:

ssh –l user1 192.168.111.2 interface wireless registration-table print

Important: В строке выше -l это латинская строчная маленькая L, а не -1 (минус единица)

Эта команда задаёт имя пользователя = user1 и передает маршрутизатору команду получения списка пользователей WiFi:

interface wireless registration-table print

Введем пароль: mikrotik

Получим таблицу MAC-адресов пользователей WiFi с уровнями сигналов.:

Подключим свой мобильный телефон к wifi на этом маршрутизаторе:

SSID: Mikrotik, пароль: mikrotik

И снова запустим\ команду. Список пользователей должен измениться.

Пишем скрипт получения данных с Mikrotik

Будем использовать библиотеку librouteros. Эту библиотеку нужно установить: Обновляем список пакетов:

sudo apt update

Проверяем наличие пакета:

apt list | grep python3-librouteros

Устанавливаем библиотеку

sudo apt install python3-librouteros

Ещё раз проверяем наличие пакета.

Для подключения библиотеки к нашему скрипту в начале скрипта Python напишем:

from librouteros import connect

Описываем соединение:

api = connect(host='192.168.111.2',username='user1',password='mikrotik')

Выполняем команду на маршрутизаторе:

wifiuser=api.path('interface’, ‘wireless’, ‘registration-table’)

Затем в цикле for проходим по всем полученным записям и отображаем их на экране.

В конце скрипта закрываем соединение с роутером.

Скрипт:

from librouteros import connect
api = connect(host='192.168.111.2',username='user1',password='mikrotik')
wifiuser=api.path('interface’, ‘wireless’, ‘registration-table’)
for item in wifiuser:
     print (item, “\n”)
api.close()

Получаем массив данных о пользователях Wifi сети Mikrotik на нашем роутере.

Элементы массива разделены на наименование элемента и значение элемента, разделенные знаком «:». Например, первый элемент массива — это номер строки '.id’: '*1'.

Второй элемент массива — это интерфейс ‘interface’: ‘wlan1’

Нас интересует третий элемент массива. Для его отображения в команде print напишем:

print (item[‘mac-address’], “\n”)

Запустите скрипт.

Теперь вместо всех параметров нам будут отображаться только MAC-адреса пользователей WiFi сети.

Добавим второй параметр – уровень сигнала, отделим его от MAC-адреса разделителем « - »:

print (item[‘mac-address’], “ - ”, item[‘signal-strength-ch1’],  “\n”)

Запустите скрипт. Вы получили список MAC-адресов пользователей сети WiFi и их уровни сигналов.

Записываем полученные данные в БД SQL

В предыдущих заданиях мы в базе данных pythondb создали таблицу registrations со столбцами mac и signal. Запишем полученные с роутера значения в эту таблицу.

Добавляем в начало скрипта команды работы с SQL:

import sqlite3
con = sqlite3.connect('/home/bsk23-01-student-1/python/pythondb')
cur = con.cursor()

Затем внутри цикла сформируем строку вставки данных в таблицу SQL:

insert = “INSERT INTO registrations (mac, signal) VALUES (‘” + item[‘mac-address’] + “’,’” + str(item[‘signal-strength-ch1’]) + “’)”

Для проверки выведем получившуюся команду на экран:

print(insert)

Выполним скрипт, проверим правильно ли сформирована команда вставки данных. Вставка данных в таблицу SQL выполняется командами:

cur.execute(insert)
con.commit()

В конце скрипта добавим:

cur.close()

Выполним скрипт и проверим наличие данных в таблице SQL:

sqlite3 pythondb
select * from registrations

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

DELETE FROM registrations

Напишем в скрипте перед циклом:

cur.execute(“DELETE FROM registrations”)
con.commit()

Итоговый скрипт

from librouteros import connect
import sqlite3
con = sqlite3.connect('/home/bsk23-01-student-1/python/pythondb')
cur = con.cursor()
api = connect(host='192.168.111.2',username='user1',password='mikrotik')
wifiuser=api.path('interface’, ‘wireless’, ‘registration-table’)
cur.execute(“DELETE FROM registrations”)
con.commit()
for item in wifiuser:
	insert = “INSERT INTO registrations (mac, signal) VALUES (‘” + item[‘mac-address’] + “’,’” + str(item[‘signal-strength-ch1’]) + “’)”
	cur.execute(insert)
	con.commit()
api.close()

При выполнении, скрипт не выводит никакой информации на экран. Скрипт считывает с маршрутизатора список MAC-адресов активных WiFi пользователей и записывает этот список в базу данных в таблицу registrations.

Теперь у нас в таблице registrations базы данных есть список MAC-адресов активных пользователей WiFi, но в таблице users для пользователей указаны не корректные MAC-адреса (столбец mac).

Для того, чтобы запрос (который вы делали в самостоятельной работе) показывал список активных пользователей необходимо, чтобы в таблице users были пользователи с правильными MAC-адресами.

Зайдите в sqlite3 (в команде укажите правильный путь к вашей базе данных):

sqlite3 pythondb

Добавьте записи пользователей к правильными MAC-адресами, которые у вас попали в таблицу registrations (вместо mac3, mac1 и mac5 укажите нужные MAC-адреса):

INSERT INTO registrations (mac, signal) VALUES ('mac3', '-72'), ('mac1','-85'), ('mac5','-69');

Проверьте, что у вас в таблице users добавились записи:

SELECT * FROM users;

Если всё сделано корректно то теперь наш сайт показывает данные об активных пользователях сети WiFi Написанный вами на самостоятельной работе скрипт отображает список пользователей WiFi сети из базы данных.

Данные в базе данных обновляются скриптом написанным выше.

Запуск скрипта автоматически по расписанию в Linux

Xxx

Можно сделать чтение списка пользователей и его отображение без записи в БД SQL. Может возникнуть проблема с одновременным доступом на маршрутизатор