*nix
12 March 2015

Блокировка запрещенных ресурсов РКН по url в том числе и https

Не так давно я серфил форумы по причине нововведений от РКН, в их «закон», который кроме нецензурных фраз у меня ни чего не вызывает, но тем не менее эти законы мы обязаны исполнять. И обнаружил, что мои коллеги используют просто ужасные методы для блокировки сайтов. Я решил поделиться своим методом, который не только блокирует по url, но и умеет закрывать https.

Сразу скажу, что я не знаю выкладывал ли кто то подобное в сеть, я до всего дошел сам.

Что же нам понадобиться? Ни каких дорогущих проприетарных решений, от cisco и им подобным, не пугайтесь. Вообще говоря, хочется сказать несколько теплых слов всем тем кто работает по GNU и opensource. Большое ВАМ человеческое спасибо и низкий поклон. ИМХО opensource в переди планеты всей и я считаю за ним будущее. И эта статья очередное подтверждение тому.

Идея состоит в следующем:
Мы формируем уникальный список блокируемых IP в ipset. Далее в NAT PREROUTING добавляем правила. Если IP назначения в списке, тогда заворачиваем на наш прозрачный прокси, где уже осуществляем фильтр по URL.

И так из инструментов — ipset, iptables, squid (ssl bump).
Я не случайно пел дифирамбы opensource, дело в том что на сегодня только squid предложил технологию которая позволяет заглядывать в https(мне по крайней мере других не известно). А ipset демонстрирует высочайшую скорость работы и держит тысячи правил не нагружая процессор и не ухудшая отклик сети.

Вкратце опишу процесс получения выгрузки. Качаем программу P12FromGostCSP, с её помощью выдираем закрытый ключ. Затем конвертируем его в pem.

$/gost-ssl/bin/openssl pkcs12 -in p12.pfx -out provider.pem -nodes -clcerts

На всякий случай проверяем срок действия
$openssl x509 -in provider.pem -noout -dates

Далее собираем openssl с поддержкой гостовского алгоритма. Как это сделать, много написано в интернете. В подробности углубляться не буду.

Сам скрипт, который получает выгрузку.(Автором скрипта и xml-парсера я не являюсь, мною только переписан он под формат 2) Скрипт необходимо вызвать с параметрами 0 и 1 с необходимым интервалом.
Таким образом результатом работы скрипта является наличие 3-ех файлов
ip-abuse.txt — список IP
url-abuse.txt — блокируемые url
subnet-abuse.txt — блокируемые подсети

В общем наша задача получить IP — адреса и url в отдельных файлах.
Данные для работы у нас есть, теперь необходимо реализовать механизм.
Качаем актуальную версию кальмарчика www.squid-cache.org/Versions
Распаковываем и компилируем:
$./configure --enable-ssl --enable-ssl-crtd --with-openssl
$make
$sudo make install

По умолчанию squid ставиться в /usr/local/squid
Файл конфигурации соответственно /usr/local/squid/etc
acl — запрета соответственно /usr/local/squid/etc/acls

Генерируем сертификаты
openssl req -new -newkey rsa:1024 -days 3650 -nodes -x509 -keyout myCA.pem -out myCA.pem;
openssl x509 -in myCA.pem -outform DER -out myCA.der

Далее привожу пример своего конфигурационного файла:
acl deny_url url_regex -i "/usr/local/squid/etc/acls/zapret"
http_access deny deny_url
http_access allow all

dns_v4_first on

http_port 10.20.0.1:3128 transparent
http_port 3128

#HTTPS
https_port 10.20.0.1:3129  transparent ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/usr/local
/squid/etc/myCA.pem

sslproxy_flags DONT_VERIFY_PEER
sslproxy_cert_error allow all
always_direct allow all

ssl_bump client-first all
ssl_bump server-first all

ssl_bump none all
sslcrtd_program /usr/local/squid/libexec/ssl_crtd -s /usr/local/squid/var/lib/ssl_db -M 4MB
#sslcrtd_children 5

refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320

Теперь необходимо составить список acls, я использую вот такой скрипт
#!/bin/bash
> /usr/local/squid/etc/acls/zapret
cat /gost-ssl21/rzs/dump/url-abuse.txt | sort | uniq |  while read LINE; do
echo $LINE'.*' >>  /usr/local/squid/etc/acls/zapret
done ;
cat /root/ZAPRET/prokur | sort | uniq >>  /usr/local/squid/etc/acls/zapret ;
/usr/local/squid/bin/squid -k reconfigure
exit 0

Идея состоит в том, что бы добавить в конец каждой url ".*" — это означает любую последовательность символов. Например «casino.com.*» будет блокироваться домен и все ссылки включая этот домен.
Необходимо выполнить еще несколько комманд:
mkdir /usr/local/squid/var/lib
/usr/local/squid/libexec/ssl_crtd -c -s /usr/local/squid/var/lib/ssl_db

На этом со сквидом закончим.

Теперь нам необходимо как то «запрещенный трафик» завернуть на фильтрацию.
Для этого мы создаем в ipset две цепочки: ZAPRET — уникальный список блокируемых IP, ZAPRETNET — список блокируемых подсетей.
ipset -N ZAPRETNET hash:net
ipset -N ZAPRET hash:ip

Создаем сами правила при помощи iptables
#Заворачиваем на прокси
iptables -t nat -A PREROUTING -s «подсеть абонентов» -p tcp -m set --match-set ZAPRET dst -m tcp --dport 80 -j DNAT --to-destination «proxy IP»:3128
iptables -t nat -A PREROUTING -s «подсеть абонентов» -p tcp -m set --match-set ZAPRET dst -m tcp --dport 443 -j DNAT --to-destination «proxy IP»:3129
#Блокируем всю подсеть
iptables -A FORWARD -s «подсеть абонентов» -m set --match-set ZAPRETNET dst -j DROP

Теперь нам нужно заполнить списки ipset-а. Привожу свой скрипт:
#!/bin/bash
FILENAME="create_ruls"
> $FILENAME ;
echo 'if [ -z "`ipset -L | grep ZAPRET`" ] ;' >> $FILENAME
echo 'then' >>$FILENAME
echo 'ipset -N ZAPRET hash:ip' >> $FILENAME
echo 'else' >>$FILENAME
echo 'ipset -F ZAPRET' >> $FILENAME
echo 'fi' >>$FILENAME

echo 'if [ -z "`ipset -L | grep ZAPRETNET`" ] ;' >> $FILENAME
echo 'then' >>$FILENAME
echo 'ipset -N ZAPRETNET hash:net' >> $FILENAME
echo 'else' >>$FILENAME
echo 'ipset -F ZAPRETNET' >> $FILENAME
echo 'fi' >>$FILENAME

cat /gost-ssl21/rzs/dump/ip-abuse.txt | sort | uniq | while read LINE; do
echo ipset -A ZAPRET $LINE >> $FILENAME
done ;

cat /gost-ssl21/rzs/dump/subnet-abuse.txt | sort | uniq | while read LINE; do
echo ipset -A ZAPRETNET $LINE >> $FILENAME
done ;

$sudo ./create_ruls

На этом все, открываем браузер и пытаемся выйти на запрещенный ресурс. Должны увидеть сообщение squid-a, что доступ запрещен. Что то типа этого:
image
Для красоты сюжета заменяем файлы:
/usr/local/squid/share/errors/en/ERR_ACCESS_DENIED
/usr/local/squid/share/errors/ru/ERR_ACCESS_DENIED

На свою страничку блокировки типа — «извините ресурс заблокирован согласно закона ....».

PS Данный метод блокировки проверен в боевых условиях и работает на реальных серверах по сей день. При этом ping не увеличился ни на миллисекунду. Особой разницы в загрузки процессора я тоже не заметил. Поскольку РКН очень ревностно относится к получению выгрузки, в скрипте можно раскомментировать строку:
system("/usr/bin/gammu sendsms TEXT 7910xxxxxxx -len 400 -text 'Get data'; echo 'Выгрузка из РКН получена' | mail -s 'Выгрузка из РКН получена' kopita\@mail.ru");

Заменив естественно телефон и адрес почты на свои. Вам буде приходить смс оповещение и оповещение на почту. Для первого я использую разлоченый мегафон модем Huawei e1550+gammu, для второго необходимо настроить например exim4. Так же необходимо вписать реквизиты своей организации в сам скрипт.

PS Поскольку я так понял что добрая половина вообще не представляет о чем идет речь, я решил дать разъяснение. Ряд законов обязывает, я подчеркиваю каждый оператор обязан это делать и это не их прихоть! И санкции за его не выполнение очень жестокие в плоть до отзыва лицензии! За банальное не неполучение выгрузки раз в день накладывают штраф в десятки тысяч. А у нас например директор «подарил» его человеку ответственному за выгрузку с рассрочкой в пол года.
Вот перечень законов, кому интересно можете почитать:
Федеральным законом №139-ФЗ от 28 июля 2012 года были внесены изменения в следующие законы Российской Федерации:
Федеральный закон от 29 декабря 2010 года №436-ФЗ «О защите детей от информации, причиняющей вред их здоровью и развитию»;
Кодекс Российской Федерации об административных правонарушениях;
Федеральный закон от 7 июля 2003г. №126-ФЗ«О связи»;
Федеральный закон от 27 июля 2006г. №149-ФЗ «Об информации, информационных технологиях и о защите информации».


Я привел лишь метод который максимально «сглаживает», последствия этих законов. И позволяет не потерять доступ к хосту с заблокированным url-ом.
Не весь ваш https трафик проходит через прокси, а только тот который идет на заблокированный IP. Ко всем остальным https сайтам вы по прежнему имеете доступ без ограничений.
Вас ни кто не собирается обманывать, вы видите левый сертификат и ваше право от него отказаться и не посещать отслеживаемый ресурс. Для рядового пользователя это возможность полноценно пользоваться остальными не заблокированными ресурсами этого хостера на блокированном IP. Все жалобы пожалуйста сюда rkn.gov.ru, а из меня не надо делать зло вселенского масштаба.

-19
34.6k 83
Comments 70
Top of the day