Не так давно я серфил форумы по причине нововведений от РКН, в их «закон», который кроме нецензурных фраз у меня ни чего не вызывает, но тем не менее эти законы мы обязаны исполнять. И обнаружил, что мои коллеги используют просто ужасные методы для блокировки сайтов. Я решил поделиться своим методом, который не только блокирует по url, но и умеет закрывать https.
Сразу скажу, что я не знаю выкладывал ли кто то подобное в сеть, я до всего дошел сам.
Что же нам понадобиться? Ни каких дорогущих проприетарных решений, от cisco и им подобным, не пугайтесь. Вообще говоря, хочется сказать несколько теплых слов всем тем кто работает по GNU и opensource. Большое ВАМ человеческое спасибо и низкий поклон. ИМХО opensource в переди планеты всей и я считаю за ним будущее. И эта статья очередное подтверждение тому.
Идея состоит в следующем:
Мы формируем уникальный список блокируемых IP в ipset. Далее в NAT PREROUTING добавляем правила. Если IP назначения в списке, тогда заворачиваем на наш прозрачный прокси, где уже осуществляем фильтр по URL.
И так из инструментов — ipset, iptables, squid (ssl bump).
Я не случайно пел дифирамбы opensource, дело в том что на сегодня только squid предложил технологию которая позволяет заглядывать в https(мне по крайней мере других не известно). А ipset демонстрирует высочайшую скорость работы и держит тысячи правил не нагружая процессор и не ухудшая отклик сети.
Вкратце опишу процесс получения выгрузки. Качаем программу P12FromGostCSP, с её помощью выдираем закрытый ключ. Затем конвертируем его в pem.
На всякий случай проверяем срок действия
Далее собираем openssl с поддержкой гостовского алгоритма. Как это сделать, много написано в интернете. В подробности углубляться не буду.
Сам скрипт, который получает выгрузку.(Автором скрипта и xml-парсера я не являюсь, мною только переписан он под формат 2) Скрипт необходимо вызвать с параметрами 0 и 1 с необходимым интервалом.
Таким образом результатом работы скрипта является наличие 3-ех файлов
В общем наша задача получить IP — адреса и url в отдельных файлах.
Данные для работы у нас есть, теперь необходимо реализовать механизм.
Качаем актуальную версию кальмарчика www.squid-cache.org/Versions
Распаковываем и компилируем:
По умолчанию squid ставиться в /usr/local/squid
Файл конфигурации соответственно /usr/local/squid/etc
acl — запрета соответственно /usr/local/squid/etc/acls
Генерируем сертификаты
Далее привожу пример своего конфигурационного файла:
Теперь необходимо составить список acls, я использую вот такой скрипт
Идея состоит в том, что бы добавить в конец каждой url ".*" — это означает любую последовательность символов. Например «casino.com.*» будет блокироваться домен и все ссылки включая этот домен.
Необходимо выполнить еще несколько комманд:
На этом со сквидом закончим.
Теперь нам необходимо как то «запрещенный трафик» завернуть на фильтрацию.
Для этого мы создаем в ipset две цепочки: ZAPRET — уникальный список блокируемых IP, ZAPRETNET — список блокируемых подсетей.
Создаем сами правила при помощи iptables
Теперь нам нужно заполнить списки ipset-а. Привожу свой скрипт:
На этом все, открываем браузер и пытаемся выйти на запрещенный ресурс. Должны увидеть сообщение squid-a, что доступ запрещен. Что то типа этого:
Для красоты сюжета заменяем файлы:
На свою страничку блокировки типа — «извините ресурс заблокирован согласно закона ....».
PS Данный метод блокировки проверен в боевых условиях и работает на реальных серверах по сей день. При этом ping не увеличился ни на миллисекунду. Особой разницы в загрузки процессора я тоже не заметил. Поскольку РКН очень ревностно относится к получению выгрузки, в скрипте можно раскомментировать строку:
Заменив естественно телефон и адрес почты на свои. Вам буде приходить смс оповещение и оповещение на почту. Для первого я использую разлоченый мегафон модем Huawei e1550+gammu, для второго необходимо настроить например exim4. Так же необходимо вписать реквизиты своей организации в сам скрипт.
PS Поскольку я так понял что добрая половина вообще не представляет о чем идет речь, я решил дать разъяснение. Ряд законов обязывает, я подчеркиваю каждый оператор обязан это делать и это не их прихоть! И санкции за его не выполнение очень жестокие в плоть до отзыва лицензии! За банальное не неполучение выгрузки раз в день накладывают штраф в десятки тысяч. А у нас например директор «подарил» его человеку ответственному за выгрузку с рассрочкой в пол года.
Вот перечень законов, кому интересно можете почитать:
Я привел лишь метод который максимально «сглаживает», последствия этих законов. И позволяет не потерять доступ к хосту с заблокированным url-ом.
Не весь ваш https трафик проходит через прокси, а только тот который идет на заблокированный IP. Ко всем остальным https сайтам вы по прежнему имеете доступ без ограничений.
Вас ни кто не собирается обманывать, вы видите левый сертификат и ваше право от него отказаться и не посещать отслеживаемый ресурс. Для рядового пользователя это возможность полноценно пользоваться остальными не заблокированными ресурсами этого хостера на блокированном IP. Все жалобы пожалуйста сюда rkn.gov.ru, а из меня не надо делать зло вселенского масштаба.
Сразу скажу, что я не знаю выкладывал ли кто то подобное в сеть, я до всего дошел сам.
Что же нам понадобиться? Ни каких дорогущих проприетарных решений, от 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, что доступ запрещен. Что то типа этого:
Для красоты сюжета заменяем файлы:
/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, а из меня не надо делать зло вселенского масштаба.