Updated 12.04.2017 изменение в механизмах фильтрации SSL-трафика. Обновлены все скрипты и конфиги.
И снова здравствуйте.
И так, описанная ранее система фильтрации, по мере роста показала свою полную непригодность, поэтому начинаем все заново.
По мере роста реестра (в него начали вносить по моему все подряд), сильно разрослись ACL на CISCO, в результате процесс FMCore начал выполнятся по часу, с падением нейборов WCCP, BGP и всеми прочими прелестями. Поэтому было принято решение полностью отказаться от использования WCCP в CISCO и перейти на инжект роутингов по BGP.
В текущий момент у меня работает в боевом режиме следующая конструкция :
- 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.: Для ниосиливших, возможна поставка системы фильтрации под ключ. Пишите в личку.
почему в файле 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
#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;
}
Unrecognized character \x{ab}; marked by new(<— HERE near column 28 at /tftpboot/zapret-info/bin/xml-parser.pl
Странно, попробуйте скачать архив заново, с последними версиями — перезалил сегодня.
И если ошибка повториться, скиньте полученный дамп из реестра, что бы мог прогнать с вашими данными.
Добрый день, Юрий. Интересна ваша реализация на своей сети. Возможно ли ее обсуждение с вами через личку?
Да, конечно … Skype : yuri_ppp
Спасибо большое за статью! Реализовали у себя.
А какую версию Squid используете и что за патчи в архиве zapret-info.tar?
Хм… раз такой вопрос — значит не реализовали ?
Это патч для порта squidguard, который отучает его делать его URIDECODE …
squid версии 3.5.22 вроде
А как вы решаете проблему частой смены IP адреса заблокированного ресурса?К примеру, для Youtube TTL A записи составляет 5 минут.
вылезла небольшая проблема,
в реестр внесена ссылка с двумя слэшами
http://img.booru.org/ii//images/7/2a36253ef67849913e2d7b1f846a8fff0180c6a8.png
после обработки в файл для squidGuard уже с одним слэшем
http://img.booru.org/ii/images/7/2a36253ef67849913e2d7b1f846a8fff0180c6a8.png
и squidGuard пропустил
странно, squidguard смотрит и исправляет ссылки с двумя слешами. В результате например у меня сейчас не открываются обе ссылки.
кто-нть может пояснить зачем нужен squidguard — когда, штатно squid умеет фильтровать по http_access deny
.