Jump to content

Доступ к Tor из внешней сети через 3proxy


Recommended Posts

Подводка простая: для обхода блокировок понадобился выход через Tor в приложении на мобильном, причём не только в домашней локалке через Socks5 от самого тора, но и через подключение от сотового оператора. VPN отпал, т.к. телефон требует включать его вручную, подключение сбрасывается через пять минут простоя, и оно очень быстро расходует батарейку. Проброс портов в NAT – тоже: открывать полный доступ к Tor из внешней сети без какой-либо авторизации мне показалось неразумным. Оставался один вариант: установить прокси-привратник и настроить его на проверку логина с паролем, с дальнейшей переадресацией соединения на Tor. Выбор пал на 3proxy.

(Убью интригу сразу: после упорных вкуриваний мануалов вместе с выдачей гугла у меня всё завелось, и дальнейший текст больше похож на ещё один мануал, нежели на просьбу о помощи. Однако ж, для темы в "Каталоге готовых решений" материал годится слабо, и в лучшем случае скорее является наброском: конфигурация наверняка неидеальная, работает она менее недели, кейсы вроде "серого провайдерского ip" или "упаковки логов в архив" она не предусматривает, да и объяснений где-то будет слишком мало, а где-то – слишком много.)

  1. Подготовительный шаг: создаём правило в файерволе роутера, открывающее порт в интерфейсе для доступа в интернет (PPPoE в моём случае) – именно его прокси-привратник и будет слушать. Для себя я открыл порт 63128 на ip-адресе назначения, который роутер получает при подключению к провайдеру:

    Firewall.PNG.5381119c8481877ca2bbf2d8db565bb1.PNG

  2. Устанавливаем нужные пакеты:

    opkg install 3proxy tor tor-geoip curl

    Если с 3proxy и tor всё ясно, то tor-geoip нужен для ограничения выходных нод в файле конфигурации по пути "/opt/etc/tor/torrc". Собственно, выглядит он примерно таким образом:

    Скрытый текст
    
    SOCKSPort 9055 	#не помню из-за чего, но когда-то мне пришлось поменять на этот, с порта по умолчанию 9050
    Log notice file /opt/var/log/tor/notices.log
    RunAsDaemon 1
    DataDirectory /opt/var/lib/tor
    
    ## Списки нод, разрешённых для выхода (ExitNodes)
    ## И явно запрещённых для выхода (ExcludeExitNodes)
    ExitNodes {at},{be},{ch},{cz},{de},{dk},{es},{eu},{fi},{fr},{gb},{ie},{in},{it},{nl},{no},{pl},{ro},{se}
    ExcludeExitNodes {by},{ru},{kz}

     

  3. Проверить же, что Tor работает как надо, можно при помощи команды curl:

    curl --socks5 localhost:9055 --socks5-hostname localhost:9055 -k https://check.torproject.org/ | cat | grep -m 1 Congratulations | xargs

    Если в ответ мы получим "Congratulations. This browser is configured to use Tor." – значит, всё окей; curl потом можно удалить, т.к. для работы прокси он нам не понадобится:

    opkg remove curl
  4. Теперь настраиваем файл конфигурации 3proxy – "/opt/etc/3proxy/3proxy.cfg". Важно помнить, что доступ к нашему "привратнику" будет идти из внешнего интернета, а значит "внутренний интерфейс" будет на ip-адресе от провайдера, а "внешний" – локалхостом, на котором работает Tor. Минимальная рабочая конфигурация выглядит примерно так: 

    Скрытый текст
    
    daemon
    pidfile /opt/var/run/3proxy.pid
    nscache 65536
    nserver 127.0.0.1
    timeouts 30 30 60 60 180 1800 60 120 
    #Таймауты по умолчанию могут быть слишком быстрыми для Tor, и потому
    #они были увеличены, согласно рекомендации его разработчиков:
    #https://trac.torproject.org/projects/tor/wiki/doc/TorifyHOWTO/WebBrowsers#CircumventingTorblocksusingopenHTTPproxies
    
    config /opt/etc/3proxy/3proxy.cfg
    monitor /opt/etc/3proxy/3proxy.cfg
    monitor /opt/etc/3proxy/counters
    monitor /opt/etc/3proxy/passwd
    monitor /opt/etc/3proxy/bandlimiters
    
    log /opt/var/log/3proxy.log D
    rotate 60
    counter /opt/etc/3proxy/3proxy.3cf
    
    #users $/opt/etc/3proxy/passwd
    #в этом файле возможно хранить логины и пароли пользователей;
    #данные добавляются при помощи скрипта add3proxyuser.sh
    
    include /opt/etc/3proxy/counters
    include /opt/etc/3proxy/bandlimiters
    
    #настройки sock5-привратника
    flush
    auth strong
    users <логин1>:CL:<пароль1> 		#возможно добавить несколько пользователей, отбивка по пробелу
    fakeresolve 				#для заворачивания DNS-запросов внутрь Тора
    allow *
    parent 1000 socks5+ 127.0.0.1 9055 	#переправляем запросы на порт Tor
    maxconn 50 				#проксик поднят для себя и друзей, максимум в 500 соединений по умолчанию не нужен
    socks -a -n -p63128 -i<ip слушающего интерфейса> -e127.0.0.1 
    #флаг -a делает прокси анонимным, -n - отключает несовместимую с Unix (?) аутентификацию по NTLM,
    #параметр -p63128 указывает на порт для прослушивания, -i - на интерфейс для прослушивания запросов,
    #-e - на интерфейс для отправки запросов
    
    #доступ к админке (адрес - 192.168.1.1:8080) по паролю из Home-LAN подсети 192.168.1.0
    flush
    auth strong
    users <логинадмина>:CL:<парольадмина>
    allow <логинадмина> 192.168.1.0/24 * 8080 *
    deny *
    admin -n -p8080
    

     

  5. Запускаем прокси

    /opt/etc/init.d/S23proxy start
  6. Указываем в настройках прокси приложения на телефоне адрес, порт, логин, и пароль:

    Скрытый текст

    IMG_3935.thumb.PNG.dea1b55de1a00960c3241ca950acf166.PNG

После этого телефон подключается к роутеру по сотовому интернету и отправляет данные по Tor. 

 

При настройке в основном оглядывался на инструкции с официального сайта проекта, и в частности – .rtf-документ "Настройка 3proxy для чайников" (копию дополнительно добавлю в приложения к посту на случай недоступности по ссылке). Также довольно сильно выручил небольшой топик на linux.org.ru – пускай объяснения для конфига оттуда и пришлось искать в той же документации. 

Как уже упоминал, текст выше может содержать ошибки – любые исправления и уточнения приветствуются.

3proxy_for_dummies.rtf

Edited by UweStrich
исправлена команда в шаге 3 по замечанию пользователя @G5ast
Link to comment
Share on other sites

Цитата

Проверить же, что Tor работает как надо, можно при помощи команды curl:

Ну вот, третий шаг ничего не выдаёт.

~ # /opt/etc/init.d/S35tor restart
 Shutting down tor...              done.
 Starting tor...              done.
~ # curl --socks5 localhost:9055 --socks5-hostname localhost:9055 -s https://che
ck.torproject.org/ | cat | grep -m 1 Congratulations | xargs

~ #

Может быть вы что-то упустили во втором шаге?

Link to comment
Share on other sites

57 минут назад, plagioklaz сказал:

Ну вот, третий шаг ничего не выдаёт.


~ # /opt/etc/init.d/S35tor restart
 Shutting down tor...              done.
 Starting tor...              done.
~ # curl --socks5 localhost:9055 --socks5-hostname localhost:9055 -s https://che
ck.torproject.org/ | cat | grep -m 1 Congratulations | xargs

~ #

Может быть вы что-то упустили во втором шаге?

Не удивлюсь, если дело и правда в каких-то ранее установленных пакетах, не упомянутых в шаге два из-за неочевидности, но чтобы просто удостовериться: порт тора в запросе curl такой же, как в файле конфигурации?

Просто, как уже упоминал в комментариях к примеру файла torrc, мне когда-то пришлось поменять значение "SOCKSPort" со значения по умолчанию 9050 на 9055; если у вас тор работает на 9050, то и запрос к curl придётся подправить.

P.S.: всё ещё пытаюсь нормализовать конфиг 3proxy, и уже внёс в него кое-какие изменения согласно документации. Возможность редактировать шапку темы потерял, поэтому добавлю его в отдельном посте.

Edited by UweStrich
форматирование, корректура, уточнения
Link to comment
Share on other sites

1 час назад, UweStrich сказал:

но чтобы просто удостовериться: порт тора в запросе curl такой же, как в файле конфигурации?

Конечно, точно следовал вашим инструкциям и раскоментировал нужные строки, поменял порт. И добавил пару строк в конец кода

ExitNodes {at},{be},{ch},{cz},{de},{dk},{es},{eu},{fi},{fr},{gb},{ie},{in},{it},{nl},{no},{pl},{ro},{se}
ExcludeExitNodes {by},{ru},{kz}
Link to comment
Share on other sites

Что ж, тогда продолжим выяснять. Для начала - что tor пишет в лог-файле /opt/var/log/tor/notices.log? Что пишет журнал в веб-интерфейсе роутера?

Далее - время: тор может быть весьма чувствительным к серьёзным расхождениям по времени, а значит - может понадобиться синхронизация (можно настроить в веб-интерфейсе роутера).

Ну, и ещё одна догадка: могут дополнительно потребоваться пакеты ca-bundle и ca-certificates.

Ну, и ещё один вопрос разряда "вы пробовали выключить и потом заново включить": правки в файл конфигурации вносились через родные для роутера текстовые редакторы (vi, nano, или mcedit), не через виндовский "Блокнот"?

Edited by UweStrich
дополнительный вопрос
Link to comment
Share on other sites

2 часа назад, plagioklaz сказал:

Да я уже всё снёс )) Попробовал, не заработало и ладно )

Ну, всё равно было полезно - что мне, что вам :D

Жаль, правда, что так и не выяснили, что барахлило - tor или curl...

***

Как и обещал на прошлой неделе - текущий конфиг; как я заметил, 3proxy почему-то не любит комментарии в той же строке, что и работающий параметр (или отбивку этих комментариев табуляцией), поэтому в этом конфиге строк будет больше:

Скрытый текст

daemon
pidfile /opt/var/run/3proxy.pid
#external 0.0.0.0
#internal 0.0.0.0
nscache 65536
nserver 127.0.0.1
#nserver 8.8.8.8
#Таймауты по умолчанию могут быть слишком быстрыми для Tor, и потому
#они были увеличены, согласно рекомендациям его разработчиков:
#https://trac.torproject.org/projects/tor/wiki/doc/TorifyHOWTO/WebBrowser#CircumventingTorblocksusingopenHTTPproxies
timeouts 30 30 60 60 180 1800 60 120

config /opt/etc/3proxy/3proxy.cfg
#список файлов, при изменении которых 3proxy перезагружает конфигурацию
monitor /opt/etc/3proxy/3proxy.cfg
monitor /opt/etc/3proxy/counters
monitor /opt/etc/3proxy/passwd
monitor /opt/etc/3proxy/bandlimiters
monitor /tmp/currentip

log /opt/var/log/3proxy.log D
rotate 60
counter /opt/etc/3proxy/3proxy.3cf

users $/opt/etc/3proxy/passwd
#в этом файле возможно хранить логины и пароли пользователей;
#данные добавляются при помощи скрипта add3proxyuser.sh

include /opt/etc/3proxy/counters
include /opt/etc/3proxy/bandlimiters

#настройки socks5-привратника
flush
auth strong
#для работы тоннеля обязательно должен быть указан один из способов авторизации

#users <логин1>:CL:<пароль1>
#возможно добавить несколько пользователей, отбивка по пробелу

fakeresolve
#для заворачивания DNS-запросов внутрь Tor-а

allow *
#разрешающие правила

parent 1000 socks5+ 127.0.0.1 9055
#тоннель для переправления запросов на порт Tor-а

#deny *
#запрещающие правила

socks -4 -n -p63128 -i$/tmp/currentip -e127.0.0.1 -S8192
#флаг -4 указывает на использование ipv4, -n - отключает NTLM,
#-p63128 указывает на порт для прослушивания, -i$/tmp/currentip - на файл с ip-адресом интерфейса для прослушивания,
#-e - на интерфейс для отправки запросов, -S8192 - размер стека

#доступ к админке по паролю из Home-Lan подсети
flush
auth strong
allow admin 192.168.1.0/24 * 8080 *
deny *
admin -n -p8080

 

Особое внимание на строки "monitor /tmp/currentip" и "socks -4 -n -p63128 -i$/tmp/currentip -e127.0.0.1 -S8192" - в файле по пути /tmp/currentip хранится ip-адрес, принадлежащий интерфейсу для выхода в интернет. Этот файл можно создавать и модифицировать при помощи скрипта в папке /opt/etc/ndm/wan.d -

Скрытый текст

01-current-ip.sh


#!/bin/sh

iface=ppp0			#интерфейс для выхода в интернет
curip=/tmp/currentip 		#файл, в котором хранится ip-адрес интерфейса

[ $interface = "$iface" ]
if [ ! -e "$curip" ] || [ $(cat $curip) != $address ]
#если файл не существует, или ip-адрес в файле отличается от фактического, то...
then
    echo "$address" > "$curip"	#...записываем фактический ip-адрес в файл
fi
exit 0

 

Выставляем исполняемые права скрипту, введя в консоли следующую команду:

chmod +x /opt/etc/ndm/wan.d/01-current-ip.sh

Благодаря такой связке можно конкретно указать программе, какой интерфейс она должна прослушивать. Для постоянного же подключения к роутеру, даже при изменении его белого ip (разумеется, если динамические ip от провайдера белые), можно использовать DynDNS (статья в базе знаний).

Ну, и обязательный дисклеймер о том, что способ выше вполне можно считать "стрельбой по воробьям из пушки" - с тем же успехом вместо конкретного ip интерфейса можно указать прослушивать все интерфейсы, т.е. строка конфига, поднимающая socks-прокси, примет следующий вид:

socks -4 -n -p63128 -i0.0.0.0 -e127.0.0.1 -S8192

 

Edited by UweStrich
правка форматирования, дополнение
  • Upvote 1
Link to comment
Share on other sites

  • 3 months later...

Нужно в CURL отключить проверку SSL сертификата, правильно будет вот так:

curl --socks5 localhost:9055 --socks5-hostname localhost:9055 -k https://check.torproject.org/ | cat | grep -m 1 Congratulations | xargs

 

  • Upvote 1
Link to comment
Share on other sites

  • 1 month later...
  • 3 weeks later...

Tor не запускается.

curl --socks5 localhost:9055 --socks5-hostname localhost:9055 -k https://check.torproject.org/ | cat | grep -m 1 Congratulations | xargs

Выдаёт ошибку: curl: error while loading shared libraries: libc.so.0: cannot open shared object file: No such file or directory.

Как это исправить?

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...