Делай добро и бросай его в воду: бесплатно поднимаем obfs4-бриджи в Oracle Cloud

Привет, Хабр!

Надеюсь, ты уже слегка отошёл от новогодних праздников и возвращаешься в привычную колею. Лично я эти длинные выходные терпеть ненавижу и, посмотрев, по традиции, "Хоббита" с "Властелином Колец" дня за 3-4, начинаю от скуки лезть на стену и остервенело искать, чем бы себя занять. Не стал исключением и прошедший год - в этот раз сердце успокоилось с помощью бриджей Тора, ораклового облака и вполне реальной возможности заполучить ценный лут.

Но давайте обо всём по порядку.

Вряд ли кто-то за прошедший месяц успел забыть, что в РФ, на минуточку, блокируется Тор. Меня, как пользователя сети интернет, этот факт категорически не устраивает - причём в данном случае дело даже не столько в самом факте блокировок, а в том, как организационно и технически реализован (а точнее - НЕ реализован) данный процесс.

Напомню, что пресловутый РКН, ответственный за "регулирование" интернета подобными методами, доселе в основном занимался веб-сайтами - и демонстрировал при этом хоть какое-то подобие обратной связи, давая возможность зайти на соответствующий ресурс и увидеть, что вообще происходит. Ну, такие мелочи, как, скажем, основание блокировки, номер постановления и само состояние "заблокирован/ не заблокирован". Хоть какая-то информация.

В случае же Тора всё совершенно по-другому. Использование печально известных ТСПУ, ответственных за периодические "штормления" рунета, даёт возможности творить с проходящим трафиком что угодно - и не перед кем за это не отчитываться. Ну, скажем, сломать ненадолго известные популярные DNS-серверы. Или вот начать блокировать Тор. Каким образом технически реализована эта блокировка, на основании чего, какие IP-адреса затронуты - всё это тайны, покрытые мраком. Сочувствую саппортам интернет-провайдеров, к которым наверняка образовался тогда шквал звонков.

Началось всё с банального - блокировки всех или большей части входных узлов Тора. Дело это нехитрое, так как списки этих нод, так же, кстати, как и выходных - секретом не являются и доступны публично. Но Тор не позиционировался бы как инструмент обхода цензуры, если бы его так легко можно было поломать. Для таких вот случаев, когда государство или какой-то особенно упоротый провайдер начинает с ним борьбу, у Тора есть некоторое количество встроенных методов обхода - с помощью так называемых бриджей. Именно на них практически сразу и нацелились наши "регуляторы".

К сожалению, какого-то гарантированно рабочего технического способа противостоять блокировкам у Тора нет - поэтому приходится полагаться на меры организационного характера, максимально затрудняя составление полного списка бриджей. Это, например, выдача настроек с сайта или прямо из Тор Браузера после разгадывания капчи; получение бриджа по почте в ответ на входящее письмо. Как вы понимаете, при наличии достаточного админресурса все эти методы успешно компенсируются, как выразились в одном из комментариев, "ротой курсантов ФСБ, мануально перебирающих бриджи". Именно поэтому важно постоянно пополнять список бриджей, добавляя новые.

Этим, завершая слегка затянувшуюся художественную ремарку, я и решил заняться на новогодних праздниках.

Сами разработчики Тора, похоже, были совершенно со мной согласны в этом плане и до блокировок в России. Именно поэтому они ещё в середине прошлого ноября организовани кампанию "Help Censored Users, Run a Tor Bridge", направленную именно на увеличение числа бриджей. Целью было анонсировано 200 штук - и, глядя на статистику, можно сказать, что эта цель была достигнута с лихвой: за последние два месяца количество бриджей увеличилось примерно вдвое, с 1200 до 2300:

В качестве поощрения "мостоводам" они предлагают различного вида мерч - наклейки, футболки и даже худи. Этот тот самый ценный лут, о котором я говорил в первом абзаце. Но получение лута, даже от таких крутых ребят, как The Tor Project, само по себе на статью не тянет. В самом деле - кто угодно ведь может арендовать десяток виртуалок на каком-нибудь Digital Ocean или Scaleway, особого подвига в этом нет. Мне показалось интересным усложнить себе задачу, попытавшись проделать то же самое, но без каких-либо финансовых вложений.

На этом этапе я припомнил, что в середине прошлого года Oracle анонсировал расширение линейки инстансов, доступных по программе Always Free, виртуалками на базе ARM-процессоров Ampere (на Хабре про это даже писали). Интересность новых инстансов заключается в том, что они, в отличие от предлагаемых ранее, обладают не всего одним гигабайтом ОЗУ, а целыми шестью. Кроме того - вместо двух экземпляров x86-виртуалок, "армовских" можно запустить целых четыре (или две двойных, или одну мега-квадро-виртуалку с 4 ядрами и 24 ГБ ОЗУ).

Процесс регистрации, ограничения и неочевидные моменты программы Always Free Tier неплохо расписаны в статье по линку в прошлом параграфе, дублировать информацию я не буду. Заполнив все необходимые поля, подтвердив почтовый адрес и привязав банковскую карту (для людей с повышенной тревожностью - её в любой момент можно отвязать, ничего не потеряв), вы оказываетесь в панели управления облаком, где нас в первую очередь интересует раздел Compute > Instances. Он, разумеется, девственно чист - но это ненадолго. Без сомнений кликайте кнопку "Create instance" - и поехали!

По умолчанию нам предлагают совсем не ту "форму" виртуалки, как это называется у Оракла, которую хотелось бы. Меняем в настройках вид процессора на Ampere, shape - на VM.Standard.A1.Flex, а ОС - на ту, которая вам ближе. Я, поскольку вожу давнюю дружбу с Дебианом (но его в списке нет), выбрал банальную Убунту, имейте этот факт в виду при дальнейшем чтении. Не забудьте при создании скачать SSH-ключ для доступа или закинуть собственный публичный.

Кажется, что уже можно ломиться в консоль новорожденного сервера и творить непотребства - но перед этим придётся задержаться в браузере ещё на минуту, чтобы заранее открыть нужные для функционирования бриджа порты (а также, по желанию, ограничить SSH-доступ доверенными адресами). Делается это в разделе Networking > Virtual Cloud Networks, после чего необходимо зайти в единственную доступную сеть, и далее в Security Lists, где нужно добавить ingress-правило, открыв два любых незанятых TCP-порта на 0.0.0.0/0. В моём случае это 8443 и 443.

Вот теперь ничто не мешает нам залогиниться на виртуалку, где нужно проделать буквально несколько манипуляций из-под рута:

apt update
apt install -y ca-certificates curl gnupg lsb-release
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

apt update
apt install -y curl python3-pip libffi-dev python-openssl libssl-dev zlib1g-dev gcc g++ make docker-ce iptables-persistent
pip3 install docker-compose

Внимательные читатели наверняка заметили, что мы зачем-то установили кажущийся лишним пакет iptables-persistent. Это не просто так, нюанс в том, что в Oracle Cloud на виртуалках по умолчанию фаерволл работает не только на уровне всей сети, но и на самих серверах (при этом хостер добавляет пачку своих правил - в такой ситуации просто обнулять iptables я не решился) - поэтому нам нужно будет открыть наши порты ещё и внутри. Делается это элементарно - достаточно добавить два соответствующих правила в начало цепочки INPUT, например, скопировав их в /etc/iptables/rules.v4 и обновить конфигурацию iptables:

-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 8443 -j ACCEPT

После данной манипуляции нужно не забыть обновить настройки фаерволла и рестартовать сервис контейнеризации:

iptables-restore /etc/iptables/rules.v4
service docker restart>

На данном этапе мы получили полностью готовое к разворачиванию бриджа окружение, осталось только установить и запустить сам контейнер. Для этого нам понадобятся всего два файла, которые можно скачать прямо из репозитория проекта:

wget https://gitlab.torproject.org/tpo/anti-censorship/docker-obfs4-bridge/-/raw/main/docker-compose.yml
wget https://gitlab.torproject.org/tpo/anti-censorship/docker-obfs4-bridge/-/raw/main/.env

Первый представляет собой шаблон для Докера, описывающий загрузку и конфигурацию контейнера, его трогать не придётся. Второй - файл с настройками, который нужно будет заполнить вручную, введя такие данные, как номера портов и почту для связи с владельцем ноды. При желании бридж можно как-то назвать. Кроме того, в разделе с параметрами, пробрасываемыми Тору, нужно будет отключить IPv6 и явным образом указать внешний адрес виртуалки (по идее, он должен определяться автоматически, но у меня почему-то не заработало, а разобраться руки не дошли). В результате наш .env должен принять примерно такой вид:

# Set required variables
OR_PORT=8443
PT_PORT=443
[email protected]
# If you want, you could change the nickname of your bridge
NICKNAME=helloandgtforkn1
# If needed, activate additional variables processing
OBFS4_ENABLE_ADDITIONAL_VARIABLES=1
OBFS4V_AddressDisableIPv6=1
OBFS4V_Address=81.177.103.94

Проделав всё это, вполне можно попробовать запустить ваш бридж:

docker-compose up -d

Если всё в порядке, спустя несколько секунд, проверив с помощью docker-compose logs логи, вы должны увидеть радостную надпись "Self-testing indicates your ORPort 81.177.103.94:8443 is reachable from the outside. Excellent. Publishing server descriptor".

В принципе, на этом можно было бы и закончить, поскольку бридж в таком состоянии уже полностью работоспособен. Но если вы, так же, как и я, возжелаете халявного мерча от The Tor Project, то придётся выполнить ещё пару шагов. Во-первых, нужно получить данные бриджа - делается это командой docker exec %container-id% get-bridge-line (идентификатор контейнера можно посмотреть в первой колонке вывода docker ps). Полученную строку (или строки, если вы решили запустить несколько бриджей) в соответствии с правилами эвента необходимо отправить с той почты, которую вы указали в настройках, на [email protected]. Кроме того, зачем-то нужно отписаться на форуме в соответствующей теме, скопировав туда хэшированный (не перепутайте, это важно!) ключ вашей ноды. Сделать это можно, погрепав лог контейнера по фразе "Your Tor bridge's hashed identity key".

Если get-bridge-line у вас, как и у меня, почему-то не заработал (подозреваю, что это вот этот баг, но скорее рано, чем поздно, его починят), можно получить те же данные руками:

Скопировать из лога контейнера фингерпринт сервера, погрепав его по фразе "Your Tor server's identity key fingerprint" - это строка из 40 символов вида 50065F50AB29D4F5FCA70314A8D8EBE6B9C9F87B.

Скопировать последнюю строку вывода команды docker exec %container-id% cat /var/lib/tor/pt_state/obfs4_bridgeline.txt, отчекрыжить слово Bridge и заменить поля : и на внешний адрес вашей виртуалки, порт obfs4-бриджа (в моём конфиге это 443, переменная PT_PORT) и нагрепанный из лога фингерпринт. Получиться должно вот такое:

obfs4 81.177.103.94:443 50065F50AB29D4F5FCA70314A8D8EBE6B9C9F87B cert=MEbrh3SdwDIPnVqnw+A6BMylU6IjGIG2mitDeZrNtnhN6CyQXOOHj2VvZpV3TRU6fHLzJw iat-mode=0

На этом наши манипуляции завершены - мы получили работающий obfs4-бридж, который хоть немного, возможно ненадолго, но поможет пользователям Тора в РФ и других странах, где "регулируют интернет". Если награды от разработчиков вас не прельщают, просто запустите несколько инстансов, никуда ничего не отправляя - бридж самостоятельно зарегистрируется в сети и через некоторое время можно будет посмотреть на него по ссылке вида https://bridges.torproject.org/status?id=%hashed-server-id%. А вы после такого непременно получите жирный плюс в карму.

Благодарю за внимание, хорошей вам связности и стабильного резолва.