Прокси сервер для свободного интернета

Однажды мне окончательно надоели странички вроде «данный ресурс заблокирован по требованию», которые стали попадаться все чаще и чаще. А еще все больше стало упоминаний про «глубинный интернет», 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 libraries
dialog4ports-0.1.5_2 Console Interface to configure ports
perl5.16-5.16.3_18 Practical Extraction and Report Language
pkg-1.4.4 Package manager
portmaster-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_2
tor-0.2.5.10_1
i2p-0.9.16
privoxy-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

Настраиваем Privoxy
privoxy нам нужен в качестве моста между 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

Вариант с использованием git
root@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/, смотрим список запрещенных ресурсов и пытаемся зайти на несколько выборочных. Страницы должны грузиться без каких-либо проблем.

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

Категория: