Сервис с периодичностью раз в несколько часов генерирует PAC-файл (Javascript-код), содержащий заблокированные домены и IP-адреса, основываясь на списке заблокированных сайтов для интернет-провайдеров, предоставляемым сторонним репозиторием zapret-info/z-i на github.com.
Доменные имена внутри списка разделяются по длине и зоне. Для доменов одной длины формируется большая переменная-строка из всех заблокированных
доменов этой длины и зоны, без каких-либо разделителей. Процедура повторяется для доменов всех длин и всех зон, после чего переменные-строки
объединяются в переменную типа словарь (dictionary), в качестве ключа которых служит доменная зона и длина домена.
Такой подход уменьшает размер PAC-файла (а он важен: в Chrome и Internet Explorer он
ограничен 1 МиБ),
уменьшает потребляемую оперативную память (ограничения есть у всех браузеров), ускоряет его обработку и поиск домена на каждый запрос.
Пример:
"news":{ ← доменная зона .news
3:"mbk",
4:"utro",
5:"vybor",
6:"rodinaaction", ← домены rodina.news, action.news, размером в 6 символов
7:"wellbetfoxfordtorpedatrashikferganaspichka",
8:"rakishevprivat24ukraines",
10:"fanserialsidrakmedya",
11:"publicpressmyrotvorets"
}
PAC-файл раздаётся с использованием технологии распределенного обмена файлами IPFS (что-то вроде BitTorrent
для WEB), через шлюзы от ipfs.io и Cloudflare, для
снижения нагрузки канала у сервера: многие неправильно написанные программы под Windows запрашивают PAC-файл очень часто, иногда даже
на каждый интернет-запрос, и не кешируют его, из-за чего суточный трафик к нему превышает 1 ТБ, с учётом сжатия и ограничений по количеству
запросов в минуту.
Как бы курьёзно это ни звучало, в некоторые дни трафик к PAC-файлу превышает суммарный трафик к заблокированным сайтам через все прокси-серверы!
PAC-файла создаётся два, отличаются они типами прокси. В nossl-файл включается только обычный HTTP-прокси без шифрования, а в ssl-файл добавляется еще и шифрованный HTTPS-прокси (HTTP-прокси с TLS-шифрованием поверх, т.н. Secure Web Proxy). Шифрование необходимо для сокрытия запрашиваемого домена от систем DPI провайдера, т.к. они часто блокируют запросы через нешифрованные прокси, а разделение на два файла сделано для работоспособности программ, не поддерживающих шифрованный вариант. Выбор файла осуществляется по заголовку User-Agent запрашиваемого клиента.
Исходный код генератора PAC-файла доступен в репозитории antizapret-pac-generator-light.
На прокси-серверах используется ПО Squid, с доступом только к заблокированным доменам и IP-адресам.
В отличие от обычных VPN, осуществляющих перенаправление отдельных IP-адресов или диапазонов средствами маршрутизации ОС, VPN АнтиЗапрета использует маршрутизацию на основе доменных имен, с помощью специального DNS-сервера, созданного для этой цели.
На VPN-сервере запущен специальный DNS-резолвер, устанавливающий отображение (соответствие, маппинг) настоящего IP-адреса домена в свободный IP-адрес большой внутренней подсети, и отдающий запрашиваемому клиенту адрес из внутренней подсети.
У такого подхода есть множество преимуществ:
Схематичное представление:
📱 — Клиент
🖥 — VPN и DNS-сервер
🖧 — Интернет
📱 → rutracker.org? → 🖥
🖥 → rutracker.org? → 🖧
🖥 ← 195.82.146.214 ← 🖧
10.224.0.1 → 195.82.146.214
📱 ← 10.224.0.1 ← 🖥
Готовый для установки контейнер и его исходный код доступны в репозитории antizapret-vpn-container.