пятница, 29 января 2016 г.

Находим чужие DHCP-серверы в сети.

  Маршрутизаторы Mikrotik позволяют вычислить чужой, "левый", сторонний DHCP-сервер который находится в вашей сети и тем самым мешает вашим устройствам получать правильные IP-адреса. Такая ситуация может возникнуть, когда клиент, например, подсоединил свой домашний роутер не через WAN порт, а через LAN-порты, а ваша сеть не ориентированна на изоляцию клиента (VLANs, EoIP/VPLS Tunnels, Horizon Bridging/Private VLAN Edge(PVE)). Для этого в RouterOS существует настройка /ip dhcp-server alert:


  Добавляем правило, с отсылкой на выполнения скрипта script1:



  interface - интерфейс, на котором искать не легитимные DHCP-сервера;
  valid-server - список МАС-адресов ваших легитимных DHCP-серверов;
  alert-timeout - таймаут обнаружения чужих DHCP-серверов. Если параметр не заполнить (сделать не активным) - скрипт выполнится один раз при обнаружении. Это важный параметр, заполнять его нужно исходя из DHCP Lease Time вашей сети. Если у вас Lease Time стоит 12 часов, то alert-timeout можно сделать 1-2 часа. Вероятность того, что чужой сервер раздаст между этими периодами адреса минимальна. Если Lease Time то и alert-timeout нужно уменьшить. Но, если вы будете при обнаружении "левого" DHCP отправлять e-mail, то сильно уменьшенное время в alert-timeout приведет к спаму на ваше "мыло" до того момента, пока "левый" сервер не пропадет.
  unknown-server - список МАС-адресов обнаруженных неизвестных серверов DHCP. Сервер будет удален из этого списка после тайм-аута.
  on-alert - сценарий для запуска, если неизвестный сервер DHCP обнаружен;
  reset-alert - не выведен в интерфейс WinBox, доступен с командной строки. Команда /ip dhcp alert reset-alert очищает список всех найденных "левых" DHCP-серверов.

  Если DHCP Alerts не может получить dhcp-пакет, он действует как dhcp-клиент и посылает пакеты DHCP Discover раз в минуту. В on-alert можно добавлять как сам скрипт, так и ссылку на него в виде названия скрипта в /system script.
  Но наша задача при появлении "левого" DHCP-сервера отсылать уведомление на e-mail. Что-бы на "мыло" приходило не только оповещение, но и IP, интерфейс на котором найден и MAC-адрес чужого DHCP-сервера. Для этого скрипт нужно писать напрямую в окне on-alert, так как там мы будем использовать спец-переменные. Проблема в том, что оператором get данные с DHCP Alerts получить нельзя (проблема микротиковцам известна). Итак, напишем скрипт в on-alert:



  В пункте Unknown Server видно MAC-адрес "левого" сервера. Alert Timeout стоит тестовые 10 секунд, обычно это значение у меня 1 час. Интерфейс может быть как реальный, так и бридж. Значение Valid Servers заполняем нашими легитимными DHCP-серверами, так как у меня он только один (мое текущее устройство), то заполняем MAC с нашего интерфейса.



    Сам скрипт:
/tool e-mail send server=10.10.10.10 port=25 user=admin@ya.ru password=111111 start-tls=yes to="admin@ya.ru" from=admin@ya.ru subject=("DHCP Alert: Discovered unknown dhcp-server, RouterBoard identity: ".[/system identity get name]) body="MikroTik have been detected unknown dhcp-server: \n\nIP: $address \nInterface: $interface \nMAC: quot;mac-address"";
/log info "e-mail send unknown dhcp-server"
  После появления в сети чужого DHCP-сервера раз в заданное время опроса скрипт будет выполнятся, в это время будут писаться записи в терминал и лог журнал:



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



  Как видим в тему письма подтягиваются название роутера (идентификатор). А в тело - IP, интерфейс обнаружения и MAC-адрес чужого DHCP-сервера. Письма будут отсылаться через промежуток времени указанный в Alert Timeout, до того момента, пока DHCP-сервер не пропадет или вы его не найдете.

Используемые материалы:

Подписаться на новые статьи.

4 комментария:

  1. Смотри, Жень, у меня только что идея появилась..
    Обычно у роутеров в диапазоне dhcp всего 100 клиентов. Можно скриптом поднять на локальном интерфейсе в бридже 100 вланов с включенным dhcp-клиентом.. типа, микротик берет всю фигню на себя, пока ты лазишь по сети и ищешь грамотея, который включил сеть в лан-порт роутера.
    Еще можно зайти на 192.168.1.1 и зашить ту железяку намерть, если пароль дефолтный. А потом еще денег срубить за восстановление роутера )) Я в прошлом месяце так дважды делал. правда, клиенты не звонили.. наверное, в гарантию отнесли. =) Короче, кто не работает головой - работает ногами, епт.

    ОтветитьУдалить
    Ответы
    1. для того что б поднять вланы клиентский роутер тоже должен пакеты в вланы отдавать. На физ. интерфейсе можно поднять виртуальные интерфейсы, но врятли и это получится..

      Удалить
    2. ну вот я только что создал вручную три виртуальных на одном реальном. Единственное "НО" - у них у всех одинаковый мак. Выход такой: создаем каждому виртуальному интерфейсу свой бридж, на бридже пишем уникальный мак, поднимаем дхцп-клиент на каждом и вуаля - все они вейтинг =) Да, некрасиво будет в винбоксе на вкладке interface..а шо робыть? Работать должно. Теоретически. Приеду домой - попробую на практике такой изврат ))

      Удалить
  2. В первую очередь Спасибо автору за такую хорошую публикацию!
    Скрипт у меня не сразу заработал.
    Сначала из-за лишней кавычки в конце где ! mac-address""; !
    А потом не показывал MAC-адрес в письме. Решил проблему заменив часть текста ! quot;mac-address"; ! на ! $"mac-address"" !
    Возможно эти проблемы из-за версии прошивки (6.35.1) на моем микротике.

    В итоге у меня получился вот такой рабочий скрипт:
    -----------------------------------------
    /tool e-mail send from="mail@gmail.com" server=smtp.gmail.com to=mail@mail.ru subject=("DHCP Alert: Discovered unknown dhcp-server, RouterBoard identity: ".[/system identity get name]) body="MikroTik have been detected unknown dhcp-server: \n\nIP: $address \nInterface: $interface \nMAC: $"mac-address"";
    /log info "e-mail send unknown dhcp-server"

    -----------------------------------------
    Скрипт получился по короче т.к. настройки почты у меня сделаны в Tools-> Email -> Email Settings

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