LINUX.ORG.RU

zicsv и zicsv-tool v0.1.0

 , ,


3

3

Как известно, распространение списков блокировок Роскомнадзора официально запрещено за пределами провайдеров. Но нашлись добрые люди, которые создали проект Zapret-Info и регулярно выкладывают свежие выгрузки реестра заблокированных адресов.

К сожалению, дампы выгрузок выкладываются в неудобном для использования формате (CSV, CP1251, иногда содержит ошибки). Для разбора этого формата была написана библиотека zicsv, позволяющая поточно читать дамп. На основе этой библиотеки разработана утилита командной строки zicsv-tool, с помощтю которой можно:

  • конвертировать дамп в гораздо более читабельный JSON;
  • выводить определённые типы заблокированных адресов (например только подсети) простым списком;
  • и искать адреса в списке заблокированных.

Вот так выглядит пример работы функции поиска адресов:

$ zicsv-tool -i dump.csv search "http://google.com"
http://google.com:
    http://google.com/: not found

    google.com: not found

    74.125.205.100: blocked
        IPv4 address is equal to blocked IPv4 address:
            Blocked: 74.125.205.100
            Organization: Генпрокуратура
            Document ID: 27-31-2018/Ид2971-18
            Document date: 2018-04-16

    74.125.205.138: not found

    74.125.205.102: blocked
        IPv4 address is equal to blocked IPv4 address:
            Blocked: 74.125.205.102
            Organization: Генпрокуратура
            Document ID: 27-31-2018/Ид2971-18
            Document date: 2018-04-16

    74.125.205.113: blocked
        IPv4 address is equal to blocked IPv4 address:
            Blocked: 74.125.205.113
            Organization: Генпрокуратура
            Document ID: 27-31-2018/Ид2971-18
            Document date: 2018-04-16

    74.125.205.139: not found

    74.125.205.101: blocked
        IPv4 address is equal to blocked IPv4 address:
            Blocked: 74.125.205.101
            Organization: Генпрокуратура
            Document ID: 27-31-2018/Ид2971-18
            Document date: 2018-04-16

>>> Краткая инструкция по установке и использованию.

>>> Репозиторий на гитхабе

★★★★★

Проверено: jollheef ()
  • Патчи и багрепорты приветствуются.
  • Пример с http://google.com не всегда работает одинаково из-за того, что разные DNS-серверы выдают разные адреса для google.com. Некоторые серверы выдают разные ответы на каждый запрос.
  • Доменные имена из самого дампа не ресолвятся.
  • Демон, который бы периодически скачивал дамп, ресолвил оттуда всё, что возможно, и запихивал результат куда-нибудь в ipset, уже в процессе написания...
mironov_ivan ★★★★★ ()
Последнее исправление: mironov_ivan (всего исправлений: 1)

гораздо более читабельный JSON

На мой взгляд - спорное утверждение. Не думаю, что добавление фигурных скобок к запятым добавляет читабельности.

Возможно YAML (примерно как в выхлопе в Вашем примере) был бы более читабельным.

Добавлено: Может заменить «читабельный» на «юзабельный»? Тогда вполне соглашусь.

MumiyTroll ★★ ()
Последнее исправление: MumiyTroll (всего исправлений: 2)
Ответ на: комментарий от mos

Загрузи в опенофисс и выставь кодировку - cp1251. А вот что дальше делать ? Х.з.

По идее нужно писать рпс-сервис и плагин к фф что бы если есть обращение к этому адресу - всплывал баннер какой то ... опять же не понятно зачем :(

mx__ ★★★ ()
Последнее исправление: mx__ (всего исправлений: 1)

Диссидентство на главной.
Не думал, что когда-либо такое увижу.

Когда счёт идёт на полмиллиона адресов, не проще ли держать вайт-лист адресов, на которые трафик роутить не через vpn?

aidaho ★★★★★ ()
Ответ на: комментарий от aidaho

Не нашел там полмиллиона. Опятьже, по моему, вариант с dnsmasq, который динамически по моменту обращения клиента ресолвит домен и добавляет его адрес в ipset сводит всю эту таблицу до нескольких тысяч адресов.

AVL2 ★★★★★ ()

К сожалению, дампы … иногда содержит ошибки.
утилита командной строки zicsv-tool, с помощтю которой

Проверено: jollheef

Шома растит себе достойного преемника.

LamerOk ★★★★★ ()

CP1251, иногда содержит ошибки

В дампе оно ровно в таком виде, в котором присылает безумные XML-ки РКН, жалуйся им. И там не только cp1251 бывает.

eSyr ★★ ()
Ответ на: комментарий от Im_not_a_robot

В какой вселенной json более удобен для чтения, чем csv для табличных данных?

Там не совсем табличные данные. В первых трёх полях - списки IP/подсетей, доменов и урлов. Они могут быть очень длинными. То есть просто открыть CSV либреофисом и увидеть красивую таблицу не получится.

mironov_ivan ★★★★★ ()
Ответ на: комментарий от eSyr

В дампе оно ровно в таком виде, в котором присылает безумные XML-ки РКН, жалуйся им. И там не только cp1251 бывает.

А есть вообще где-нибудь документация на это всё с примерами оригинальных XMLек? Было бы очень интересно посмотреть на это.

mironov_ivan ★★★★★ ()
Ответ на: комментарий от mx__

Загрузи в опенофисс и выставь кодировку - cp1251. А вот что дальше делать ? Х.з.

В том то и дело, что опенофис тут не помогает никак.

В последнее время, я стал часто натыкаться на неработающие сайты. Чтобы понять кто виноват - провайдер или роскомнадзор, приходилось руками ресолвить адреса, подбирать под эти адреса подсети и делать что-то типа «iconv -f cp1251 <dump.csv | grep $предполагаемая_подсеть». Чтобы не делать подобный поиск вручную я и написал утилиту для поиска по дампу.

Официальный поисковик от Роскомнадзора вообще бесполезен: если забочили подсеть, а ты ему передаёшь URL, имя домена или IP-адрес, то он ничего не находит. Поиск на https://antizapret.info тоже не умеет ничего.

mironov_ivan ★★★★★ ()

дампы выгрузок выкладываются в неудобном для использования формате (CSV, CP1251, иногда содержит ошибки)

А нам в XML присылают. Не исключено даже, что файл может лежать на публично доступном ftp-сервере, но это не точно. Может быть надо поискать ссылку на этот файл?

anonymous ()
Ответ на: комментарий от anonymous

А нам в XML присылают. Не исключено даже, что файл может лежать на публично доступном ftp-сервере, но это не точно. Может быть надо поискать ссылку на этот файл?

Если знаешь где достать оригинальные файлы - пиши. Я не нашёл.

mironov_ivan ★★★★★ ()
Ответ на: комментарий от AVL2

Опятьже, по моему, вариант с dnsmasq, который динамически по моменту обращения клиента ресолвит домен и добавляет его адрес в ipset сводит всю эту таблицу до нескольких тысяч адресов.

dnsmasq - это интересное решение. Но у него тоже есть проблемы:

  • ipset придётся как-то периодически чистить. Потому что блокировки иногда снимают.
  • Всё равно надо прикручивать какие-то дополнительные скрипты чтобы добавлять в ipset подсети и отдельные адреса, так как блокировки не всегда идут с доменными именами, плюс и обращение к адресами не всегда включает обращение в DNS, даже если имя известно.

Да и я уже начал делать свой велосипед =).

mironov_ivan ★★★★★ ()
Последнее исправление: mironov_ivan (всего исправлений: 1)
Ответ на: комментарий от mironov_ivan

Товарищи, причастные к провайдерам!

Насколько я понял, у РКН есть робот, которые ходит по провайдерам и проверяет, не заблочен ли адрес? А нельзя ли блочить «неугодные» IP только для него? :)

Sahas ★★★★ ()
Ответ на: комментарий от mironov_ivan

Абсолютно верно. Днсмаск это часть решения решающий проблему смены адресов у заблокированных адресов.

Задача наполнения таблицы адресов без имени и парсинга базы блокировок остается. И здесь как раз библиотечка, которая грамотно читает эту базу и фиксить ошибки будет очень кстати. Ещё хотелось бы оптимизацию базы. Объединять адреса в подсети. Причем с порогом. Есть например, тридцать процентов или более забаненых адресов в подсети - пишем всю подсеть. Есть десяток поддоменов - пишем домен. Естественно, домены типа жж или первого уровня должны быть в исключениях. Так что твоей библиотеке есть что делать и с днсмаск она никак не конфликтует.

По поводу адресов, которые по имени и не ресолвит клиентом. Ну так значит они или в хостах и ещё как то прибиты. Сам бог велел завести табличку этих адресов и забивать ее тем же скриптом, который обновляет базу.

AVL2 ★★★★★ ()
Ответ на: комментарий от AVL2

Ещё хотелось бы оптимизацию базы. Объединять адреса в подсети. Причем с порогом. Есть например, тридцать процентов или более забаненых адресов в подсети - пишем всю подсеть. Есть десяток поддоменов - пишем домен. Естественно, домены типа жж или первого уровня должны быть в исключениях.

Добавил issue себе. Если будет время на выходных - сделаю.

По поводу объединения доменов: имеется ввиду, что если у нас есть test1.example.com, test2.example.com и test3.example.com, то с «порогом» <=3 должно выдаваться *.example.com?

mironov_ivan ★★★★★ ()
Ответ на: комментарий от Sahas

Насколько я понял, у РКН есть робот, которые ходит по провайдерам и проверяет, не заблочен ли адрес?

Насколько я знаю, провайдеры обязаны ставить себе в сеть некий девайс (китайский роутер с кастомной прошивкой?), который периодически проверяет заблокированность адресов и отправляет отчёты в РКН. Но инфа не 100%, это со слов человека, который видел как это работает 8).

А нельзя ли блочить «неугодные» IP только для него? :)

По идее против этого работает «контрольная закупка», а так же доносы от благонадёжных граждан 8).

mironov_ivan ★★★★★ ()
Ответ на: комментарий от mironov_ivan

По поводу объединения доменов: имеется ввиду, что если у нас есть test1.example.com, test2.example.com и test3.example.com, то с «порогом» <=3 должно выдаваться *.example.com?

именно так. Чтобы все эти вулканы, например, были одной записью.

AVL2 ★★★★★ ()
Ответ на: комментарий от mironov_ivan

И кстати про оптимизацию. Белый список должен быть и для доменов и для адресов.

То есть если я указал livejournal.com, то он не должен попасть в правила, хоть там тысяча поддоменов забанено. И если я указал адрес 1.2.3.4 в белых адресах, то хоть там все адреса из 1.0.0.0/8 будут забанены кроме 1.2.3.4, в сеть 1.0.0.0/8 он сворачиваться не должен.

AVL2 ★★★★★ ()
Ответ на: комментарий от mironov_ivan

ipset можно не чистить. Он позволяет атомарно поменять местами (swap) два сета, поэтому можно (и нужно!) просто создавать новый, не заботясь о состоянии старого, и после swap удалить ненужное.

anonymous ()