DHCP разные пулы для разных MAC

Тема в разделе "Общий форум", создана пользователем Welk, 7 ноя 2017.

  1. Welk

    Welk Новый участник

    Доброго всем дня!
    Возник интересный вопрос, можно ли на микротике отфильтровать как-то устройства по мак-адресам при выдаче IP адреса в DHCP. Ну либо хотя бы добавить их в один Address List тоже по маку. Обьясню зачем это: чтобы узнавать по маку тип устройства и добавлять его в свой адрес лист со своими правилами. Например, у нас на микрософтовском DHCP это реализовано политиками: если мак совпадает с маской или со списком маков, то адрес выдается из определенной подсети. Таким образом, все IP-телефоны у нас получают адреса из 15 подсети, а также все свои настройки шлюза, tftp, ntp и т.д. И если воткнуть в сеть новый IP-телефон Ealink, например, для которых прописана маска маков, он автоматом получит свой 15-й адрес. Не нужно ничего резервировать вручную.
    1.jpg
     
  2. таких встроенных возможностей нет, но в теории реализовать можно скриптами....
     
  3. Welk

    Welk Новый участник

    предполагал что скриптами, подтолкните в нужном направлении ... фильтрацию по макам нашел только в фильтрах бриджа, но там можно только запретить или разрешить маки как я понял
     
  4. ну смотрите в опция dhcp сервера есть возможность исполнять скрипт при назначении аренды. Далее пишем скрипт который будет искать эту новую аренду, смотреть его MAC и сравнивать с "базой данных" MAC и назначать ему нужные параметры в зависимости от MAC. Только это не тривиальная задачка. Если сделаете поделитесь )?
     
  5. Welk

    Welk Новый участник

    Спасибо за толчок в нужном направлении, уже кое-что набросал, погуглив вечером. Выделить отдельный пул совсем нетривиальная задача, а вот добавить в адрес-лист уже нашел как можно. А для правил файервола этого достаточно вполне.
    Вопрос по скрипту: можно как-то в скрипт добавлять переменные из внешнего файла?
    Вот, скажем, тут мы выбираем маки, начинающиеся на 00

    :if ($macaddress~"00:*") do={

    можно подставить вместо значения строчку из файла, ну точнее, добавить цикл и добавлять строчки из файла по-одной?
    Таким образом можно создать файл со списком маков или масок маков и сравнивая с ними добавлять в адрес-лист адреса.
    Вообще, посоветуйте ресурс где разжеван скриптовый язык микротика попонятнее чем на вики.
     
  6. Это язык LUA, ищите описание по нему.

    "Вопрос по скрипту: можно как-то в скрипт добавлять переменные из внешнего файла?" Так сразу не подскажу, вот пример утилтки /tool fetch она забирает все китайские айпишники с сервиса www.iwik.org и записывает в файл CN.
    Может чем поможет.

    /tool fetch url=http://www.iwik.org/ipcountry/mikrotik/CN
    /import file-name=CN
     
  7. Welk

    Welk Новый участник

    Спасибо, сам себе отвечу по языку скриптов, вот ссылка на первоисточник, там все довольно понятно https://www.mikrotik.com/testdocs/ros/2.9/system/scripting.php
    Скрипт, добавляющий по маске маков в адрес лист уже получился, осталось запихнуть маки списком в файл и парсить его, как доделаю, отпишусь.
     
    Мышаня и Денис Друженков нравится это.
  8. Dmitry_S

    Dmitry_S Участник

    Странная реализация... Разные подсети надо располагать в разных VLANах. инче у вас все устройства находятся в одном широковещательном домене, что не очень хорошо для производительности и безопасности сети
     
  9. Welk

    Welk Новый участник

    Деление на VLANы было отвергнуто по принципиальным соображениям, да и я эти решения у нас в компании не принимаю.
    Есть мелкие офисы - они в отдельных VLANах сидят, а основные офисы в одном широковещательном домене, SIP телефонию отделяли, но постепенно она туда же сползается :)
    Но это оффтопик.
    По теме: скрипт я все-таки написал. Надо было кассы андроидные по отдельному правилу в интернет пускать.
    Началось с простой конструкции:

    foreach i in=[/ip dhcp-server lease find] do={
    :local macaddress [/ip dhcp-server lease get $i mac-address]

    :if ($macaddress~"9C:28:40:*") do={
    :local ipaddr [/ip dhcp-server lease get $i address]
    /ip firewall address-list add address=$ipaddr list=Kassa_ timeout=600
    }
    }

    На таймаут можно не смотреть, это для тестов. Скрипт можно запихнуть в DHCP в момент выдачи аренды. Но было интересно сделать парсинг файла. Этот скрипт для запуска в шедулере, для DHCP его можно сильно упростить.
    Код:
    # Script from Welk for getting mac-addresses from file MAC.txt and adding devices with this MAC in address list
    # File name must begin from "MAC" and finish to "txt"
    # recordings of mac-adresses in file can recognise regular expressions,
    # last string must be empty, codepage must be UTF-8 without BOM
    :local filemac [/file find name~"MAC*.*txt"]
    :local EndString 0;
    :local line "";
    :local StartString 0;
    :local content [/file get $filemac contents]
    :local contlen [:len $content]
    :local Quant 0 ;
    :log warning "Script for add MAC address to address list started!" ;
    /ip firewall address-list remove [find list=Mac_Filtered]
    :do {
        :set EndString [:find $content "\r\n" $StartString ] ;
        :set line [:pick $content $StartString $EndString] ;
        :local lenline [:len $line]
        :if ($lenline > 0) do={
            :foreach i in=[/ip dhcp-server lease find] do={
                :local macaddress [/ip dhcp-server lease get $i mac-address]
                    :if ($macaddress~$line) do={
                    :set Quant ( $Quant + 1 ) ;
                    :local ipaddr [/ip dhcp-server lease get $i address]
                    /ip firewall address-list add address=$ipaddr list=Mac_Filtered timeout=120 ;
                    }
                }
            }
        :set StartString ( $EndString + 2 ) ;
        } while ( $StartString < ($contlen-2) ) ;
    :log warning "Script for add MAC address to address list finished!" ;
    :log warning "Added in Access List IP addresses:"
    :log warning $Quant ;
    
     
    Мышаня и Денис Друженков нравится это.