Бывает, что TOR в какой-либо стране или из определенной сети работает либо плохо, либо совсем не работает. Часто происходит это по причине того, что блокируется трафик на адреса образущих сеть TOR узлов. В терминогологии TOR, этот тип узлов называется “relay”. Relay-узлы могут исполнять роли входных (в сеть TOR) узлов, выходных (в сеть Интернет из сети TOR) узлов, или транзитных (между входными и выходными) узлов, в различных комбинациях. Список relay-узлов изменяется, удостоверяется, подписывается, и публикуется с помощью специальных узлов - directory authorities. В клиенте TOR список directory authorities преднастроен, которые в свою очередь предоставляют список relay-узлов, которые нужны клиенту для выбора узлов для построения прокси-цепочки. Соответственно список relay-узлов доступен публично, например, на www.dan.me.uk/torlist, так же можно проверить отдельные адреса по metrics.torproject.org. В TOR предусмотрена ситуация, когда для блокировки доступа к сети, могут быть заблокированы адреса всех relay-узлов. Для такого случая, в сети принимают участие другой тип узлов, которые не публикуются с помощью directory authorities, но при этом выполняют роль входного relay-узла. В терминологии TOR узлы такого типа называются bridge-relay, т.е. мосты, между клиентом и сетью TOR. Следует сказать, что в браузере TOR доступен список преднастроенных bridge-узлов, а так же можно получить настройки узла по адресу bridges.torproject.org. То есть получается некая публично-ограниченная модель - список всех мостов получить разом нельзя, но можете получить несколько случайных узлов по запросу, чтобы существенно усложнить блокировку мостов.

Сам я “мостами” никогда не пользовался, но сообщали, что скорость работы через преднастроенные узлы оставляет желать лучшего, поэтому в этой статье я расскажу, как поднять свой приватный bridge-узел для доступа к TOR. Но для начала рассмотрим варианты, которые предлагает клиент.

Какие мосты нам предлагает клиент

При первоначальной настройке Tor-browser нам должны предложить варианты: подключаться к сети напрямую, через прокси, а также должны быть доступен вариант “Tor is censored in my country”. Последнее нам и дает варианты настройки узлов-мостов.

1) Select an build-in bridge

Клиент будет использовать встроенный список мостов, в зависимости от выбранного т.н. Pluggable Transport. “Подключемый транспорт” выполняет обфускацию TOR-трафика для обхода систем, которые умеют детектировать тип трафика по содержимому.

torbridge1

2) Request a bridge from torproject.org

Позволяет запросить 3 bridge-узла с официального ресурса bridges.torproject.org. Может спасти положение, если преднастроенные узлы по какой-либо причине не работают.

torbridge2

Судя по тому, что мне удалось подсмотреть, то запрашиваются узлы не “втупую” запросом, например по https, на bridges.torproject.org, а с применинием обфускации трафика и тоже через TOR или другими обходными путями, потому что во время запроса у меня открывались такие коннекты:

ESTAB  0        0                 127.0.0.1:51580             127.0.0.1:9151     users:(("meek-client",pid=7543,fd=39),("firefox.real",pid=7518,fd=39),("meek-client-tor",pid=7512,fd=39),("firefox.real",pid=6086,fd=39))
ESTAB  0        0                 127.0.0.1:51584             127.0.0.1:9151     users:(("meek-client",pid=7543,fd=42),("firefox.real",pid=7518,fd=42),("meek-client-tor",pid=7512,fd=42),("firefox.real",pid=6086,fd=42))                                                
ESTAB  0        0                 127.0.0.1:51598             127.0.0.1:9151     users:(("meek-client",pid=7543,fd=50),("firefox.real",pid=7518,fd=50),("meek-client-tor",pid=7512,fd=50),("firefox.real",pid=6086,fd=50))

Получается, что о блокировке в сети torproject.org можно не так сильно беспокоится. Если он заблокирован, клиент все равно получает “мосты” незаурядным способом.

3) Provide bridge i know

Эта опция позволяет ввести данные известного узла, который может быть независим от встроенных или мостов с torproject.org. Данные вводятся в следующем формате:

<транспорт (метод обфускации)> <IP-адрес>:<порт> <ID  моста> <параметры транспорта>

Ну, пожалуй на этом моменте приступим к поднятию своего собственного моста в сеть TOR.

Наводим мосты

Заглянем в статью Tor: Bridges. В целом, в начале объясняется все то, что было описано выше. О настройке своего моста объясняется в секции Running a Tor Bridge. В целом все понятно: открыть файл torrc, отредактировать несколько параметров, сохранить, перезапустить. Но смущает это предложение:
Your bridge relay will automatically publish its address to the bridge authority, which will give it out via https or email as above. Т.е. данные нашего моста улетают в публичный список. Хорошо для волонтерства, но мы же хотим сделать свой приватный мост. Об этом тут упоминается:
If you’re interested in running an unpublished bridge or other non-standard uses, please do read the specification.
Ну, получается, нужно смотреть глубже - в спецификацию. Открываем, смотрим:

1.1. PublishServerDescriptor

  To configure your relay to be a bridge relay, just add
    BridgeRelay 1
    PublishServerDescriptor bridge
  to your torrc. This will cause your relay to publish its descriptor
  to the bridge authorities rather than to the default authorities.

  Alternatively, you can say
    BridgeRelay 1
    PublishServerDescriptor 0
  which will cause your relay to not publish anywhere. This could be
  useful for private bridges.

Найти способ никуда не публиковать данные моста найден. В разделе “рекомендации” также указано, что неплохо бы отключить любые соединения на выход из сети Tor, так как мост должен выполнять только посреднеческую роль между клиентом и сетю Tor.

1.2. Recommendations.

  Bridge relays should use an exit policy of "reject *:*". This is
  because they only need to relay traffic between the bridge users
  and the rest of the Tor network, so there's no need to let people
  exit directly from them.

Итак, приступим к установке. По установке Tor на сервер есть замечательные инструкции - Installing Tor on Debian/Ubuntu и Installing Tor Source, а также описана установка на Ubuntu Server 16.04 в статье “Настройка универсального узла связи для выхода в оверлейные сети”.

После установки останавливаем Tor командой:

service tor stop

Открываем файл torrc (на Ubuntu он лежит в /etc/tor/torrc) и задаем следующие параметры:

SocksPort 0 # Отключаем на узле клиентский socks5-транспорт
RunAsDaemon 1 # Запуск TOR в фоне
Log notice file /var/log/tor/notices.log # Файл, куда будут записываться логи
DataDirectory /var/lib/tor # Директория, где будут хранится файлы Тора
ORPort <IP-адрес>:39331 # Ставим какой-нибудь менее очевидный порт для входящих соединений, и лучше ставить >1024
Address <IP-адрес> # Адрес для входящих соединений нашего моста. Ставим IP адрес интерфеса, который смотрит в сеть.
ExitPolicy reject *:* # Запрещаем любые исходящие соединения из сети Tor в Интернет
ExitPolicy reject6 *:* # Как предыдущее, только для IPv6
BridgeRelay 1 # Делаем наш сервер bridge-узлом
PublishServerDescriptor 0 # Никуда не публикуем данные нашего моста - он будет приватным

Создаем файл для логов и вешаем ему пользователей, под которыми работает Tor:

touch /var/log/tor/notices.log
chown debian-tor:debian-tor /var/log/tor/notices.log
chmod ug+rw,o-rwx /var/log/tor/notices.log

Если в /var/lib/tor остался какой-либо кеш - вычищаем его:

rm /var/lib/tor/cached-* 

На этом настройка закончена. Запускаем Tor, недолго ждем для “прогрева” узла:

service tor restart

Настроим Tor-браузер. Находим в настройки TORа в браузере, выбираем Tor is censored in my country -> Provide bridge i know, вводим данные нашего узла - <IP-адрес>:<порт>. Вбивается тот, который указывали в настройке ORPort. ID-узла вводить ненужно.

torbridge4

Нажимаем Connect, ждем подключения. Далее проверяем работу TOR - проходим на ifconfig.co и check.torproject.org.

Обфускация трафика

Теперь неплохо бы подключить обфускацию трафика. Установим obfs4, так как, согласно статье Tor: Pluggable Transports:
obfs4 is currently the most effective transport to bypass censorship.

Откроем статью obfs4proxy bridge deployment guide и согласно ей установим пакет obfs4proxy:

apt install obfs4proxy

Дополняем torrc следующими настройками:

## Pluggable transport settings
### obfs4
ServerTransportPlugin obfs4 exec /usr/bin/obfs4proxy # Тут указывается, что для запуска obfs4 нужно запустить сначала его демон
ServerTransportListenAddr obfs4 <IP-адрес>:35671 # IP-адрес и порт, которые будет слушать obfs4
ExtORPort auto # Поднятие еще одного сокета демоном Tor для взаимодейсвия с демоном obfs4. Настройка Auto говорит о том, что сокет будет выбран автоматически, а его данные для obfs4 записаны в переменные окружения

Перезапускаем Tor, недолго ждем когда он запустится:

service tor restart

Теперь снова заходим в настройки Tor-браузера. Нужно забить настройки моста с использованием obfs4, и забивается он в формате, описанного в инструкции obfs4proxy bridge deployment guide/Post-install:

obfs4 <IP ADDRESS>:<PORT> <FINGERPRINT> cert=<CERTIFICATE> iat-mode=0

По порядку:

1) obfs4 - используемый “Pluggable transport”.

2) <IP ADDRESS>:<PORT> - берем из настройки ServerTransportListenAddr в конфиге torrc сервера .

3) <FINGERPRINT> - берем из файла /var/lib/tor/fingerprint
Выполняем:

#cat /var/lib/tor/fingerprint
Unnamed XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Берем строку из 41 символа после “Unnamed”, подставляем в строку настройки моста

4) cert=<CERTIFICATE> iat-mode=0 берем из файла /var/lib/tor/pt_state/obfs4_bridgeline.txt
Выполняем:

# cat /var/lib/tor/pt_state/obfs4_bridgeline.txt 
<пропущено>
Bridge obfs4 <IP ADDRESS>:<PORT> <FINGERPRINT> cert=02w4goCxbQMR3XVXJ+hLSEKiv2IiUE7t1Gq1427Odv/2VIkQxap2TfH/d3LO6hnrAK3TOg iat-mode=0

Забираем последюю нужную нам часть, подставляем в строку настройку моста.

Итого получается такое:

torbridge5

Сохраняем и перезапускам Tor-браузер. Ждем подключения. После подключения проверяем, что все работает на ifconfig.co и check.torproject.org.

В конце следует упомянуть, что помимо obfs4 есть и другие методы обфускации, такие как meek, fte, scramblesuit, snowflake. Этими транспортами можно использовать не только для скрытия Tor-трафика, но и для других приложений, но об этом, пожалуй, в следующей статье.