[Из песочницы] Прокси сервер для свободного интернета

Однажды мне окончательно надоели странички вроде «данный ресурс заблокирован по требованию», которые стали попадаться все чаще и чаще. А еще все больше стало упоминаний про «глубинный интернет», i2p, tor, onion, анонимные p2p сети и вообще повеяло хакерской романтикой детства, когда интернет был чем-то загадочным и был доступен только с двух часов ночи со скоростью 31200…В общем, была поставлена цель: сделать прокси сервер, через который можно заходить на любые сайты (включая сайты в доменах .i2p и .onion) в обход любых блокировок. Цель обеспечения анонимности не ставилась.

Ужа с ежом удалось скрестить, и вот теперь я, как и 17 лет назад, исследую глубинные слои интернета. Кстати, если говорить про i2p, то скорость по ощущениям не намного больше, чем у интернета 17 лет назад. История циклична.

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

Как это работает:

Основным прокси сервером явлется squid.Через cache_peer (вышестоящий прокси) squid подключается к i2p и tor. tor является Socks прокси, а squid — http прокси, поэтому между squid и tor встраивается прослойка privoxy.Также мы имеем обновляемый ACL список всех заблокированных ресурсов в русском интернете.Squid обрабатывает запросы от браузеров следующим образом: Если запрашивается URL в домене .i2p, то запрос передается по цепочке в i2p.Если запрашивается URL в домене .onion, то запрос передается по цепочке в tor.Если запрашивается запрещенный URL, то запрос передается по цепочке в tor.Все остальные запросы отправляются напрямую самим squid.

Инструкция как сделать интернет без ограничений своими руками: В качестве ОС использовалась FreeBSD 10. При наличии рук можно то же самое реализовать на любой *NIX системеПО: Squid, tor, i2p, git (не обязательно).Для работы I2P может потребоваться пробросить порты с шлюза, если ваш прокси не имеет публичного IP адреса.В системе только один сетевой интерфейс с ip адресом 192.168.33.192

Для начала убеждаемся, что у нас стоят все обновления на систему и порты, выставлен правильный часовой пояс и время синхронизировано с мировым.

Ставим программы из портовУстановленные порты до начала установки: compat6x-amd64–6.4.604000.200810_3 Convenience package to install the compat6x librariesdialog4ports-0.1.5_2 Console Interface to configure portsperl5.16–5.16.3_18 Practical Extraction and Report Languagepkg-1.4.4 Package managerportmaster-3.17.7 Manage your ports without external databases or languages

Установка, для всех портов все опции по умолчанию. Возможно потребуется вручную скачать дистрибутив java. Также желающие могут поставить через pkg install.

root@freedom_proxy:~ # portmaster -D www/squid root@freedom_proxy:~ # portmaster -D security/tor root@freedom_proxy:~ # portmaster -D security/i2p root@freedom_proxy:~ # portmaster -D www/privoxy Если будем использовать GIT, то в дополнение ставим: root@freedom_proxy:~ # portmaster -D textproc/xmlcatmgr root@freedom_proxy:~ # portmaster -D devel/git Получаем установленные версии программ: squid-3.4.10_2tor-0.2.5.10_1i2p-0.9.16privoxy-3.0.22В файл /etc/rc.conf прописываем:

i2p_enable=«YES» i2p_user=«i2p» squid_enable=«YES» tor_enable=«YES» privoxy_enable=«YES» Настраиваем i2p: Создаем пользователя i2p: root@freedom_proxy:~ # adduser Username: i2p Full name: i2p Uid (Leave empty for default): Login group [i2p]: Login group is i2p. Invite i2p into other groups? []: Login class [default]: Shell (sh csh tcsh nologin) [sh]: Home directory [/home/i2p]: Home directory permissions (Leave empty for default): Use password-based authentication? [yes]: Use an empty password? (yes/no) [no]: Use a random password? (yes/no) [no]: yes Lock out the account after creation? [no]: Становимся пользователем i2p и делаем первичную настройку: root@freedom_proxy:~ # su — i2p $ /usr/local/sbin/i2prouter install $ exit В FreeBSD 10 i2p правильно не заработает, выдаст ошибку «The current version of the Tanuki wrapper does not support FreeBSD 10», поэтому в файле /usr/local/etc/rc.d/i2pменяем строчку command=»/usr/local/sbin/i2prouter» на строчку command=»/home/i2p/i2p/runplain.sh» , а в файле /home/i2p/i2p/runplain.shменяем строчку I2PTEMP=»%SYSTEM_java_io_tmpdir» на I2PTEMP=»/tmp» Запускаем i2p: root@freedom_proxy:~ # /usr/local/etc/rc.d/i2p start Проверяем, что процесс запустился, в списке процессов должна присутствовать java: root@freedom_proxy:~ # ps -au | grep java i2p 26809 3.0 3.3 1255096 139080 0 S 1:15PM 0:10.15 /usr/local/openjdk7/bin/java в файл /etc/hosts прописываем 127.0.0.1 localhost localhost.my.domain i2pconsole Эта строчка нужна для доступа к консоли управления i2p из браузера.Настраиваем TORв файле /usr/local/etc/tor/torrc раскомментируем строчку

RunAsDaemon 1 Создадим недостающие каталоги и запустим tor: root@freedom_proxy:~ # touch /var/log/tor root@freedom_proxy:~ # chmod 666 /var/log/tor root@freedom_proxy:~ # mkdir /var/run/tor/ root@freedom_proxy:~ # /usr/local/etc/rc.d/tor start Настраиваем Privoxyprivoxy нам нужен в качестве моста между Squid и Torв файле /usr/local/etc/privoxy/configменяем listen-address 127.0.0.1:8118 на listen-address 192.168.33.192:8118 Эта замена необходима для squid. squid привязывает cache-peer к ip адресу и не может иметь больше одного cache-peer на адресе 127.0.0.1Затем находим фрагмент с примерами forward и добавляем строку

forward-socks4a / 127.0.0.1:9050 . Точка в конце строки обязательна! Запускаем privoxy:

root@freedom_proxy:~ # /usr/local/etc/rc.d/privoxy start Настраиваем SquidВ начало файла /usr/local/etc/squid/squid.conf прописываем строки: acl russia_block_urls url_regex »/usr/local/etc/squid/zapret-urls.txt» acl i2p_urls url_regex -i .*://.*\.i2p\/.* acl onion_urls url_regex -i .*://.*\.onion\/.*

cache_peer 127.0.0.1 parent 4444 4444 no-digest allow-miss no-query cache_peer_access 127.0.0.1 allow i2p_urls

cache_peer 192.168.33.192 parent 8118 8118 no-digest allow-miss no-query cache_peer_access 192.168.33.192 allow onion_urls cache_peer_access 192.168.33.192 allow russia_block_urls

never_direct allow onion_urls never_direct allow i2p_urls never_direct allow russia_block_urls never_direct deny all always_direct deny onion_urls always_direct deny i2p_urls always_direct deny russia_block_urls always_direct allow all Создаем пустой файл /usr/local/etc/squid/zapret-urls.txt root@freedom_proxy:~ # touch /usr/local/etc/squid/zapret-urls.txt Запускаем squid. root@freedom_proxy:~ # /usr/local/etc/rc.d/squid start Настраиваем закачку списка запрещенных URLБудем использовать в качестве источника сайт https://antizapret.info, а вернее регулярно обновляемый csv список, доступный через git-hub https://github.com/zapret-info/z-iВариант с использованием gitroot@freedom_proxy:~ # mkdir /root/zapret-infoСоздаем файл /root/zapret-info/getzapretinfo.sh

#!/bin/sh cd /root/zapret-info/zapret-info rm -rf z-i /usr/local/bin/git clone https://github.com/zapret-info/z-i.git cat z-i/dump.csv | sed 1d | cut -d ';' -f 3 | tr »\|» »\n» |sed 's/^[ \t]*//; s/[ \t]*$//' |uniq > /usr/local/etc/squid/zapret-urls.txt Делаем файл исполняемым: root@freedom_proxy:~ # chmod +x /root/zapret-info/getzapretinfo.sh Вариант без git и временных файлов: fetch -o — https://raw.githubusercontent.com/zapret-info/z-i/master/dump.csv | sed 1d | cut -d ';' -f 3 | tr »\|» »\n» |sed 's/^[ \t]*//; s/[ \t]*$//' |uniq > /usr/local/etc/squid/zapret-urls.txt В обоих вариантах мы получаем из интернета файл dump.csv, затем производим с ним действия: «sed 1d» — отрезаем первую строку«cut -d ';' -f 3» — вырезаем все, кроме третьей колонки.tr »\|» »\n» — заменяем символ | на символ переноса строкиsed 's/^[ \t]*//; s/[ \t]*$//' — обрезаем пробелы и табуляциюuniq — удаляем дублирующиеся строки.Результат записываем в /usr/local/etc/squid/zapret-urls.txtв crontab прописываем резулярное обновление файла:

1 2 * * * root fetch -o — https://raw.githubusercontent.com/zapret-info/z-i/master/dump.csv | sed 1d | cut -d ';' -f 3 | tr »\|» »\n» |sed 's/^[ \t]*//; s/[ \t]*$//' |uniq > /usr/local/etc/squid/zapret-urls.txt Проверяем работу прокси: В любимом браузере прописываем прокси сервер 192.168.33.192 порт 3128 и начинаем проверять.

Заходим на адрес http://hideme.ru/ip/ и смотрим что указано в пункте прокси, должно быть что-то вроде «Вы используете прокси-сервер 1.1 localhost (squid/3.4.10) и ваш настоящий IP: XX.XX.XX.XX«Squid работает.

Теперь проверяем работу TOR.Заходим на сайт http://thehiddenwiki.org или гуглим адрес на котором сейчас живет hidden wiki и затем пытаемся зайти по любой из ссылок .onion, например http://3g2upl4pq6kufc4m.onion/ — это поисковая система.http://zqktlwi4fecvo6ri.onion/wiki/index.php/Main_Page — нецензурированный каталог onion сайтов c преферансомъ и куртизанками.Если все настроено правильно, мы увидим искомую страницу.Если прокси выдал ошибку «Соединение с 192.168.33.192 не удалось» — у нас не запущен privoxy, либо некорректно настроена связка squid — privoxy.Если мы видим ошибку 503 от privoxy (Privoxy was unable to socks4a-forward your request), то возможны два варианта: мы ввели адрес несуществующего сервера, либо проблемы с tor. Для точной диагностики рекомендуется проверить десяток onion ссылок. Если ни одна на работает — внимательно читаем файл ошибок tor.

Проверяем работу i2p: Заходим по адресу http://i2pconsole:7657/homeСлева под логотипом i2p указан статус сети. Если статус OK или Firewalled — можно работать. Статус Testing держится некоторое время после запуска i2p.

Cмотрим внизу список рекомендуемых сайтов в разделе Eepsites of Interest.Пробуем зайти по ссылкам: http://plugins.i2p/http://anoncoin.i2p/

Для настройки i2p заходим на адрес http://i2pconsole:7657/console

Финальным этапом тестирования проверяем обход блокировок: идем на сайт https://antizapret.info/, смотрим список запрещенных ресурсов и пытаемся зайти на несколько выборочных. Страницы должны грузиться без каких-либо проблем.

Ура! Теперь интернет стал больше!

© Habrahabr.ru