alibek Posted January 10, 2017 · Report post Оглавление Набор sh-скриптов для получения и парсинга реестра. Версия от 2016-12-30 Получение списков из дампа, версия от 2017-05-16 Версия от 2018-04-23 Загрузчик реестра на Perl. Версия 2017-01-16 Извлечение из XML-выгрузки списка IP-адресов, доменов и URL. Версия от 2017-01-15 Конвертор реестра в HTML. Версия от 2017-01-16 Мониторинг клиентских DNS-запросов на ресурсы из реестра. Версия от 2017-01-13 Заглушка и песочника на время профилактики системы блокировки. Версия от 2017-05-17 Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted January 10, 2017 · Report post Набор sh-скриптом для получения и парсинга реестра. Версия от 2016-12-30. Скрипт при каждом запуске генерирует и подписывает XML-запрос, для работы скрипта нужен приватный ключ. Чтобы использовать один заранее подписанный запрос, скрипт нужно немного доработать (закомментировать генерацию и подписывание запроса). Архив распаковать в /srv/erdi. Если используется другой путь, нужно подправить константы в файле lib-config.inc. Файл readme немного устаревший, но содержит инструкцию по сборке OpenSSL с поддержкой шифрования ГОСТ. Для работы скрипта нужны утилиты/пакеты: sed, curl, xmlstarlet. Скрипт можно добавить в cron, он сам формирует запрос и повторяет обращение к сервису, пока не скачает дамп. Содержание: custom/ Формирование кастомных списков для СКАТ (текстовые файлы-заглушки и скрипт). data/ Сюда складываются подробные протоколы работы скрипта: логи, XML-запросы с отсоединенной подписью, запросы, ответы, дампы. Данные группируются по дате и времени запуска (подкаталог на каждый запуск). dump/ Сюда складываются полученные дампы (дубликаты исключаются) и diff-файлы. Дампы форматируются и приводятся к читабельному виду (с помощью xmllint). Дампы сжимаются gz, за исключением последнего. В файле dump_last.xml находится наиболее свежий дамп, отформатированный и перекодированный в UTF-8. key/ В этом каталоге должны размещаться ЭЦП оператора в формате PKCS#12 (файлы с расширением pfx). Для получения PEM-файла необходимо использовать скрипт erdi-key-update.sh, который автоматически использует наиболее свежую ЭЦП. openssl/ В этом каталоге должны лежать бинарники OpenSSL. Если используется другая версия OpenSSL, путь к ней нужно указать в lib-config.inc, в константе ERDI_SSL run/ Вспомогательный каталог для счетчика и отслеживания статуса. src/ Каталог с исходниками. В него нужно распаковать openssl-1.0.1o и собрать в соответствии с инструкцией в readme. Сами исходники в архив не включаются, чтобы размер архива не раздувать. lib-config.inc Константы с путями. Если пути отличаются от /srv/erdi, константы нужно скорректировать. lib-logging.inc Вспомогательные функции для логгирования. lib-onetime.inc Обеспечивает активность только одного инстанса скриптов (одновременный запуск двух инстансов может поломать нормальную работу скриптов). lib-websvc.inc Пути к вспомогательным утилитам и вспомогательные константы (время таймаута, количество повторов и т.д.). erdi-search.sh Отслеживание появления или удаления ссылок в реестре по датам (используются дампы в подкаталоге dump/). Поиск может осуществляться в обратном и в прямом направлении. erdi-key-update.sh Обновление закрытого ключа при перевыпуске ЭЦП. erdi-clean.sh Очистка устаревших данных из data/ и dump/. По умолчанию протоколы хранятся в течении года, дампы в течении 5 лет. erdi-request.sh Основной скрипт, который выполняет все действия: - проверяет срок действия ЭЦП - проверяет необходимость получения реестра - формирует XML-запрос - получает реестр - проверяет ЭЦП реестра - форматирует дамп в читабельный вид - получает сводку по дампу (количество записей, URL, доменов, IP-адресов в дампе) При необходимости с помощью XPath-запросов из дампа можно извлечь любую нужную информацию и использовать ее в самодельных решениях по блокировке. erdi-request.log Сводный протокол работы скриптов. erdi-request.err Важные ошибки в работе скриптов (неполучение выгрузки). Пример содержимого каталога с протоколом работы: # ls -l /srv/erdi/data/20170110-1001 total 12748 -rw-r--r--. 1 root root 552 Jan 10 10:01 dbg-getLastDumpDateEx-Response.xml -rw-r--r--. 1 root root 502 Jan 10 10:01 dbg-getLastDumpDateEx.xml -rw-r--r--. 1 root root 622 Jan 10 10:06 dbg-getResult-001-Response.xml -rw-r--r--. 1 root root 583 Jan 10 10:06 dbg-getResult-001.xml -rw-r--r--. 1 root root 436 Jan 10 10:01 dbg-sendRequest-Response.xml -rw-r--r--. 1 root root 5356 Jan 10 10:01 dbg-sendRequest.xml -rw-r--r--. 1 root root 13005129 Jan 10 10:06 dump.zip -rw-r--r--. 1 root root 3237 Jan 10 10:01 request.sig -rw-r--r--. 1 root root 247 Jan 10 10:01 request.xml -rw-r--r--. 1 root root 4425 Jan 10 10:06 working.log Содержимое протокола: # cat working.log 2017-01-10 10:01:01 [pid 5640]: - Срок действия ключа: 2017-06-15 2017-01-10 10:01:01 [pid 5640]: # Обработка запроса (каталог 20170110-1001) 2017-01-10 10:01:01 [pid 5640]: - формирование запроса (файл /srv/erdi/data/20170110-1001/dbg-getLastDumpDateEx.xml)... 2017-01-10 10:01:01 [pid 5640]: - отправка запроса getLastDumpDateEx на сервер (http://vigruzki.rkn.gov.ru/services/OperatorRequest/)... 2017-01-10 10:01:01 [pid 5640]: + Дата обновления ЕРДИ: 2017-01-10 09:26:01 (срочное) 2017-01-10 10:01:01 [pid 5640]: + Версия сервиса 3.1, версия дампа 2.2, версии модуля 2.2 2017-01-10 10:01:01 [pid 5640]: - Предыдущий запуск: 2017-01-10 08:01:01 (7200 секунд) 2017-01-10 10:01:01 [pid 5640]: # Выполняется срочное обновление 2017-01-10 10:01:01 [pid 5640]: # Запрос на получение выгрузки ЕРДИ (версия 2.2) 2017-01-10 10:01:01 [pid 5640]: - формирование XML-запроса... 2017-01-10 10:01:01 [pid 5640]: - подписание XML-запроса... 2017-01-10 10:01:01 [pid 5640]: - формирование запроса (файл /srv/erdi/data/20170110-1001/dbg-sendRequest.xml)... 2017-01-10 10:01:01 [pid 5640]: - отправка запроса sendRequest на сервер (http://vigruzki.rkn.gov.ru/services/OperatorRequest/)... 2017-01-10 10:01:01 [pid 5640]: + Идентификатор запроса: #66****8ed55338717cf3c20030****d7 2017-01-10 10:01:01 [pid 5640]: # Постановка запроса в очередь 2017-01-10 10:01:01 [pid 5640]: - Сохранение текущего статуса... 2017-01-10 10:01:01 [pid 5640]: - Пауза (300) перед повтором... 2017-01-10 10:06:01 [pid 5640]: # Обработка очереди (итерация 1) 2017-01-10 10:06:01 [pid 5640]: - времени прошло: 300 2017-01-10 10:06:01 [pid 5640]: # Определение статуса запроса (версия 2.2) 2017-01-10 10:06:01 [pid 5640]: - рабочий каталог: 20170110-1001 2017-01-10 10:06:01 [pid 5640]: - идентификатор: 66****8ed55338717cf3c20030****d7 2017-01-10 10:06:01 [pid 5640]: - формирование запроса (файл /srv/erdi/data/20170110-1001/dbg-getResult-001.xml)... 2017-01-10 10:06:01 [pid 5640]: - отправка запроса getResult на сервер (http://vigruzki.rkn.gov.ru/services/OperatorRequest/)... 2017-01-10 10:06:07 [pid 5640]: - Суточный счетчик: 6 2017-01-10 10:06:07 [pid 5640]: + Файл /srv/erdi/data/20170110-1001/dump.zip 2017-01-10 10:06:07 [pid 5640]: + Формат: 2.2, получатель: ***** 2017-01-10 10:06:07 [pid 5640]: # Обработка результатов запроса #66****8ed55338717cf3c20030****d7 2017-01-10 10:06:07 [pid 5640]: - Распаковка архива /srv/erdi/data/20170110-1001/dump.zip 2017-01-10 10:06:07 [pid 5640]: - Извлечение ЭЦП... 2017-01-10 10:06:09 [pid 5640]: + ЭЦП подтверждает подлинность реестра 2017-01-10 10:06:09 [pid 5640]: - Форматирование XML-файла... 2017-01-10 10:06:10 [pid 5640]: - Извлечение информации из реестра... 2017-01-10 10:06:11 [pid 5640]: - Сохранение реестра в /srv/erdi/dump/dump-20170110-092601.xml 2017-01-10 10:06:11 [pid 5640]: # Сводка по текущему реестру: 2017-01-10 10:06:13 [pid 5640]: - количество IP-адресов: 126577 / 966 2017-01-10 10:06:14 [pid 5640]: - количество доменов: 10043 2017-01-10 10:06:15 [pid 5640]: - из них с маской: 114 2017-01-10 10:06:16 [pid 5640]: - количество записей: 54842 2017-01-10 10:06:16 [pid 5640]: # Сравнение с предыдущей версией (dump-20170109-230000.xml) 2017-01-10 10:06:17 [pid 5640]: + Дамп от 20170110-092601 - изменения зафиксированы в /srv/erdi/dump/dump-20170110-092601.diff 2017-01-10 10:06:18 [pid 5640]: - Архивирую предыдущий дамп /srv/erdi/dump/dump-20170109-230000.xml Сводный протокол ошибок: # cat erdi-request.err 2016-10-03 22:02:36 [pid 21739]: getLastDumpDateEx: Сервер не отвечает 2016-10-04 15:07:29 [pid 13628]: getResult (#0ff1483229d93d2333c463334ce67bee): Сервер не отвечает 2016-10-04 15:14:36 [pid 13628]: getResult (#0ff1483229d93d2333c463334ce67bee): Сервер не отвечает 2016-10-04 15:21:11 [pid 13628]: getResult (#0ff1483229d93d2333c463334ce67bee): Сервер не отвечает 2016-10-04 15:26:38 [pid 13628]: getResult (#0ff1483229d93d2333c463334ce67bee): Сервер не отвечает 2016-10-04 15:33:22 [pid 13628]: getResult (#0ff1483229d93d2333c463334ce67bee): Сервер не отвечает 2016-10-04 15:33:22 [pid 13628]: getResult (#0ff1483229d93d2333c463334ce67bee): Таймаут (число попыток: 6) 2016-10-04 16:02:21 [pid 15028]: getLastDumpDateEx: Сервер не отвечает 2016-10-04 17:02:35 [pid 16309]: getLastDumpDateEx: Сервер не отвечает erdi_redist.tar.gz Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
OK-2004 Posted January 10, 2017 (edited) · Report post Не хочу ни в чьи огороды кидать камни, но признаю, что в отличие от https://github.com/yegorov-p/python-zapret-info и https://github.com/max197616/zapret Ваш скрипт erdi-request.sh , уважаемый alibek работает очень чётко. Особенно покоряет реализация SOAP-запросов на Curl.... :) И да! Pure-Bash всегда греет душу! Дабы поддержать столь полезный почин дерзну приложить скртиптик, который парсит получившийся dump.xml на: 1.ip-ы для блокировки фильтром или анонса на DPI. 2.domen-ы для блокировки по ДНС. 3.URL-ы для скармливания чудному extfilter от MAX1976. dump_parser.sh.zip Edited January 15, 2017 by OK-2004 Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
ixi Posted January 10, 2017 · Report post Дабы поддержать столь полезный почин дерзну приложить скртиптик Похоже, забыт @blockType="domain-mask" Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
myth Posted January 10, 2017 · Report post https://github.com/max197616/zapret да, кое-где пропущены циклы для повторной попытки получения выгрузок. Добавил и все поехало. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
OK-2004 Posted January 11, 2017 · Report post Похоже, забыт @blockType="domain-mask" Хм, и действительно.... Перезалил файл, заодно немного изменил логику. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
AlKov Posted January 12, 2017 · Report post Похоже, забыт @blockType="domain-mask" Хм, и действительно.... Перезалил файл, заодно немного изменил логику. ./dump_parser.sh: line 105: syntax error near unexpected token `done' ./dump_parser.sh: line 105: `done < $r/doms/d7.txt' Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
OK-2004 Posted January 13, 2017 · Report post 2 ALKov: да всё правильно, начало цикла почему-то в комменты попало. Отредактировал, перезалил. Сорри.... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
OK-2004 Posted January 13, 2017 · Report post Продолжаем... Во время оно Некто поставил задачу: "А кто их ваших клиентов пытался сходить на некоторые "интересные" урлы из списка dump.xml"? (естественно мы ему это не дали). У "взрослых" дядей с серьёзными системами DPI конечно есть крутые логи блокировок и эта задача для них тривиальна. Но Россия (как известно) - родина слонов нестандартных подходов к стандартным вещам. Попробуем сохранить традицию... Помятуя о том ,что весь траффик ДНС-запросов клиентов принудительно замыкается на неком порту коммутатора, "отзеркалим" этот порт и в "зеркальный" порт включаем небольшой сервачок через eth0. Далее про этот сервачок подробнее.... Признавая тот факт, что единственным нормальным "фоновым" сниффером с большими возможностями является https://github.com/vrtadmin/Daemonlogger - его и будем использовать. (кстати он есть в стандартных репах большинства дистров) Исходные данные : 1.файлы дампов daemonlogger-a будем складывать в /var/log/named 2.так как эти файлы по кольцу "ротейтятся" - будем архивировать их в /var/log/named/arch 3. содержимое файла bpf.txt : "udp and port 53" 4. url.list - список "интересных" доменов. Начинаем: 1.запускаем сниффер: daemonlogger -d -f /root/bpf.txt -i eth0 -l /var/log/named -g 0 -u 0 -n e0 -P /var/run -p dlog -S 0 -t 1h -m 100 -r -F 2.Через crontab раз в сутки запускаем dns_log_arch.sh. 3.Через crontab в конце месяца запускаем dns_log_report.sh 4.Спасибо что дочитали до конца. dns_log_report.sh.zip dns_log_arch.sh.zip Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
myth Posted January 13, 2017 · Report post А парсить лог днс не проще было? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
OK-2004 Posted January 13, 2017 · Report post А парсить лог днс не проще было? 1."category queries" у bind9 принципиально выставил в "none" (включу когда накопим денег на массив из SAS-винтов) 2.анализируется весь ДНС-трафик, а не только тот , который адресован конкрентному днс-серверу. ( у нас с помощью PBR весь клиентский ДНС-трафик отправляется в другой канал, где его либо встречают пачка наших рекурсивных резолверов, либо транзитом уходит в большой инет в зависимости от ситуации) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
OK-2004 Posted January 14, 2017 (edited) · Report post Новая версия dump_parser.sh (Добавлены подробные комменты) Edited January 15, 2017 by OK-2004 Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
OK-2004 Posted January 16, 2017 · Report post Простой конвертер реестра РКН в html: rkn_2html.sh.zip Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sol Posted January 16, 2017 · Report post Загрузчик реестра с фиксированным, заранее подписанным запросом. На перле. Сделан для одного жадного провайдера. )) rkn.tar.gz Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
dnldfl Posted January 19, 2017 · Report post Автору большое спасибо, работает четко и что самое главное с комменатриями, в случае чего понятно в чем косяк и без знания bash или perl! Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
username Posted February 2, 2017 · Report post Премного благодарен за отличные и понятные скрипты. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted May 16, 2017 · Report post Добавил скрипт по получению из дампа списка объектов. В архив пока не добавлял, проще скопировать вручную. #!/bin/bash ### Работа с дампом - список объектов source ./lib-config.inc source ./lib-websvc.inc DUMP="${ERDI_DUMP}/dump_last.xml" echo "Дамп: $DUMP" echo "Список доменов (list-domain.txt)" "${ERDI_XML}" select -T -t -m "/reg:register/content[@blockType='domain']" \ -s A:N:- "string-length(domain)" -s A:T:- "domain" \ -v "domain" -n "$DUMP" \ | uniq \ > list-domain.txt echo "Список доменов с маской (list-domain-mask.txt)" "${ERDI_XML}" select -T -t -m "/reg:register/content[@blockType='domain-mask']" \ -s A:N:- "string-length(domain)" -s A:T:- "domain" \ -v "domain" -n "$DUMP" \ | uniq \ > list-domain-mask.txt echo "Список IP-адресов (list-ip.txt)" "${ERDI_XML}" select -T -t -m "/reg:register/content[@blockType='ip' and ip]" \ -v "ip" -n "$DUMP" \ | sort -V -u \ > list-ip.txt echo "Список IP-подсетей (list-net.txt)" "${ERDI_XML}" select -T -t -m "/reg:register/content[@blockType='ip' and ipSubnet]" \ -v "ipSubnet" -n "$DUMP" \ | sort -V -u \ > list-net.txt echo "Список адресов (list-url.txt)" "${ERDI_XML}" select -T -t -m "/reg:register/content[not(@blockType) and url]" \ -s A:N:- "string-length(url)" -s A:T:- "url" \ -v "url" -n "$DUMP" \ | uniq \ > list-url.txt inc-файлы не обязательны, их можно вообще убрать, только нужно будет вручную прописать пути для переменных $DUMP (полный путь к XML-дампу) и $ERDI_XML (полный путь к xmlstarlet). После выполнения скрипта формируется список из пяти текстовых файлов: list-domain.txt - список доменов list-domain-mask.txt - список доменов с маской list-ip.txt - список отдельных IP-адресов list-net.txt - список подсетей list-url.txt - список URL для блокировки Список доменов и URL сортируется по длине значения и по алфавиту, IP-адреса сортируются по значению, дубликаты исключаются. Нормализация и валидация не производится, если нужно, то можно сделать примерно так: "${ERDI_XML}" select -T -t -m "/reg:register/content[@blockType='domain']" \ -v "domain" -n "$DUMP" \ | idn --quiet | sed 's/\(.*\)/\L\1/' | sed 's/\.$//' | sort -u | awk '{ print length, $0 }' | sort -n | cut -d" " -f2- \ > list-domain.txt (конкретный конвейер и параметры по своим потребностям и на свое усмотрение) Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
OK-2004 Posted May 17, 2017 (edited) · Report post Как всегда , прекрасная работа, за что Вам alibek - огромное спасибо. А мы продолжим тоже... Часто при сбое системы парсинга дампа реестра или системы блокировки ревизору "распахиваются" все двери ко всем ресурсам в таком опасном и грозном нонче инете. Процесс востановления совсем не детерменирован во времени и на это время надо бы перевести всю сетку с клиентами и ревизором в "карантинный" режим, в котором инет будет открыт тока по белым спискам а всё остальное заблочено. Если у прова есть при этом свой кэширующий днс для клиентов - то дело сильно упрощается. У нас как раз есть такой ДНС и ниже приведена методика перевода его в карантинный режим : 1. Допустим у нас есть список белых урлов, которые точно никогда не попадут в реестр: ( его размер определяется тока фантазией прова и рекомендациями соотв.органов) cat doms.allow: mail.ru yandex.ru rkn.gov.ru gov.ru kremlin.ru google.ru rfc-revizor.ru gosuslugi.ru ...... Скрипт find_ns.sh ищет ДНС-сервера , которым делегированы эти зоны и делает на их основе заготовки для forward-зон нашего карантинного ДНС-а : #!/bin/bash r=/dev/shm #set -vx rx='([1-9]?[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])' rm -rf $r/dns ; mkdir $r/dns ; rm -f /etc/bind/my_zones ; rm -f /etc/bind/db.fake.middle while read line ; do dig -4 NS +noall +additional ${line}|awk '{print $5}' > $r/dns/${line}.0 if [ -s $r/dns/${line}.0 ] ; then while read line1 ; do if [[ ${line1} =~ ^$rx\.$rx\.$rx\.$rx$ ]] ; then echo "${line1}" >> $r/dns/${line} ; fi done < $r/dns/${line}.0 if [ -s $r/dns/${line} ] ; then string= delim="; " while read line2 ; do string="$string$line2$delim" done < $r/dns/${line} echo "zone \"${line}\" { type forward; forward only; forwarders { ${string} }; };" >> /etc/bind/my_zones echo "${line}. IN NS fakens." >> /etc/bind/db.fake.middle fi else rm -f $r/dns/${line}.0 fi sleep 5 done < /root/doms.allow #set +vx cat /etc/bind/db.fake.head /etc/bind/db.fake.middle /etc/bind/db.fake.tail > /etc/bind/db.fake rm -f $r/dns/*.0 exit 0 Файлы /etc/bind/db.fake.head и /etc/bind/db.fake.tail - "шапка" и "хвост" для создания файковой (aka sinkhole) корневой зоны cat db.fake.head: $ORIGIN . $TTL 2 . IN SOA localhost. root.localhost. ( 2015082010 ; serial 3600 ; refresh 1 ; retry 604800 ; expire 86499 ; minimum ) NS fakens. fakens. IN A 192.168.121.79 cat db.fake.tail: *.ru. IN A 192.168.121.79 *. IN A 192.168.121.79 192.168.121.79 - ип-адресс нашего ДНС "изображающего" из себя всю систему корневых серверов Инета. cat db.fake.middle: mail.ru. IN NS fakens. yandex.ru. IN NS fakens. rkn.gov.ru. IN NS fakens. gov.ru. IN NS fakens. kremlin.ru. IN NS fakens. google.ru. IN NS fakens. rfc-revizor.ru. IN NS fakens. gosuslugi.ru. IN NS fakens. db.fake - корневая зона нашего ДНС-а: cat db.fake: $ORIGIN . $TTL 2 . IN SOA localhost. root.localhost. ( 2015082010 ; serial 3600 ; refresh 1 ; retry 604800 ; expire 86499 ; minimum ) NS fakens. fakens. IN A 192.168.121.79 mail.ru. IN NS fakens. yandex.ru. IN NS fakens. rkn.gov.ru. IN NS fakens. gov.ru. IN NS fakens. kremlin.ru. IN NS fakens. google.ru. IN NS fakens. rfc-revizor.ru. IN NS fakens. gosuslugi.ru. IN NS fakens. *.ru. IN A 192.168.121.79 *. IN A 192.168.121.79 /etc/bind/my_zones - псевдоделегация : zone "mail.ru" { type forward; forward only; forwarders { 217.69.139.112; 94.100.180.138; 185.30.176.202; }; }; zone "yandex.ru" { type forward; forward only; forwarders { 213.180.193.1; 93.158.134.1; }; }; zone "rkn.gov.ru" { type forward; forward only; forwarders { 213.234.223.137; 217.106.225.146; }; }; zone "gov.ru" { type forward; forward only; forwarders { 95.173.128.77; 194.226.65.9; 193.232.66.15; 194.85.84.15; 193.232.82.15; 194.226.80.79; 194.226.127.210; }; }; zone "kremlin.ru" { type forward; forward only; forwarders { 95.173.128.77; 194.226.65.9; 193.232.66.15; 194.85.84.15; 193.232.82.15; 194.226.80.79; 194.226.127.210; }; }; zone "google.ru" { type forward; forward only; forwarders { 216.239.32.10; 216.239.34.10; 216.239.36.10; 216.239.38.10; }; }; zone "rfc-revizor.ru" { type forward; forward only; forwarders { 193.232.146.1; 91.217.20.1; 91.217.21.1; 185.119.138.10; 185.119.136.12; }; }; zone "gosuslugi.ru" { type forward; forward only; forwarders { 109.207.2.218; 213.59.255.175; 91.217.20.1; 91.217.21.1; }; }; Таперича пришла пора познакомиться с named.conf нашего псевдокорневого фейкового ДНС-а : options { directory "/var/cache/bind"; dump-file "/var/log/named/cache_dump.db"; statistics-file "/var/log/named/named_stats.txt"; auth-nxdomain no ; allow-recursion { none; }; allow-query { none; }; allow-transfer { none; }; notify no; recursion no; version "REFUSED"; query-source address 192.168.121.79; check-names master ignore; check-names slave ignore; recursive-clients 10000; listen-on { 192.168.121.79; 127.0.0.1; }; listen-on-v6 { none; }; }; include "/etc/bind/logging"; include "/etc/bind/rndc.key"; controls { inet 127.0.0.1 allow { localhost; } keys { rndc-key; }; }; ///////////////////////////////////////////////////// acl local { 127.0.0.1; 192.168.121.79; }; //////////////////////////// ипы наших клиентов, среди которых затерялся и ревизор acl our_net { 192.168.88.0/24; 192.168.89.0/24; 192.168.121.0/24; }; /////////////////////////////////////////////////////// view "local" { match-clients { "local"; }; allow-recursion { local; }; allow-query { local; }; include "/etc/bind/local_zones"; recursion yes; }; ///////////////////////////////////////////////////// view "our_net" { match-clients { "our_net"; }; allow-recursion { our_net; }; allow-query { our_net; }; include "/etc/bind/common_zones"; recursion yes; }; /////////////////////////////////////////// view "all" { match-clients { any ; }; allow-query { none ; }; recursion no; allow-recursion { none; }; include "/etc/bind/common_zones"; }; В /etc/bind/local_zones лежат нормальные зоны для обычного днс: zone "." in { type hint; file "/etc/bind/db.root.orig"; }; // zone "localhost" { type master; file "/etc/bind/db.localhost" ; } ; zone "local" { type master; file "/etc/bind/db.local" ; } ; zone "127.in-addr.arpa" { type master; file "/etc/bind/db.127" ; } ; zone "0.in-addr.arpa" { type master; file "/etc/bind/db.0" ; } ; zone "255.in-addr.arpa" { type master; file "/etc/bind/db.255" ; } ; // zone "нашикорпоративныедомены.ru" { type forward; forward only; forwarders { Ип.Нашего.Авторитативного.ДНС-сервера, которому ник.ру делегировал наши зоны; }; }; zone "другиеклиентскиедомены.ru" { type forward; forward only; forwarders { Ип.Нашего.Авторитативного.ДНС-сервера, которому ник.ру делегировал наши зоны; }; }; // /etc/bind/db.root.orig - стандартная root-зона из поставки бинда В /etc/bind/common_zones - "ДНС-песочница для наших клиентов": zone "." in { type master; file "/etc/bind/db.fake"; }; zone "." in { type hint; file "/etc/bind/db.root"; }; // zone "localhost" { type master; file "/etc/bind/db.localhost" ; } ; zone "local" { type master; file "/etc/bind/db.local" ; } ; zone "127.in-addr.arpa" { type master; file "/etc/bind/db.127" ; } ; zone "0.in-addr.arpa" { type master; file "/etc/bind/db.0" ; } ; zone "255.in-addr.arpa" { type master; file "/etc/bind/db.255" ; } ; // zone "нашикорпоративныедомены.ru" { type forward; forward only; forwarders { Ип.Нашего.Авторитативного.ДНС-сервера, которому ник.ру делегировал наши зоны; }; }; zone "другиеклиентскиедомены.ru" { type forward; forward only; forwarders { Ип.Нашего.Авторитативного.ДНС-сервера, которому ник.ру делегировал наши зоны; }; }; // include "/etc/bind/my_zones"; /etc/bind/db.fake и /etc/bind/db.root - "сладкая парочка" особенных рутовых зон: cat db.root: . 3600 IN NS fakens. fakens. 3600 A 192.168.121.79 cat db.fake: $ORIGIN . $TTL 2 . IN SOA localhost. root.localhost. ( 2015082010 ; serial 3600 ; refresh 1 ; retry 604800 ; expire 86499 ; minimum ) NS fakens. fakens. IN A 192.168.121.79 mail.ru. IN NS fakens. yandex.ru. IN NS fakens. rkn.gov.ru. IN NS fakens. gov.ru. IN NS fakens. kremlin.ru. IN NS fakens. google.ru. IN NS fakens. rfc-revizor.ru. IN NS fakens. gosuslugi.ru. IN NS fakens. *.ru. IN A 192.168.121.79 *. IN A 192.168.121.79 Вот вообщем-то и всё... Следует отметить , что на 192.168.121.79 кроме фейкового корневого днс-а сидит еще и простой веб-сервер, выплёвывающий на любые обращения по порту tcp/80 статику в виде :"404-я ( на сайте ведутся регламентные профилактические работы, позвоните через 15 мин)" В результете всего этого действа пользователи спокойно бродят по белым доменам, ждут , когда на других сайтах закончятся регламентные работы, а мы пока яростно чиним нашу систему блокировки. P.S. Есть ещё один способ введения "карантинго" режима, более мягкий.. Он может пригодиться , если парсинг дампа реестра прошёл удачно, а вот система dpi сломалась. За основу его взят замечательный скрипт erdi-request.sh топик-стартера. В результате урезания и упрощения этого скрипта( вырезал в основном то - что не смог понять :) ) и добавления "индусского" кода - родилась версия erdi-lite. Исходный скрипт от alibek мне так полюбился, что я даже не стал менять имена основных переменных, в знак уважения и признательности к его труду. Запуск - через start.sh В результате работы этого скрипта мы имеем 2 списка : список доменов, упоминание которых встречается в реестре ( не важно где ) и список ип-ов , которые тока можно найти в реестре. Далее список ип-ов ужимается агрегированием одиночных ип-ов в близкие по диапазону подсети , дабы у ipset-a не "снесло крышу". Список доменов "скармливается" фейковому днс-у (сейчас таких зон на нём - 32507), а список ип-ов - ipset-у ( кол-во таких записей на сегодня - 24249 ). В итоге тотально блочим все урлы и домены по домену и все ип-ы по iptables/ipset erdi_lite.zip Edited May 17, 2017 by OK-2004 Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Andrei Posted June 4, 2017 · Report post Добавил скрипт по получению из дампа списка объектов. ... После выполнения скрипта формируется список из пяти текстовых файлов: list-domain.txt - список доменов list-domain-mask.txt - список доменов с маской list-ip.txt - список отдельных IP-адресов list-net.txt - список подсетей list-url.txt - список URL для блокировки Список доменов сейчас получается какой-то странный - см. прилагаемый файл Например, в файле list-domain.txt есть записи вида www450.xn--1-2017-bof6a3i1a.xn--p1ai или bet0122.xn--1--8kcaj9bd6cbk.xn--p1acf list-domain.txt Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
YuryD Posted June 4, 2017 · Report post [Список доменов сейчас получается какой-то странный - см. прилагаемый файл Например, в файле list-domain.txt есть записи вида www450.xn--1-2017-bof6a3i1a.xn--p1ai или bet0122.xn--1--8kcaj9bd6cbk.xn--p1acf Пуникод вы не усвоили ? Это российский глюк с кодировками. Никто его не заметил, особенно в url доменов .рф Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Andrei Posted June 4, 2017 · Report post [Список доменов сейчас получается какой-то странный - см. прилагаемый файл Например, в файле list-domain.txt есть записи вида www450.xn--1-2017-bof6a3i1a.xn--p1ai или bet0122.xn--1--8kcaj9bd6cbk.xn--p1acf Пуникод вы не усвоили ? Это российский глюк с кодировками. Никто его не заметил, особенно в url доменов .рф По-моему вы меня не поняли. Если бы домен был вида www450.xn--1-2017-bof6a3i1a.xn--p1ai.ru, то нет проблем. Но тут-то какие-то огрызки от доменов. Посмотрите выложенный мной файл ближе к его концу. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted June 5, 2017 · Report post www450.xn--1-2017-bof6a3i1a.xn--p1ai Так в реестре именно так и записано. <content id="448354" includeTime="2017-02-12T12:34:07" entryType="1" blockType="domain" hash="E4E5577EB07F4966E06CA8E03A568850"> <decision date="2016-06-24" number="2-6-27/ 2016-06-22-18-АИ" org="ФНС"/> <domain><![CDATA[www450.xn--1-2017-bof6a3i1a.xn--p1ai]]></domain> <ip>91.201.202.204</ip> <ip>91.201.203.170</ip> </content> Особой валидации в скрипте нет, он просто прогоняет домены через idn, приводит к одному регистру, убирает точку в конце, а затем убирает дубли и сортирует по длине. Если нужна дополнительная валидация, ее нужно добавить в скрипт, под свои нужды. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Andrei Posted June 5, 2017 · Report post alibek, большое спасибо за ваши пояснения и скрипты. :) Что вы обычно делаете с такими доменами в плане блокировки? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
edo Posted June 5, 2017 · Report post Небольшой оффтопик: где бы взять непровайдеру этот самый реестр? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Andrei Posted June 5, 2017 · Report post Небольшой оффтопик: где бы взять непровайдеру этот самый реестр? https://reestr.rublacklist.net/article/api Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...