Фильтрация по реестру Роскомнадзора.

 

Updated 12.04.2017 изменение в механизмах фильтрации SSL-трафика. Обновлены все скрипты и конфиги.

И снова здравствуйте.

И так, описанная ранее система фильтрации, по мере роста показала свою полную непригодность, поэтому начинаем все заново.

По мере роста реестра (в него начали вносить по моему все подряд), сильно разрослись ACL на CISCO, в результате процесс FMCore начал выполнятся по часу, с падением нейборов WCCP, BGP и всеми прочими прелестями. Поэтому было принято решение полностью отказаться от использования WCCP в CISCO и перейти на инжект роутингов по BGP.

В текущий момент у меня работает в боевом режиме следующая конструкция :

Net

  • BGP-бордер терминирует подключения на UpLink-ов и отдает fullview ipv4 нижестоящим операторам связи. Все, что терминированно на нем, не попадает под систему фильтрации трафика.
  • CORE (их может быть неограниченное количество в вашей сети), терминирует на себе всех наших клиентов, default route для него является BGP-бордер. Между CORE и BGP-бордером работает OSPF, что бы топология нашей сети была известна всем маршрутизаторам.
  • Сервер фильтрации (это может быть как единственная машина, так и несколько), соединен одним интерфейсом с CORE в OSPF AREA 0, другим c BGP-бордером, который для него является default route. На сервере фильтрации работает BGP роутер c приватной AS, через которую в CORE осуществляется инжект префиксов, трафик на которые должен фильтроваться. Обращаю внимание, сервер фильтрации тоже должен знать топологию сети по OSPF.

В результате мы имеем следующую схему прохождения пакетов :

Пакет от клиента попадает на CORE, где в зависимости от назначения выходит либо на BGP-бордер, либо на сервер фильтрации. Обращаю ваше внимание, что в результате на сервер фильтрации попадают не только пакеты HTTP/HTTPS но и весь трафик, предназначенный для IP-назначения, так что не забываем пропустить все отличное от HTTP/HTTPS . Если порт назначения HTTP/HTTPS то поднимаем данный трафик на анализатор, в роли которого у меня выступает связка SQUID + SQUIDGUARD .

Если в блоклистах SQUID данный URL/ресурс не числится, то запрос идет на BGP-бордер и далее в Интернет. Если ресурс заблокирован, то выдается источнику выдается страница запрета.

И так, перейдем к конкретике.

Для сервера фильтрации я использую машину на базе FreeBSD. Раз Вы читаете данную статью, значит Ваша квалификация позволяет самостоятельно писать файлы конфигурации, не вдаваясь в построчное разжевывание. На машине работает QUAGGA, отвечающая за OSPF и BGP протоколы. SQUID версии 3.5 поставлен из репозитория. SQUIDGUARD к сожалению придется собирать из портов, так как имеем одну неприятную особенность — при получении URL от SQUID, он первым делом делает URIDECODE данного URL и уже только после этого сравнивает с ресурсами из файла блокировок. Посему придется наложить на него патч, который отучает его от этой вредной привычки (лежит в архиве в директории tools) .

Набор скриптов, доведенных до ума, находится в этом архиве zapret-info.tar.gz. .

В каталоге cfg находится файл zapret.cfg , в котором указываются основные параметры работы скриптов системы. Сюда надо положить файл сертификата и файл подготовленного запроса . Как готовить сертификат и запрос для скачивания (класть в каталог cfg ) в первой статье — Фильтрация трафика по реестру Роскомнадзора .

В каталоге bin находятся файлы download.pl — собственно скачивание файла из реестра Роскомнадзора и xml-parse.pl — обработка и разбор данного файла. Результатом работы xml-parse.pl являются файлы :

  • domain.block — список заблокированных доменов
  • ip.block — список заблокированных IPv4-адресов
  • ip.filter — список IPv4-адресов, которые встречаются в записях реестра Роскомнадзора.
  • sites — перечень всех алфавитно-цифровых имен сайтов, которые фигурируют в записях URL реестра, теперь с префиксом протокола !!!.
  • url.block — список всех заблокированных URL

Все национальные домены в файлах domain.block, sites паникодированны, что позволяет с ними сразу работать утилитами типа dig и т.п.

Все символы, отличные от ASCII, в файле url.block, uri_escaped (не знаю как по русски подобрать выражение).

В каталоге rc лежат скрипты, которые исполняются по порядку, и исполняют следующие функции :

  • 00.split.sh — формирует из файла sites два файла sites.http и sites.https, уже без префиксов протокола, и конкатит их обратно в файл sites (тоже без префиксов).
  • 01.resolv.sh — проходит dig-ом имена всех сайтов из файлов sites.http и sites.https,  резолвит их в текущие ipv4-адреса (это на случай несоответствия ipv4-адреса в реестре текущему, так как по результатам общения с Роскомнадзором, оказывается это наша задача следить за соответствием имен ip-адресам). Результатом работы являются файлы ip.resolved.http и ip.resloved.https — содержащие AA адреса всех отрезолвившихся сайтов. Для обратной совместимости с другими скриптами, конкатятся в файл ip.resolved
  • 02.ipfw.sh — скрипт, формирующий таблицы адресов для ipfw — таблицу блокируемых адресов, таблицу адресов для форвардинга на SQUID по протоколу http и таблицу для форвардинга по https
  • 03.bgpd.sh — скрипт, формирующий конфиг для QUAGGи для инжекта префиксов по BGP.
  • 04.bind.sh — скрипт, формирующий заглушки на заблокированные домены, для включение его в конфигурацию нашего сервера BIND.
  • 05.squid.sh — скрипт, формирующий список заблокированных URL для squidguardа.

Для работы скриптов необходимо указать путь к файлу zapret.cfg в файле /etc/rc.conf , внеся туда запись вида  zapret_cfg=»/zapret-info/cfg/zapret.cfg»

Конфиг SQUID :

http_port 127.0.0.1:9090
http_port 127.0.0.1:3128 transparent
https_port 127.0.0.1:3129 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/usr/local/etc/squid/squid.pem key=/usr/local/etc/squid/squid.pem dhparams=/usr/local/squid/etc/dhparam.pem
always_direct allow all
acl ssl_sites ssl::server_name "/var/db/zapret-info/sites.https"
acl step1 at_step SslBump1
acl step2 at_step SslBump2
ssl_bump peek step1
ssl_bump bump ssl_sites
ssl_bump splice all
sslproxy_cert_error allow all
sslproxy_options NO_SSLv2,NO_SSLv3,SINGLE_ECDH_USE
sslproxy_options ALL
sslproxy_cipher ALL
sslcrtd_program /usr/local/libexec/squid/ssl_crtd -s /var/squid/ssl_db -M 4MB
cache_effective_user squid
cache_mgr support@plustelecom.ru
icp_port 0
#hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
cache deny QUERY
acl apache rep_header Server ^Apache
cache_mem 1 MB
cache_swap_low 90
cache_swap_high 95
maximum_object_size 1 KB
maximum_object_size_in_memory 50 KB
cache_replacement_policy heap LFUDA
cache_dir ufs /var/squid/cache 1 1 1 no-store
logfile_rotate 7
dns_nameservers 8.8.8.8 8.8.4.4
hosts_file /etc/hosts
refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320
quick_abort_min 0 KB
quick_abort_max 0 KB
half_closed_clients off
acl purge method PURGE
acl CONNECT method CONNECT
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443 # https
acl Safe_ports port 1025-65535 # unregistered ports
http_access allow manager localhost
http_access deny manager
http_access allow purge localhost
http_access deny purge
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access allow localhost
http_access allow all
http_reply_access allow all
icp_access allow all
cache_effective_group proxy
memory_pools off
log_icp_queries off
cachemgr_passwd q1w2e3r4 all
client_db off
buffered_logs on
redirect_program /usr/local/bin/squidGuard -c /usr/local/etc/squid/squidGuard.conf
url_rewrite_children 20 startup=10 idle=1 concurrency=0
logformat squid %tl %6tr %>a %Ss/%03>Hs %<st %rm %ru %[un %Sh/%<a %mt
access_log daemon:/var/log/squid/access.log squid

Обратите внимание ! Версия squid должна быть не ниже 3.5, где полностью переработан bumping протокола HTTPS и возможно смотреть имя домена, на которое идет соединение, до выполнения bump-а, и на основании имени домена и содержимого файла sites.https принимать решение, будет ли производится bumping и как следствие генерация динамического самопоадписаного сертификата или коннект останется не тронутым ( splicing ). Это позволяет нам не натыкаться на грабли проблемы при посещении сайтов, которые используют tls и его расширение sni для виртуального https-хостинга (несколько https-сайтов на одном ip-адресе).

 

Конфиг SQUIDGUARD :

dbhome /usr/local/etc/squid
logdir /var/log/squid
dest zapret {
    domainlist /var/db/zapret-info/denied_domains.conf
    urllist /var/db/zapret-info/denied.conf
}
acl {
    default {
       pass !zapret all
       redirect http://dnlab.ru/block/
    }
}

P.S.: Данное решение полностью готово к применению и обкатано. На текущий момент агенты РЕВИЗОР пишут что нарушений не обнаружено.

P.S.S.: Для ниосиливших, возможна поставка системы фильтрации под ключ. Пишите в личку.

 

Фильтрация по реестру Роскомнадзора.: 12 комментариев

  1. почему в файле sites есть неправильные punycode?
    [root@REESTR /tftpboot/zapret-info]# cat sites | grep xn--p1ai | wc -l
    33
    [root@REESTR /tftpboot/zapret-info]# cat sites | grep xn—p1ai | wc -l
    90

  2. #use IDNA::Punycode ;
    use URI::UTF8::Punycode ;

    sub punyencode_domain {
    my $domain = shift;

    my @puny_words = ();
    foreach my $d (split(/\./, $domain)) {
    if ($d !~ m/[a-zA-Z]/i) {
    $d = puny_enc($d) unless $d =~ m/^\d+$/;
    }
    push(@puny_words, $d);
    }
    my $result = join(‘.’, @puny_words);
    return $result;
    }

    • В последних версиях я использую следующий код punyencode_domain

      use URI ;
      use URI::Escape;
      use URI::UTF8::Punycode;
      sub punyencode_domain {
      my $domain = shift;
      my $result = URI->new(«http://».$domain)->host ;
      return $result;
      }

        • Странно, попробуйте скачать архив заново, с последними версиями — перезалил сегодня.
          И если ошибка повториться, скиньте полученный дамп из реестра, что бы мог прогнать с вашими данными.

  3. Добрый день, Юрий. Интересна ваша реализация на своей сети. Возможно ли ее обсуждение с вами через личку?

  4. Спасибо большое за статью! Реализовали у себя.
    А какую версию Squid используете и что за патчи в архиве zapret-info.tar?

    • Хм… раз такой вопрос — значит не реализовали 🙂
      Это патч для порта squidguard, который отучает его делать его URIDECODE …
      squid версии 3.5.22 вроде

  5. А как вы решаете проблему частой смены IP адреса заблокированного ресурса?К примеру, для Youtube TTL A записи составляет 5 минут.

    • странно, squidguard смотрит и исправляет ссылки с двумя слешами. В результате например у меня сейчас не открываются обе ссылки.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *