Информация
Настройка
Новости
Контакты
Новинка
Распродажа
Оплата
Доставка
Загрузки
  • Прошивки
    • WinBox
    • RouterOS
    • Мобильные приложения MikroTik
    • Архив
  • Changelogs
  • RouterOS
  • Мобильные приложения MikroTik
  • Архив
Форум
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
    info@mikrotik.moscow
    +7 495 320-55-52
    Заказать звонок
    Mikrotik.moscow
    Каталог
    • Акции
      Акции
    • Маршрутизаторы
      Маршрутизаторы
    • Коммутаторы
      Коммутаторы
    • Радиомосты и уличные точки доступа
      Радиомосты и уличные точки доступа
    • Wi-Fi для дома и офиса
      Wi-Fi для дома и офиса
    • LTE/5G
      LTE/5G
    • Powerline адаптеры
      Powerline адаптеры
    • IoT устройства
      IoT устройства
    • Оборудование 60 ГГц
      Оборудование 60 ГГц
    • Материнские платы RouterBOARD
      Материнские платы RouterBOARD
    • Корпуса
      Корпуса
    • Интерфейсы
      Интерфейсы
    • SFP/QSFP трансиверы
      SFP/QSFP трансиверы
    • Аксессуары
      Аксессуары
    • Антенны
      Антенны
    • Архив
      Архив
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Скачать WinBox Скачать Прошивки Форум > RouterOS Форум > SwOS Форум > Железо
    Mikrotik.moscow
    Каталог
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Mikrotik.moscow
    Телефоны
    +7 495 320-55-52
    Заказать звонок
    0
    0
    0
    Mikrotik.moscow
    • +7 495 320-55-52
      • Назад
      • Телефоны
      • +7 495 320-55-52
      • Заказать звонок
    • info@mikrotik.moscow
    • г. Москва, ул. Бакунинская, 84
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной


    • Кабинет
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    RouterOS
    Помогите со скриптом для DNS-запросов и списков адресов.

    Помогите со скриптом для DNS-запросов и списков адресов.

    Форумы: RouterOS, Аппаратное обеспечение, SwOS, Обратная связь, Объявления, Сторонние инструменты
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Помогите со скриптом для DNS-запросов и списков адресов., RouterOS
     
    dany
    Guest
    #1
    0
    12.01.2014 11:14:00
    Я использую скрипт с http://adminsline.wordpress.com/2012/08/03/mikrotik-youtube/ чтобы создавать список адресов серверов YouTube из DNS-кэша, чтобы потом делать перенаправления. Хочу использовать тот же скрипт, чтобы получить IP-адреса других видеохостингов, типа vimeo.com, imdb.com и так далее. Для серверов YouTube я получаю A-записи в DNS-кэше, а для Vimeo или IMDB – CNAME-записи, и вышеуказанный скрипт их не умеет разрешать. Есть другой скрипт на Mikrotik Wiki: http://wiki.mikrotik.com/wiki/Sync_Address_List_from_DNS_Lookup_Results_-_CNAME_and_A_Records, который тоже работает с CNAME-записями, но он не подходит для моей ситуации (первый скрипт в строке поиска берет часть имени сервера, например “googlevideo”, “vimeocdn” и т.д.). К сожалению, я не очень хорошо разбираюсь в скриптах и не могу понять, как включить часть для разрешения CNAME из второго скрипта в первый. Кто-нибудь делал что-то подобное и готов помочь? Буду очень благодарен.
     
     
     
    efaden
    Guest
    #2
    0
    12.01.2014 11:24:00
    Посмотрю сценарии, как только вернусь к компьютеру. Отправлено с моего SCH-I545 через Tapatalk.
     
     
     
    dany
    Guest
    #3
    0
    12.01.2014 11:28:00
    Большое спасибо!
     
     
     
    efaden
    Guest
    #4
    0
    12.01.2014 13:54:00
    Слить два скрипта было бы не так уж и сложно, но сейчас у меня нет времени этим заниматься. Скорее всего, понадобится как минимум неделя-две, прежде чем я смогу этим заняться, у меня сейчас семейные дела, которые занимают почти всё моё время. Думаю, на это уйдёт около двух часов.
     
     
     
    dany
    Guest
    #5
    0
    12.01.2014 15:38:00
    Я пробовал объединить, но не получилось. Это не срочно, так что если получится сделать это где-то через две недели, когда у тебя будет свободное время, это было бы здорово. С наилучшими пожеланиями!
     
     
     
    efaden
    Guest
    #6
    0
    12.01.2014 16:02:00
    Занесу в список дел, когда будет время. Если нужно сделать быстрее, могу “посоветоваться” по этому поводу… если тебе это интересно, просто напиши мне на почту.
     
     
     
    efaden
    Guest
    #7
    0
    12.01.2014 17:11:00
    Можешь, пожалуйста, расскажи мне, ЧТО именно тебе нужно, чтобы скрипт делал? Просто нужен скрипт с CNAME, который работает с частичными именами?
     
     
     
    dany
    Guest
    #8
    0
    12.01.2014 19:29:00
    Вот точный скрипт, который я сейчас запускаю на роутере:
    :foreach i in=[/ip dns cache find] do={
       :local bNew "true";
       :local cacheName [/ip dns cache all get $i name] ;
    #    :put $cacheName;

       :if (([:find $cacheName "youtube"] != 0) || ([:find $cacheName "googlevideo"] != 0)) do={

           :local tmpAddress [/ip dns cache get $i address] ;
    #   :put $tmpAddress;

    # if address list is empty do not check
           :if ( [/ip firewall address-list find ] = "") do={
               :log info ("added entry: $[/ip dns cache get $i name] IP $tmpAddress");
               /ip firewall address-list add address=$tmpAddress list=VC-YouTube comment=$cacheName;
           } else={
               :foreach j in=[/ip firewall address-list find ] do={
                   :if ( [/ip firewall address-list get $j address] = $tmpAddress ) do={
                       :set bNew "false";
                   }
               }
               :if ( $bNew = "true" ) do={
                   :log info ("added entry: $[/ip dns cache get $i name] IP $tmpAddress");
                   /ip firewall address-list add address=$tmpAddress list=VC-YouTube comment=$cacheName;
               }
           }
       }
    } Он проходит по DNS кэшу в поисках серверов, в названии которых есть слова «youtube» или «googlevideo», а затем добавляет IP-адрес сервера в список адресов с именем VC-YouTube. Если изменить его, чтобы он искал серверы, в названии которых есть «vimeocdn», он найдет, скажем, server10.vimeocdn.com (я это придумал), но поле Type в DNS кэше будет CNAME, а поле Data будет чем-то вроде a1806.dwskn.akamai.net. Чтобы добавить это в список адресов, мне нужно, чтобы a1806.dwskn.akamai.net был дополнительно разрешен до числового IP-адреса. Второй скрипт, упомянутый в моем первом посте, может это сделать, но я не могу передать ему частичное имя сервера и позволить ему найти все серверы, в названии которых есть ключевое слово, поэтому он непригоден для моего случая. Думаю, это может быть интересно и другим, поскольку позволяет осуществлять некоторую продвинутую динамическую переадресацию или маршрутизацию сайтов, которые могут потреблять много пропускной способности. Как я уже говорил, спешки нет, поэтому когда у вас будет свободное время, было бы неплохо, если бы это было сделано и применено к большему количеству сайтов… С уважением!
     
     
     
    efaden
    Guest
    #9
    0
    13.01.2014 16:07:00
    :local myServers { “google” }
    :local myListName “myList”
    :local myTimeout “00:01:00”
    /ip dns cache all {
       :foreach i in=$myServers do={
           :foreach j in=[find where (name~$i)] do={
               :local myName [get $j name]
               :local myType [get $j type]
               :local myData [get $j data]
               :if ($myType = "A") do={
                   :do {
                       /ip firewall address-list add address=$myData list=$myListName comment="DNSCACHE-$i-$myName" timeout=$myTimeout
                   } on-error={
                       :put "DNSCACHE: Error on $myName $myData $myType"
                   }
               }

               :if ($myType = "CNAME") do={
                   :local currentName $j
                   :local nextName [find where (name=$myData && type="CNAME")]

                   :while ($nextName != "") do={
                       :set currentName $nextName
                       :set nextName [find where (name=[get $nextName data] && type="CNAME")]
                   }

                   :resolve [get $currentName data]

                   :foreach k in=[find where (name=[get $currentName data] && type="A")] do={
                       :set myData [get $k data]
                       :do {
                           /ip firewall address-list add address=$myData list=$myListName comment="DNSCACHE-$i-$myName" timeout=$myTimeout
                       } on-error={
                           :put "DNSCACHE: Error on $myName $myData $myType"
                       }
                   }
               }
           }
       }
    }
     
     
     
    dany
    Guest
    #10
    0
    13.01.2014 19:26:00
    Огромное спасибо, Efaden!!! Скрипт работает просто идеально. Пришлось убрать вот эту часть, потому что она выдавала ошибку, но это совсем не уменьшает его полезности! timeout=$myTimeout
        } on-error={
           :put "DNSCACHE: Error on $myName $myData $myType"
        }
     
     
     
    efaden
    Guest
    #11
    0
    13.01.2014 19:29:00
    Ошибка будет работать только на 6.5 (кажется) и выше. На самом деле я бы посоветовал обновиться, а потом использовать это утверждение. Иначе скрипт упадет из-за дубликатов. Если хочешь, чтобы я сделал его работающим с дубликатами и без `on-error`, дай знать… могу немного переработать… И тайм-аут тоже только на новых версиях. По-моему, 6.7 и выше. Сейчас скрипт не очищает список… так что у тебя возникнут проблемы, если ты удалишь его и запустишь на более старой версии. Если хочешь, чтобы я сделал его работающим на более старой ROS, скажи, какая версия тебе нужна, и я подгоню. -Eric
     
     
     
    dany
    Guest
    #12
    0
    13.01.2014 19:36:00
    Ах, понятно… Я пробовал это на роутере с версией 6.3. Не хочу тебя больше беспокоить, просто обновлю ОС до более свежей версии. Спасибо еще раз!
     
     
     
    efaden
    Guest
    #13
    0
    13.01.2014 20:23:00
    Как хочешь… мне недолго будет это переделать.
     
     
     
    efaden
    Guest
    #14
    0
    13.01.2014 20:32:00
    Не тестировалось… но что-то вроде этого.
    :local myServers { “google” }
    :local myListName “myList”
    /ip firewall address-list {
    remove [find list=$myListName]
    }
    /ip dns cache all {
    :foreach i in=$myServers do={
    :foreach j in=[find where (name~$i)] do={
    :local myName [get $j name]
    :local myType [get $j type]
    :local myData [get $j data]
    :if ($myType = "A") do={
    :local inList false
    :foreach k in=[find where (address=$myData && list=$myListName)] {
    :set inList true
    }
    :if (!inList) do={
    /ip firewall address-list add address=$myData list=$myListName comment="DNSCACHE-$i-$myName"
    }
    }
    :if ($myType = "CNAME") do={
    :local currentName $j
    :local nextName [find where (name=$myData && type="CNAME")]
    :while ($nextName != "") do={
    :set currentName $nextName
    :set nextName [find where (name=[get $nextName data] && type="CNAME")]
    }
    :resolve [get $currentName data]
    :foreach k in=[find where (name=[get $currentName data] && type="A")] do={
    :set myData [get $k data]
    :local inList false
    :foreach l in=[find where (address=$myData && list=$myListName)] do={
    :set inList true
    }
    :if (!inList) do={
    /ip firewall address-list add address=$myData list=$myListName comment="DNSCACHE-$i-$myName"
    }
    }
    }
    }
    }
    }
     
     
     
    dany
    Guest
    #15
    0
    14.01.2014 19:46:00
    Спасибо за изменённую версию. Я пока обновил ОС до версии 6.7, и теперь оригинальный скрипт работает без каких-либо изменений. Однако, когда я запускаю его во второй раз (вскоре после первого запуска), он выдаёт ошибку. Посмотрите, пожалуйста:

    DNSCACHE: Ошибка на r4---sn-nvm-cxbe.googlevideo.com 193.105.163.207 CNAME
    DNSCACHE: Ошибка на r1---sn-nvm-cxbe.googlevideo.com 193.105.163.204 CNAME
    DNSCACHE: Ошибка на r1.sn-nvm-cxbe.googlevideo.com 193.105.163.204 A
    DNSCACHE: Ошибка на r8---sn-c0q7lne7.googlevideo.com 74.125.108.173 CNAME
    DNSCACHE: Ошибка на r8.sn-c0q7lne7.googlevideo.com 74.125.108.173 A
    DNSCACHE: Ошибка на r8.sn-c0q7lner.googlevideo.com 173.194.1.237 A
    DNSCACHE: Ошибка на r11.sn-c0q7ln7y.googlevideo.com 74.125.108.144 A
    DNSCACHE: Ошибка на r4.sn-nvm-cxbe.googlevideo.com 193.105.163.207 A
    DNSCACHE: Ошибка на r3.sn-nvm-cxbe.googlevideo.com 193.105.163.206 A
    DNSCACHE: Ошибка на r10.sn-c0q7lnee.googlevideo.com 74.125.108.207 A
    DNSCACHE: Ошибка на r10.sn-c0q7lney.googlevideo.com 173.194.2.143 A
    DNSCACHE: Ошибка на r11.sn-c0q7lnez.googlevideo.com 173.194.1.48 A
    DNSCACHE: Ошибка на r2.sn-nvm-cxbe.googlevideo.com 193.105.163.205 A
    DNSCACHE: Ошибка на r5.sn-c0q7lnek.googlevideo.com 173.194.1.202 A
    DNSCACHE: Ошибка на r5.sn-c0q7lnez.googlevideo.com 173.194.1.42 A
    DNSCACHE: Ошибка на r7.sn-c0q7lney.googlevideo.com 173.194.2.140 A
    DNSCACHE: Ошибка на r5.sn-c0q7lney.googlevideo.com 173.194.2.138 A
    DNSCACHE: Ошибка на r19.sn-c0q7lnek.googlevideo.com 173.194.1.216 A
    DNSCACHE: Ошибка на r9.sn-c0q7lne6.googlevideo.com 173.194.1.142 A
    DNSCACHE: Ошибка на r13.sn-c0q7lnee.googlevideo.com 74.125.108.210 A
    DNSCACHE: Ошибка на r18.sn-c0q7lnez.googlevideo.com 173.194.1.55 A
    interrupted
              no such item (4) Я понимаю, что эти DNSCACHE: Ошибки возникают потому, что адрес уже есть в списке адресов, и это нормально, я так думаю? Но я не понимаю, почему происходит прерывание и какого элемента не хватает. Запись, отработавшая своё в DNS-кэше??
     
     
     
    efaden
    Guest
    #16
    0
    14.01.2014 19:52:00
    Хм. Это моя версия. Придется разобраться и добавить механизм, чтобы это отлавливать. Отправлено с моего SCH-I545 через Tapatalk
     
     
     
    efaden
    Guest
    #17
    0
    15.01.2014 00:25:00
    Попробуй это… Я добавил ":resolve" посередине, чтобы убедиться, что записи валидны, когда я их перебираю… также добавил что-то, чтобы обнаруживать, если запись исчезла во время перебора, и просто игнорировать эту запись… Я не тестировал это… дай знать.

    :local myServers { "google" }
    :local myListName "myList"
    :local myTimeout "00:01:00"
    /ip dns cache all {
       :foreach i in=$myServers do={
           :foreach j in=[find where (name~$i)] do={
               :local exists false
               :do {
                   :local myName [get $j name]
                   :local myType [get $j type]
                   :local myData [get $j data]
                   :set exists true
               } on-error={
                   :put "DNSCACHE: Missing Entry"
               }
               :if ($exists && $myType = "A") do={
                   :do {
                       /ip firewall address-list add address=$myData list=$myListName comment="DNSCACHE-$i-$myName" timeout=$myTimeout
                   } on-error={
                       :put "DNSCACHE: Error on $myName $myData $myType"
                   }
               }

               :if ($exists && $myType = "CNAME") do={
                   :local currentName $j
                   :local nextName [find where (name=$myData && type="CNAME")]

                   :while ($nextName != "") do={
                       :set currentName $nextName
                       :resolve $currentName
                       :set nextName [find where (name=[get $nextName data] && type="CNAME")]
                   }

                   :resolve [get $currentName data]

                   :foreach k in=[find where (name=[get $currentName data] && type="A")] do={
                       :set myData [get $k data]
                       :do {
                           /ip firewall address-list add address=$myData list=$myListName comment="DNSCACHE-$i-$myName" timeout=$myTimeout
                       } on-error={
                           :put "DNSCACHE: Error on $myName $myData $myType"
                       }
                   }
               }
           }
       }
    }
     
     
     
    dany
    Guest
    #18
    0
    15.01.2014 09:22:00
    Выдает мне такую ошибку: ожидается имя переменной (строка 39, столбец 26).
     
     
     
    efaden
    Guest
    #19
    0
    15.01.2014 13:35:00
    Ой, ну я и накосячил… Проблема со Scope… :local myServers { “google” } :local myListName “myList” :local myTimeout “00:01:00” /ip dns cache all { :foreach i in=$myServers do={ :foreach j in=[find where (name~$i)] do={ :do { :local myName [get $j name] :local myType [get $j type] :local myData [get $j data] :if ($myType = "A") do={
                   :do {
                       /ip firewall address-list add address=$myData list=$myListName comment="DNSCACHE-$i-$myName" timeout=$myTimeout
                   } on-error={
                       :put "DNSCACHE: Error on $myName $myData $myType"
                   }
               }

               :if ($myType = "CNAME") do={
                   :local currentName $j
                   :local nextName [find where (name=$myData && type="CNAME")]

                   :while ($nextName != "") do={
                       :set currentName $nextName
                       :resolve $currentName
                       :set nextName [find where (name=[get $nextName data] && type="CNAME")]
                   }

                   :resolve [get $currentName data]

                   :foreach k in=[find where (name=[get $currentName data] && type="A")] do={
                       :set myData [get $k data]
                       :do {
                           /ip firewall address-list add address=$myData list=$myListName comment="DNSCACHE-$i-$myName" timeout=$myTimeout
                       } on-error={
                           :put "DNSCACHE: Error on $myName $myData $myType"
                       }
                   }
               }
           } on-error={
               :put "DNSCACHE: Missing Entry"
           }
       }
    }
     
     
     
    dany
    Guest
    #20
    0
    15.01.2014 14:26:00
    В этот раз все прошло без проблем. Даже когда я запускаю его второй раз сразу после первого, он не прерывается и доходит до конца. Забавно, что при первом запуске появилось 30 ошибок “DNSCACHE: Error”, и именно столько записей оно добавило в список адресов. Но, учтите, что эти IP-адреса у меня уже были, но в другом списке (собирались старым скриптом, который я использовал до вашего), так что это может быть причиной такого поведения. В любом случае, все адреса на месте, несмотря на ошибки “DNSCACHE: Error”. Большое спасибо за ваши усилия!
     
     
     
    Страницы: 1
    Читают тему
    +7 495 320-55-52
    info@mikrotik.moscow
    Электрозаводская, Бауманская
    Москва, ул. Бакунинская, 84с21
    Конфиденциальность Оферта
    © 2025 «Mikrotik.Moscow»
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры