Выгрузка и блокировка сайтов РосКомНадзора через squid

Описание работы системы

Как работает система:

1. Сервер zapret скачивает список запрещенных сайтов c сервера роскомнадзора
2. Парсит его на url и ip по виду трафика (http https)
3. Создает список IP, трафик с которых нужно перенаправлять на сервер фильтрации
4. Перекидывает его по на GW, который в свою очередь перенапраляет трафик идущий на ip адреса из списка на zapret
5. сервер Zapret Http url перенаправляет на squid, https блокироует по ip через iptables. Трафик не попадающий под правила идет обратно на GW

Схема работы

%d1%81%d1%85%d0%b5%d0%bc%d0%b0_%d1%80%d0%b0%d0%b1%d0%be%d1%82%d1%8b

Суть работы данной системы для понимания дальнейшей настройки:

Трафик от абонентов идет по 996 влану (193.254.225.0/24 — статические адреса) и по 211 влану (91.233.165.0/24 — по этим ip НАТятся динамические адреса) и попадает на GW.
На GW с помощью ip route и iptables траффик перенапраляется на 250 влан и идет на zapret для фильтрации
На zapret трафик делиться на http трафик (80 порт) и https траффик (443 порт)
http идет на squid с прозрачныи прокси и при переходе на запрещенный сайт/ссылку перенаправляется на странцу блокировки (squid блокирует по url)
https идет на табицы iptables через ipset и фильтруется по IP. При переходе на запрещенный сайт/ссылку будет выдаваться ошибка соединения с сервером
(Пока эта система реализовано как указано выше, но в перспективе можно переделать на схему через squid)
Траффик который не попал под правила блокировки передается по eth0 (193.254.224.169) обратно на GW и идет по назначению.

Серверы и их роли:

GW (193.254.225.1) — наш гейтвей, через него идет весь трафик от абонентов. С него идет переадресация исходящего на запрещенный сайты трафика на zapret2
Zapret2 (193.254.224.169) — сервер фильтрации
Zapret (193.254.225.180) — сервер проверки качества фильтрации (можно реализовать на любой линуксовой машине подключеной к нашей сети)

Установка и настройка сервера zapret2

Создание и настройка виртуальной машины

На XEN создаем виртуалку она будет находиться в 212 влане т.е. 193.254.224.129 будет шлюзом

Копируем конфиг виртуалки в каталог auto для автозапуска после перезагрузки xen

Запускаем виртуалку и консолимся к ней

Устанавливаем минимальный набор для работы

Теперь можно подключаться по ssh
После установки wheezy стоит локаль «С» и некоторые символы отображаются неправильно.

меняем на

проверям sources.list

должно быть

Настройка сети

Нужно создать интерфейсы,один для приема и один передачи траффика. В нашем случае для передачи траффика обратно на GW будет использоваться основной интерфейс eth0 c ip 193.254.224.169 и шлюз по умолчанию 193.254.224.129

Устанавливаем пакет vlan

Добавляем модуль для работы вланов

перезагружаем демона нетворк

Установка Skydns

Копируем dpkg файлы

остальные для наших целей не нужны
Выполняем установку

Должен выдать ошибку зависимостей — для исправления выполнить:

Устанавливаем tcpdump (для проверки прохождения траффика через наш сервер)

создаем каталог /var/lib/skydns-zi/zapret-info/dump-latest. Для тестов будем кидать туда dump.xml, а потом все автоматизируем

Редактируем конфиг skydns

после изменения zapret-info.cfg выполнить

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

Далее настраиваем iptables

Это автоматическая настройка от skydns, с ней все работает.

Проверка работы skydns

основной скрипт для скачивания дампа и при менения всех списков на firewall

(На данном этапе можно запустить для проверки работоспособности самого скрипта, но для этого нужно кинуть файл дампа в каталог /var/lib/skydns-zi/zapret-info/dump-latest)

результат в каталоге
/var/lib/skydns-zi/zapret-info/dump-latest:
dump.xml– это XML-файл с реестром
dump.xml.sig– подпись Роскомнадзора
icapregexplist.zi– список URL, по которым сервер ICAP осуществляет фильтрацию
urllist_from_dump– список URL из реестра Роскомнадзора

Дополнительно можно проверить:

Запущена ли служба skydns-ziupdate

должна вернуть результат skydns-zi-update is running

После того как служба skydns-ziupdate в течение нескольких минут разрешит домены запрещенных ресурсов в IP-адреса, в каталоге /var/lib/skydns-zi/zi-update будут созданы файлы со списками IP-адресов.

Эти ресурсы должны быть доступны

проверить списки ipset

Проверить правила iptables

должно быть тоже самое что и в скрипте zi-firewall.sh

Проверьте, что запущена служба squid3 (слушает на порту tcp3128 на всех интерфейсах)

должна вернуть результат squid3 is running

Проверьте, что запущена служба supervisor, которая запускает пять экземпляров приложения zi-icap(слушает на адресе 127.0.0.1 на портах tcp1340-1344).

должна вернуть результат supervisor is running

должна показать, что процесс python слушает на портах с 1340 по 1344 на адресе 127.0.0.1
Вернет

На этом установка Skydns окончена

Настройка выгрузки списка запрещенных сайтов

Выгрузка списка запрещенных сайтов будет настроена на сервере zapret2

Установка и настройка openssl

Устанавливаем доп софт

На сервере создаем папку в корне: /gost-ssl
ставим openssl(1.0.1c)(Вложен в тему) на этой версии точно работает:

http://www.openssl.org
Копируем openssl-1.0.1с на сервер

Make делает долго, можно не переживать

Правим конфиг /gost-ssl/ssl/openssl.cnf

В самом верху, первой строкой пишем:

Далее добавляем в конец:

Далее проверяем работоспособность и наличие GOST (полный путь до openssl обязателен)

Подготовка сертификата

если используем руТокен (флешку с эцп), то необходимо средствами КриптоПро скопировать ключевой контейнер в реестр с возможность экспорта. Чудные товарищи из КриптоПро, ссылаясь на требования ФСБ, не поддерживают экспорт в формате PKCS#12 (сертификат + закрытый ключ), но экспорт осуществить можно при помощи: P12FromGostCSP.zip (Вложен в тему)

Подключаем USB flash устанавливаем триал крипто-про -> запускаем -> владка сервис -> кнопка Просмотреть сертификаты в контейнере -> выбираем флешку -> ОК -> Установить

Пользуясь вышеуказанной утилитой выгружаем сертификат в формате PCKS#12 и кидаем его в /gost-ssl/rzs/

P12FromGostCSP -> Выбираем сертификат из списка (должен содержать название нашей организации) -> ОК -> сохраняем в нужную директорию

проверяем, что у нас нормальный (содержит сертификат и закрытый ключ) PKCS#12 командой:

конвертируем полученный на Windows PKCS#12 в PEM:

Создание и подписание XML запроса сертификатом

создаем XML файл запроса, согласно памятке оператора (http://zapret-info.gov.ru/docs/description_for_operators_2012-11-09v1.4.pdf)

и конфертируем его при помощи icov в СP1251:

подписываем xml файл нашим сертификатом:

скидываем в Windows и проверяем валидность на http://www.gosuslugi.ru/pgu/eds/

если все впоряде, то идем дальше…

Автоматизация

Нужно для работы скриптов download.pl и download1.pl

Устанавливаем необходимые компонентов

apt-get install libxml-twig-perl
apt-get install libxml-simple-perl
apt-get install xmlstarlet

Устанавливаем SOAP, Syslog

cpan -i SOAP::Lite
cpan -i Sys::Syslog

Пока проверять не надо, о скриптах будет описано ниже

настройка сервера GW

Настраиваем переадресацию траффика на zapret с GW
Настройку проводим на сервере GW

и добавляем влан 250

Устанавливаем ipset

Создаем 3 списка

zapret и zapret2 — это два одинаковых списка, нужны для того чтобыв в момент добавления IP адресов в список блокировка не пропадала (скрипт каждый раз очищает список IP, и пока он добавит все IP заново (3 мин) IP будут доступны. Дублирование списков решает эту проблему, хотя выполнение скрипта занимает больше времени)

zapret_noblocked — это список для сайтов которые меняют IP адреса, в него IP адреса добавляются на постоянной основе. Более подробно будет описано в разделе «Проверка качества фильтрации»

Далее нужно создать правила IP route и iptables

краткая суть такая:

1. первыми правилами мы маркируем пакеты перед маршрутизацией, пришедшие с интерфейса br0 или vlan211 по протоколу tcp идущие на ip адрес из списка ipset «zapret», «zapret2» и «zapret_noblocked» на 80 или 443 порт
zapret_noblocked — на всякий случай дропаем прямо на GW, т.к. некоторые сайты используют переадресацию на другой порт и траффик проходит.

2. далее мы создаем таблицу маршрутизации 20 с маршрутом по умолчанию через IP 192.168.10.10 (это IP адрес zapret2)
3. Последней мы добавлям правило, что все пакеты маркированные 0x2 отправляются в таблицу 20, т.е через 192.168.10.10

Подробнее можно почитать тут:
https://habrahabr.ru/post/108690/
http://ubuntuhowtoo.blogspot.ru/2014/04/linux-routing.html