alibek Posted January 10, 2017 Оглавление Набор 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 Набор 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) Не хочу ни в чьи огороды кидать камни, но признаю, что в отличие от 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 Дабы поддержать столь полезный почин дерзну приложить скртиптик Похоже, забыт @blockType="domain-mask" Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
myth Posted January 10, 2017 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 Похоже, забыт @blockType="domain-mask" Хм, и действительно.... Перезалил файл, заодно немного изменил логику. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
AlKov Posted January 12, 2017 Похоже, забыт @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 2 ALKov: да всё правильно, начало цикла почему-то в комменты попало. Отредактировал, перезалил. Сорри.... Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
OK-2004 Posted January 13, 2017 Продолжаем... Во время оно Некто поставил задачу: "А кто их ваших клиентов пытался сходить на некоторые "интересные" урлы из списка 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 А парсить лог днс не проще было? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
OK-2004 Posted January 13, 2017 А парсить лог днс не проще было? 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) Новая версия 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 Простой конвертер реестра РКН в html: rkn_2html.sh.zip Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
sol Posted January 16, 2017 Загрузчик реестра с фиксированным, заранее подписанным запросом. На перле. Сделан для одного жадного провайдера. )) rkn.tar.gz Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
dnldfl Posted January 19, 2017 Автору большое спасибо, работает четко и что самое главное с комменатриями, в случае чего понятно в чем косяк и без знания bash или perl! Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
username Posted February 2, 2017 Премного благодарен за отличные и понятные скрипты. Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
alibek Posted May 16, 2017 Добавил скрипт по получению из дампа списка объектов. В архив пока не добавлял, проще скопировать вручную. #!/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) Как всегда , прекрасная работа, за что Вам 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 Добавил скрипт по получению из дампа списка объектов. ... После выполнения скрипта формируется список из пяти текстовых файлов: 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 [Список доменов сейчас получается какой-то странный - см. прилагаемый файл Например, в файле 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 [Список доменов сейчас получается какой-то странный - см. прилагаемый файл Например, в файле 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 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 alibek, большое спасибо за ваши пояснения и скрипты. :) Что вы обычно делаете с такими доменами в плане блокировки? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
edo Posted June 5, 2017 Небольшой оффтопик: где бы взять непровайдеру этот самый реестр? Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...
Andrei Posted June 5, 2017 Небольшой оффтопик: где бы взять непровайдеру этот самый реестр? https://reestr.rublacklist.net/article/api Вставить ник Quote Ответить с цитированием Share this post Link to post Share on other sites More sharing options...