Как это работает?
В этом разделе мы объясним работу CENO и Ouinet, рассмотрев ряд сценариев. Терминология и понятия, важные для Ouinet, будут введены (выделены жирными буквами) и использованы в дальнейшем для эффективности и во избежание путаницы.
Прямой доступ к контенту
Браузер CENO является примером приложения, использующего технологию Ouinet для получения и обмена веб-контентом. Мы называем такое приложение клиентом Ouinet. Когда вы используете свой клиент (т.е. CENO) для доступа к некоторому контенту X, размещенному на веб-сервере (который мы будем называть исходным сервером X), ваш клиент пытается связаться с исходным сервером через Интернет либо напрямую, либо через какой-то другой компьютер, настроенный для связи с веб-серверами от имени других (так называемый прокси сервер), а затем запрашивает нужный контент. Это ничем не отличается от того, как работает любой обычный веб-браузер.
Техническое примечание: На самом деле есть одна небольшая загвоздка. Поскольку клиент действует как HTTP-прокси, запущенный на вашем устройстве, для того, чтобы клиент мог расшифровывать и выполнять запросы HTTPS-контента, приложение, использующее клиент (т.е. веб-браузер — например, Firefox в CENO), должно принять специальный сертификат, выпущенный самим клиентом (и используемый только на вашем устройстве). Браузер CENO уже позаботился об установке этого сертификата, так что вам не нужно беспокоиться.
Однако эти прямые пути могут быть недоступны. Например, ваш интернет-провайдер (ISP) может блокировать доступ к исходному серверу X или прокси из-за государственного распоряжения (даже если другой трафик все еще разрешен). Как пользователь левого верхнего клиента, изображенного ниже, обе попытки получить доступ к содержимому X (маленький документ рядом с исходным сервером) для вас будут неудачными. Вы также можете заметить на диаграмме узел "инъектор". Мы объясним это чуть позже.
При использовании обычного браузера вам бы не повезло. Однако, с помощью Ouinet вы можете запросить у других клиентов их копии контента X, если эта копия у них уже есть. Давайте посмотрим, как Ouinet выполняет этот запрос.
Поиск общего контента
Совокупность всего контента, хранимого клиентами Ouinet, называется распределенным кэшем, т.е. хранилищем, которое не находится в одном месте. Но как ваш клиент может найти, какие другие клиенты, образующие кэш, имеют необходимый контент?
В любом веб-браузере для доступа к контенту X необходимо знать его Унифицированный указатель ресурса (URL), то есть адрес в адресной строке браузера, например, https://example.com/foo/x
. Из этого URL обычный браузер сделает вывод, что он должен связаться с веб-сервером под названием example.com
, используя протокол HTTP (язык, используемый для обмена веб-ресурсами) через SSL/TLS (уровень безопасности в TCP, правилах интернета для общения программ друг с другом) и запросить ресурс /foo/x
.
Ouinet ищет контент по-другому. Он использует индекс, немного похожий на книжный: в распределенном индексе кеша Ouinet вы ищете URL-адрес контента целиком и получаете список клиентов, у которых есть его копия. Сам индекс является распределенным, причем клиенты сами сообщают другим о том, какой контент у них есть. На самом деле, объявляется только подсказка о каждом URL, так что кто-то, следящий за трафиком вашего устройства, не может определить, какой контент у вас есть, но тот, кто ищет конкретный контент, может следовать подсказке и найти ваш клиент.
Техническое примечание: Один из способов реализации индекса — использование распределённой хэш-таблицы протокола BitTorrent (DHT) для получения адресов (IP и порта) клиентов с контентом. DHT использует криптографическую хеш-функцию для вычисления ключа таблицы из URL контента и некоторых других параметров в качестве ключа инъектора (см. ниже), так что несколько индексов могут сосуществовать.
Кроме того, Браузер CENO не анонсирует URL каждого ресурса, который он раздает: учитывая наличие на любой современной странице десятков или сотен компонентов (изображений, таблиц стилей, скриптов...), это создало бы большой трафик. Вместо этого ресурсы группируются в URL страницы, на которой они находятся, и объявляется только этот URL. Это делается с помощью расширения браузера ad hoc (описано ниже).
Клиенты, предлагающие определенный контент через распределенный кэш, называются раздающими контент или сидами (эти термины пришли из мира P2P-файлообмена). Возвращаясь к нашему примеру, можно сказать, что есть два клиента, раздающих некоторый контент. К сожалению, один из них выкладывает контент Y, а другой — контент Z, поэтому ваш клиент не найдет записей для контента X в индексе распределенного кэша, как показано ниже:
К счастью, Ouinet предлагает способ получить такой контент и, более того, сделать его доступным для других клиентов в распределенном кэше. Пожалуйста, ознакомьтесь с инструкцией.
Обмен новым контентом
Прокси на стероидах
В Ouinet существуют специальные виды прокси-серверов, называемые инъекторами, которые находятся в (будем надеяться) свободной части интернета и стараются оставаться доступными, несмотря на меры блокировки:
-
Во-первых, соединения между клиентами и инъекторами шифруются (с использованием стандартного SSL/TLS, как в HTTPS), чтобы злоумышленники не смогли идентифицировать инъекторов путем прослушки веб-трафика.Кстати, сертификаты инъекторов поставляются в Браузере CENO, что позволяет ему обнаруживать злоумышленников, пытающихся выдать себя за инъекторов.
-
Если шифрования недостаточно, соединения с инъекторами могут использовать специальные методы обфускации (например, I2P и подключаемые транспорты Tor), чтобы еще больше затруднить идентификацию.
-
Даже если инъектор был идентифицирован и доступ к нему был заблокирован вашим провайдером, их существует несколько, и не имеет значения, с каким из них ваш клиент связывается через интернет.
-
Некоторые — или даже все — инъекторы могут быть заблокированы, но тогда группа инъекторов может меняться с течением времени (с добавлением новых).Вашему клиенту не нужно заранее знать их интернет-адреса; вместо этого он выполняет поиск в рое инъекторов (еще один термин из P2P-файлообмена), распределенном индексе, похожем на индекс распределенного кэша, который выдает адреса доступных в данный момент инъекторов.
-
Наконец, даже если ваш клиент не может связаться с инъектором, некоторые другие клиенты могут это сделать. Если клиент может связаться с инъектором и считает себя доступным для других клиентов, он становится мостом и добавляет свой собственный интернет-адрес в рой мостов, еще один распределенный индекс.Таким образом, ваш клиент может найти такой адрес, подключиться к мосту и сказать ему установить соединение с инъектором от его имени, создав туннель между вашим клиентом и его инъектором. Затем между ними может быть установлено соединение внутри туннеля.
Обратите внимание, что поскольку соединения между клиентом и инъектором шифруются, мосты не могут видеть информацию, проходящую между ними.
-
Инъектор может вести себя как обычный прокси-сервер (но с повышенной доступностью), и это именно то, что клиенты Ouinet (включая CENO Browser) делают в настоящее время при попытке получить доступ к контенту через прокси. В этом случае инъектор не будет видеть фактическую информацию, проходящую между вашим клиентом и исходным сервером (если только это не обычное, незашифрованное HTTP-соединение).
Но существуют другие инструменты, позволяющие достигать прокси-серверов в условиях жесткого сетевого вмешательства, так что же особенного в инъекторах Ouinet?
Доверие к общему контенту
Дело в том, что инъектор не просто получает контент от имени вашего клиента, он также позволяет вам делиться этим контентом с другими в дальнейшем, даже когда доступа к инъектору или большей части интернета больше нет.
Конечно, вы можете загрузить страницу из своего браузера и скопировать полученные файлы другим людям, что вполне нормально, если вы знакомы. Но что, если вы получили такие файлы от неизвестного человека? Как вы можете быть уверены в том, что контент действительно пришел с заявленного сайта, что он был получен в определенную дату или что информация в нем не была подделана?
Мы хотим, чтобы использование CENO и Ouinet масштабировалось и предоставляло как можно больше контента как можно большему числу людей, поэтому мы хотим, чтобы вы могли получать контент от незнакомых вам людей. Чтобы вы могли принимать такой контент, Ouinet использует подписывание контента: ваш клиент настроен на доверие к контенту, который подписан с помощью специального ключа, принадлежащего инъекторам. Каждый раз, когда клиент говорит инъектору получить веб-контент, инъектор получает его с исходного сервера, использует ключ для подписи и возвращает подписанный контент клиенту.
Техническое примечание: Фактически, инъектор подписывает отдельные блоки данных по мере их поступления, поэтому даже если соединение обрывается на середине при получении большого файла, загруженные данные все равно могут быть доступны клиенту, который их получил.
У разных инъекторов могут быть разные ключи, поэтому вы можете выбирать, каким инъекторам доверять. Представьте это так: вы можете доверять документу, подписанному нотариусом из вашей страны, независимо от того, кто вам его выдал (гражданин или иностранец), но вы не обязаны принимать документ, подписанный нотариусом из другой страны. Браузер CENO уже настроен на доверие к набору инъекторов под управлением eQualitie.
Техническое примечание: Инъекторы используют пару из открытого и закрытого ключей для создания подписей Ed25519; открытые ключи достаточно малы, чтобы их можно было пересылать вместе с подписями, и кодируются в виде 64 шестнадцатеричных символов или 52 символов Base32. Ими можно даже обменяться по телефону или записать на листе бумаги.
Инъекция контента
Помните, что в нашем примере клиент уже пытался получить контент X непосредственно с исходного сервера и от других клиентов, но безуспешно. Клиент разыгрывает свою последнюю карту Ouinet и пытается связаться с доверенным инъектором, чтобы получить подписанную копию контента, которой он может поделиться с другими клиентами.
На рисунке ниже показан возможный результат этой операции: клиент сначала пытается связаться с инъектором напрямую (например, используя интернет-адрес, который он получил от «роя» инъекторов), но, к сожалению, он уже заблокирован вашим провайдером; к счастью, рой мостов показывает интернет-адреса двух других клиентов, которые все еще могут связаться с инъектором. Ваш клиент открывает туннель к инъектору через одного из этих клиентов, поэтому инъектор получает запрос на контент X от вашего клиента и запрашивает его у исходного сервера.
Когда инъектор получает контент X, он подписывает его своим ключом, добавляет подпись к контенту и отправляет его обратно вашему клиенту через туннель, по которому он пришел (скажем, через клиента, сидящего за пределами блокировки). Как только содержимое достигает вашего клиента, он делает три вещи:
- Он передает его вам (в случае с CENO он показывает контент в браузере).
- Он сохраняет контент на вашем устройстве для последующей передачи другим клиентам. Он будет храниться там в течение настраиваемого периода времени или до тех пор, пока вы не решите очистить весь сохраненный контент.
- Он объявляет в индексе распределенного кэша, что у него есть копия этого контента, чтобы другие клиенты могли его найти.
Вся совокупность операций по извлечению, подписанию, хранению и объявлению является тем, что мы называем инъекцией контента, как показано на рисунке ниже.
Просмотр страниц при полной блокировке
Обратите внимание, что описанная выше схема по-прежнему требует, чтобы существовал путь через блокировку и к остальной части интернета. Но иногда этот путь может отсутствовать: подумайте о полном международном отключении, стихийных бедствиях или просто чрезмерной перегрузке немногих существующих путей (из-за того, что все пытаются пройти через них). Именно здесь и проявляется реальная сила распределенного кэша.
Представим, что после того, как вы извлекли контент X из инъектора, в результате стихийного бедствия ваш регион оказывается изолированным от всего мира. Оказывается, что контент X становится особенно актуальным, поскольку он описывает некоторые способы, которыми вы можете помочь своему сообществу в такой ситуации.
В этот момент второй человек, использующий Браузер CENO, также пытается получить этот контент. Доступ к исходному серверу или к чему-либо за пределами вашего региона невозможен, поэтому CENO проверяет индекс распределенного кэша для этого контента и обнаруживает, что ваше устройство передает его. CENO получает ваш интернет-адрес из индекса, подключается к нему и запрашивает контент, как показано ниже.
Теперь второе устройство также имеет копию контента X, поэтому оно объявляет об этом в индексе распределенного кэша, становясь таким образом раздающим. Если третье лицо, заинтересованное в этом контенте, использует Браузер CENO для его получения, CENO теперь будет видеть два адреса в индексе для контента: адрес вашего устройства и адрес второго пользователя. Если контент тяжелый (например, видео), это третье устройство может попытаться получить его половину с каждого из других устройств (как показано ниже), тем самым ускоряя загрузку и уменьшая используемый ими трафик.
Наконец, ситуация может стать еще хуже, и вся коммерческая и государственная сетевая инфраструктура может быть отключена. В этом случае Ouinet и CENO Browser также поддерживают обмен контентом между двумя клиентами, находящимися в одной локальной сети (например, подключенными к одной точке доступа Wi-Fi), даже если эта сеть не имеет доступа к другим.