Помогите доработать скрипт

Обсуждение оборудования и его настройки
Ответить
acella
Сообщения: 7
Зарегистрирован: 16 ноя 2014, 21:58

Всем привет.
Есть скрипт с хабра, который парсит кеш DNS и добавляет ip гуглосервисов в адрес лист.
Проблема в том что он работает как то не адекватно и добавляет не все записи что есть в кеше.
Создаётся 16-19 записей и всё, цикл прерывается.
Как сделать , что бы добавлялись все А записи в которых есть имя искомого домена, включая все поддомены ?

Статья из которой взят скрипт



 habrahabr.ru/post/242143/
:local DNSList {"google.com";"google.ru";"gstatic.com"}
:local ListName "googl"
:local DNSServer "192.168.2.1"
:foreach addr in $DNSList do={
:do {:resolve server=$DNSServer $addr} on-error={:log debug ("failed to resolve $addr")}
}
/ip firewall address-list remove [find where list~$ListName]
/ip dns cache all
:foreach i in=[find type="A"] do={
:local bNew true
:local cacheName [get $i name]
:local match false
:foreach addr in=$DNSList do={
:if (:typeof [:find $cacheName $addr] >= 0) do={
:set $match true
}
}
:if ( $match ) do={
:local tmpAddress [/ip dns cache get $i address]
:if ( [/ip firewall address-list find ] = "") do={
:log debug ("added entry: $[/ip dns cache get $i name] IP $tmpAddress")
/ip firewall address-list add address=$tmpAddress list=$ListName 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 ) do={
:log debug ("added entry: $[/ip dns cache get $i name] IP $tmpAddress")
/ip firewall address-list add address=$tmpAddress list=$ListName comment=$cacheName
}
}
}
}


Аватара пользователя
podarok66
Модератор
Сообщения: 4355
Зарегистрирован: 11 фев 2012, 18:49
Откуда: МО

А оно Вам надо? Нагрузка на камень в моём RB951U во время работы скрипта 100%, а работает он ну очень долго, у меня около 5 минут... Ну их на фиг, такие заморочки.


Мануалы изучил и нигде не ошибся? Фаервол отключил? Очереди погасил? Витая пара проверена? ... Тогда Netinstal'ом железку прошей и настрой ее заново. Что, все равно не фурычит? Тогда к нам. Если не подскажем, хоть посочувствуем...
acella
Сообщения: 7
Зарегистрирован: 16 ноя 2014, 21:58

Хм, а с чего бы такая нагрузка ?
Вы наверное не правильно поняли.
Записей с доменами гугла в кеше всего несколько десятков, скрипт работает доли секунды.
Да и работать он будет раз в сутки, а то и реже .

Собственно задача: получить ip доменов из "белого"списка и разрешить к ним доступ по https.
А остальное https запретить.
гугл для примера, да и у него больше всего адресов.
Список достаточно большой и использовать правила фаэра с content= не очень годное решение.


vviz
Сообщения: 75
Зарегистрирован: 09 окт 2014, 16:46

acella писал(а):Хм, а с чего бы такая нагрузка ?
Вы наверное не правильно поняли.
Записей с доменами гугла в кеше всего несколько десятков, скрипт работает доли секунды.
Да и работать он будет раз в сутки, а то и реже .

Собственно задача: получить ip доменов из "белого"списка и разрешить к ним доступ по https.
А остальное https запретить.
гугл для примера, да и у него больше всего адресов.
Список достаточно большой и использовать правила фаэра с content= не очень годное решение.


У меня отрабатывает нормально. Результатом этого скрипта будут только домены второго уровня. Откуда ему знать про имена хостов и домены третьего уровня? Что бы знать нужно их резольвить, а он резольвит, по сути, хосты отвечающие непосредственно за домены с указанным именем (google.com и т.д.). Чтобы получить всю таблицу поддоменов и хостов гугла нужно у него запросить его домен - сделать трансфер требуемой зоны, но это дело утилит DNS сервера, да и не позволит никто свою зону забрать. В твоем случае правильнее использовать вычисляемое выражение в на седьмом уровне стека TCP/IP.
ЗЫ: кэш неплохо бы зачистить перед запуском скрипта...


acella
Сообщения: 7
Зарегистрирован: 16 ноя 2014, 21:58

Строки где скрипт резольвит эти домены, для того, что бы в кеше было хоть что то.
На случай если он пуст.
В реальности там все записи на которые идут запросы от юзеров.
В том числе и третьего и четвёртого уровня.
Я сравниваю результат работы скрипта и содержимое кеша.
И вижу что скрипт создал 16 записей с доменами id.l.google.com , mobile-gtalk.l.google.com и т д
Но не тронул google.ru хотя в кеше таких записей как минимум 15 штук.
И каждый запуск скрипта приносит рандомные результаты, но количество записей всегда 16-20 штук +-
И это печально.

Если не трудно, создайте кеш запросов к гуглу - (достаточно открыть страницу поиска и чего нибудь найти )
И запустите скрипт - сколько записей он создаст ?

ЗЫ: кэш неплохо бы зачистить перед запуском скрипта...

Зачем, чего же он парсить будет , кроме того что нарезольвит ))


acella
Сообщения: 7
Зарегистрирован: 16 ноя 2014, 21:58

Чудеса.
Запустил этот скрипт на другом микротике - совсем другое дело.
С пустым кешем на первом микротике создаётся только 16 записей , а на втором , при тех же условиях 50 записей.

Попробую завтра сбросить у него конфиг


vviz
Сообщения: 75
Зарегистрирован: 09 окт 2014, 16:46

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

Код: Выделить всё

:set cacheIP [:resolve gmail.com]
:set cacheIP [:resolve google.ru]
:set cacheIP [:resolve translate.google.com]
:set cacheIP [:resolve mail.ru]

можно удалить - он для теста

 скрипт
:local DNSList {"google.com";"google.ru";"gstatic.com"}
:local ListName1 "googl"
:local ListName3 "tmp"
:local cacheName
:local cacheIP
:local bNew
:local IP3
:local IP1
:local Comment

:log info "---------------------------------------------------------------------------"
/ip firewall address-list remove [find where list~$ListName1]
/ip firewall address-list remove [find where list~$ListName3]

:set cacheName google.com
:set cacheIP [:resolve $cacheName]
/ip firewall address-list add address=$cacheIP list=$ListName1 comment=$cacheName

:set cacheIP [:resolve gmail.com]
:set cacheIP [:resolve google.ru]
:set cacheIP [:resolve translate.google.com]
:set cacheIP [:resolve mail.ru]

/ip dns cache all

:foreach i in=[find type="A"] do={
:set cacheName [/ip dns cache get $i name]
:set cacheIP [/ip dns cache get $i address]
:log info "1 add to list $ListName3 : $cacheName - $cacheIP"
/ip firewall address-list add address=$cacheIP list=$ListName3 comment=$cacheName
}

:foreach j in=[/ip firewall address-list find where list~$ListName3] do={

:set IP3 [/ip firewall address-list get $j address]
:set Comment [/ip firewall address-list get $j comment]
:log info "2 $IP3 $Comment"

:foreach addr in=$DNSList do={

:if (:typeof [:find $Comment $addr] >= 0) do={

:set bNew true
:log info "3 $Comment $addr"

:foreach i in=[/ip firewall address-list find where list~$ListName1] do={
:set IP1 [/ip firewall address-list get $i address]

:if ( $IP1 = $IP3 ) do={
:set bNew false
}
}
:if ( $bNew ) do={
:log info "7 add $IP3 in $ListName1 comment $Comment"
/ip firewall address-list add address=$IP3 list=$ListName1 comment=$Comment
}
}
}
}
/ip firewall address-list remove [find where list~$ListName3]


acella
Сообщения: 7
Зарегистрирован: 16 ноя 2014, 21:58

Обновил ОС до тестовой v23rc1 - работает.
Хотя бы 30 записей выбирает, что похоже на истину.
Вернул обратно на v22 - 18 записей и амба.
Какой то глюк у отдельно взятой железки :du_ma_et:


Ответить