В этой статье будет рассказано, как пробросить весь трафик операционной системы через TOR так, чтобы о наличии TOR-а операционная система даже не подозревала.
Это поможет не думать о бесконечных настройках прокси и onion, перестать бояться на тему «а не сливает ли торрент клиент мой реальный IP адрес, так как не полностью поддерживает прокси?» и, наконец, быть застрахованным от законодательного запрета TOR-а в России.
Когда я говорю «TOR», я подразумеваю «TOR и I2P». По схожей методике сюда можно подключить любой даркнет.
Статья — «чисто конкретная». Теория уже неплохо изложена в статье Pandos 'а habrahabr.ru/post/204266/. В данном тексте будет дана детальная инструкция «как сделать, чтобы работало».
Постановка задачи
1. Мой компьютер должен по нажатию одной кнопки переходить в режим «весь трафик — не русский».
2. По нажатию второй кнопки он должен переходить в режим «весь траффик идет через TOR»
3. Третья кнопка — для I2P.
4. Входная TOR-нода должна находиться за рубежом.
5. Все это должно работать под linux, windows, android. Заранее: с OS X и iPhone тоже все в порядке, просто у меня их нету, так что протестить не смогу.
Дисклеймер
Использование tor over vpn не обязательно повышает анонимность. Подробнее: trac.torproject.org/projects/tor/wiki/doc/TorPlusVPN. В данной статье описывается средство, которое, тем не менее, нужно применять с умом.
Хостинг
Первым делом нам понадобится сравнительно дешевая VPS-ка, владельцы которой не против, чтобы там крутился TOR (и не русская, разумеется). Лично я использую DigitalOcean. В их ToS не специфицирован запрещенный трафик (хотя если будете качать пиратские торренты прямо с их IP — заблокируют на раз. Ну, собственно, нам для этого и нужен TOR...). Стоит это 5$ в месяц.
Регистрироваться можно прямо тут: www.digitalocean.com/?refcode=82e536b1a24d (ссылка реферальная, вам $10, мне $25. Не хотите играть в это дело — уберите refcode).
Если Вы знаете лучшие или хотя бы не худшие варианты
Я не буду описывать конкретную процедуру создания VPS-ки, так как это зависит от
ssh root@1.2.3.4
и получить shell на VPS-ку. Я буду считать, что на VPS-ке крутится debian 7. По крайней мере, эта статья тестировалась на debian 7. На убунте тоже заработает, наверное.
Установка пакетов
Сначала немного приложений, которые облегчают нам жизнь. Не забудьте поставить ваш любимый редактор, mc если нужно и т.п.
apt-get update
apt-get upgrade # Если с обновлением придет новое ядро -- перезагрузитесь!
apt-get install fail2ban unattended-upgrades etckeeper # я всегда ставлю это на новый сервер
I2P нету в репозитории debian, так что придется добавить новый источник.
echo "deb http://deb.i2p2.no/ wheezy main" >> /etc/apt/sources.list.d/i2p.list
echo "deb-src http://deb.i2p2.no/ wheezy main" >> /etc/apt/sources.list.d/i2p.list
apt-get update
apt-get install i2p-keyring
apt-get update
Теперь поставим основные пакеты — TOR, VPN и I2P. Также нам пригодится DNS сервер. Я использую unbound.
apt-get install tor i2p unbound openvpn privoxy
Настройка VPN
Я буду держать все настройки VPN в /opt/vpn. Для начала следует сгенерировать сертификаты для сервера и клиента.
N.B. Мы будем запускать несколько серверов (один под tor, второй под обычный трафик) и использовать для них один и тот же сертификат. Это не обязательно. Вполне можно (и нужно) генерировать независимый сертификат или даже свою CA для каждого из openvpn серверов.
mkdir /opt/vpn
mkdir /opt/vpn/log
cp -rf /usr/share/doc/openvpn/examples/easy-rsa/2.0/ /opt/vpn/rsa # Это набор скриптов для создания ключей. Можно и без них, но сложно.
Теперь сгенерируем новую CA и необходимые сертификаты.
cd /opt/vpn/rsa
. ./vars
./clean-all
./build-ca # Спросит кучу вопросов. Отвечайте что угодно.
./build-key-server server # Опять куча вопросов. Пароля не вводите. На забудьте подписать сертификат в конце
./build-key --batch client # Уффф. Хоть тут не спрашивает ничего.
./build-dh
Изучите папку /opt/vpn/rsa/keys. Теперь там есть несколько пар ключ+сертификат.
ca.{crt,key} — certificate authority
server.{crt,key} — ключ сервера
client.{crt,key} — ключ клиента.
Клиенту нужно отдать только ca.crt, client.crt и client.key, остальные файлы должны оставаться только на сервере.
Пора писать конфигурационный файл для сервера. Положите его в /etc/openvpn/00-standard.conf
port 1201
proto udp
dev tun
ca /opt/vpn/rsa/keys/ca.crt
cert /opt/vpn/rsa/keys/server.crt
key /opt/vpn/rsa/keys/server.key
dh /opt/vpn/rsa/keys/dh1024.pem
# Server Routing
# server-bridge 10.8.1.1 255.255.255.0 10.8.1.50 10.8.1.100
server 10.8.1.0 255.255.255.0
#Client configuration
push "redirect-gateway def1"
push "dhcp-option DNS 8.8.8.8"
keepalive 10 120
comp-lzo
persist-key
persist-tun
log /opt/vpn/log/server-standard.log
status /opt/vpn/log/status-standard.log
verb 3
Попробуйте запустить openVPN
/etc/init.d/openvpn restart
Если не получилось — у вас баг: bugs.debian.org/cgi-bin/bugreport.cgi?bug=767836#43 Поправьте согласно инструкции и добейтесь успешного запуска сервера.
ОК, VPN работает. Самое время подключиться к нему. Для этого на клиенте напишем конфиг-файл:
client
dev tun
proto udp
# Тут должен быть реальный внешний IP адрес сервера
remote 1.2.3.4 1201
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
verb 3
up /etc/openvpn/update-resolv-conf
down /etc/openvpn/update-resolv-conf
<ca>
[Вставьте сюда содержимое ca.crt]
</ca>
<cert>
[Вставьте сюда содержимое client.crt]
</cert>
<key>
[Вставьте сюда содержимое client.key]
</key>
Теперь попробуйте подключиться
sudo openvpn --config client.conf --script-security 2
После появления надписи «Initialization Sequence Completed» вы подключены и должны успешно пинговать 10.8.1.1. Интернет пропадет, это нормально.
Настройка интернета
Допустим, мы не хотим использовать TOR, а просто хотим себе не русский внешний IP. В этом случае при помощи вот этого скрипта:
#!/bin/bash
SUBNET=10.8.1.0/24
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -s $SUBNET -o eth0 -j MASQUERADE
вы достигнете желаемого. Перепишите это в /etc/rc.local.
Настройка TOR
Теперь допустим, что вы таки хотите VPN через TOR (и предыдущий пункт не выполняли). Тогда:
допишите в конец /etc/tor/torrc следующее:
VirtualAddrNetworkIPv4 10.192.0.0/10
AutomapHostsOnResolve 1
TransPort 9040
TransListenAddress 10.8.1.1
DNSPort 53
DNSListenAddress 10.8.1.1
AccountingStart day 0:00
AccountingMax 10 GBytes
RelayBandwidthRate 100 KBytes
RelayBandwidthBurst 500 KBytes
также изменим наш конфиг-файл сервера /etc/openvpn/00-standard.conf. Измените DNS с гугловского на локальный. Не забудьте перезапустить openvpn.
push "dhcp-option DNS 10.8.1.1"
Наконец, следующая конструкция на bash перенаправит весь входящий трафик vpn через tor
#!/bin/sh
_trans_port="9040"
_int_if="tun0"
iptables -t nat -A PREROUTING -i $_int_if -p udp --dport 53 -j REDIRECT --to-ports 53
iptables -t nat -A PREROUTING -i $_int_if -p tcp --syn -j REDIRECT --to-ports $_trans_port
/etc/init.d/tor restart
Кстати, запомните эту конструкцию. Это универсальный способ перенаправить весь трафик с заданной сетевой карты через прозрачный прокси. I2P будем добавлять точно так же.
Готово. Подключитесь к VPN. Убедитесь, что у Вас TOR-овский IP-шник. Зайдите на какой-нибудь .onion сайт, чтобы проверить: dns тоже работает.
Настройка I2P
С I2P сложности. У них нет собственного DNS сервера, так что придется делать свой.
Откройте /etc/unbound/unbound.conf и допишите в конец:
interface: 10.8.1.1
logfile: "/etc/unbound/unbound.log"
local-zone: "i2p" redirect
local-data: "i2p A 10.191.0.1"
access-control: 127.0.0.0/8 allow
access-control: 10.0.0.0/8 allow
local-zone: "." redirect
local-data: ". A 10.191.0.1"
local-zone: "*" redirect
local-data: "* A 10.191.0.1"
После этого любой (!) домен будет раскрываться в заведомо несуществующий IP адрес 10.191.0.1. Осталось «ловить» такой трафик и перенаправлять на localhost:8118 — именно тут слушает I2P.
Кстати говоря, пока что не слушает. Выполните
dpkg-reconfigure i2p
и выставьте флаг, чтобы стартовал при загрузке.
Остановите tor. Запустите unbound.
/etc/init.d/tor stop
/etc/init.d/unbound restart
Теперь настроим privoxy в связке в I2P. Допишите в конец /etc/privoxy/config
accept-intercepted-requests 1
forward / 127.0.0.1:4444
listen-address 10.8.1.1:8118
и рестартаните privoxy
Точно так же, как и в случае с TOR, смените DNS на локальный в конфигурации vpn-сервера:
push "dhcp-option DNS 10.8.1.1"
Если вы уже пробовали редиректить TOR — не забудьте почистить iptables:
iptables -F
iptables -t nat -F
Осталось выполнить переадресацию:
#!/bin/sh
_trans_port="8118"
_int_if="tun0"
iptables -t nat -A PREROUTING -i $_int_if -p udp --dport 53 -j REDIRECT --to-ports 53
iptables -t nat -A PREROUTING -i $_int_if -p tcp --syn -j REDIRECT --to-ports $_trans_port
Знакомо, правда? Единственное отличие — номер порта прокси.
Подключитесь к VPN. Вы в I2P. Откройте epsilon.i2p, убедитесь, что сеть работает.
Что дальше?
Дальше Вам пора сделать так, чтобы они не конфликтовали. Вместо одного сервера /etc/openvpn/00-standard сделать три: 00-standard для обычного трафика, 01-tor для tor-а, и 02-i2p для i2p. Назначьте им разные подсети (например, 10.8.2.* для tor и 10.8.3.* для i2p). После этого tor и unbound перестанут конфликтовать и вы сможете подключаться к любой из трех одновременно работающих сетей.
Кроме того, сейчас клиент не проверяет сертификат сервера. Это можно поправить.
А еще можно запилить виртуалку, для которой выкатить tun0, трафик которого идет через TOR, после чего виртуалка не будет знать даже про VPN. А в хосте этой виртуалки прописать роутинг так, чтобы без VPN не подключалось вообще.
А еще надо лимит скорости в I2P поставить. И логи у VPN не ротируются. И веб-морды нет.
А еще… а еще я все это обязательно опишу — в других статьях. Засим — спасибо за внимание!
Использованные источники
trac.torproject.org/projects/tor/wiki/doc/TransparentProxy
grepular.com/Transparent_Access_to_Tor_Hidden_Services
Автор: Arenim