Привет, Хабр!
Надеюсь, ты уже слегка отошёл от новогодних праздников и возвращаешься в привычную колею. Лично я эти длинные выходные терпеть ненавижу и, посмотрев, по традиции, "Хоббита" с "Властелином Колец" дня за 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 81.177.103.94:443 50065F50AB29D4F5FCA70314A8D8EBE6B9C9F87B cert=MEbrh3SdwDIPnVqnw+A6BMylU6IjGIG2mitDeZrNtnhN6CyQXOOHj2VvZpV3TRU6fHLzJw iat-mode=0
На этом наши манипуляции завершены - мы получили работающий obfs4-бридж, который хоть немного, возможно ненадолго, но поможет пользователям Тора в РФ и других странах, где "регулируют интернет". Если награды от разработчиков вас не прельщают, просто запустите несколько инстансов, никуда ничего не отправляя - бридж самостоятельно зарегистрируется в сети и через некоторое время можно будет посмотреть на него по ссылке вида https://bridges.torproject.org/status?id=%hashed-server-id%. А вы после такого непременно получите жирный плюс в карму.
Благодарю за внимание, хорошей вам связности и стабильного резолва.