ARMANOS

Прокси

Свой прокси у каждого профиля

Каждый профиль выходит в сеть своим адресом. Библиотека хранит адрес один раз, пароль не попадает в командную строку, и мимо прокси не уходит ничего, включая WebRTC.
HTTP, HTTPS, SOCKS5, SSH
Виды связи
Никогда
Пароль в командной строке
ARMANOS Browser 153.0.7978.0
Замерено на
22
Стран с подобранными часами

У каждого профиля свой выход в сеть

Профиль в ARMANOS это отдельный сеанс браузера: свои куки, своё хранилище, свой отпечаток. Прокси лежит в той же записи. Откройте два профиля рядом, и каждое окно уйдёт в сеть своим адресом.

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

Принимаются четыре вида связи. Незнакомый вид отвергается, а не понижается молча. Правило написано после настоящей беды: всё, что не socks5 и не https, раньше становилось http, и профиль с адресом ssh://сервер:22 ушёл бы в сеть настоящим адресом хозяина, пока окно показывало «за прокси».

  • HTTP

    Обычный вид, в котором продают чаще всего. До прокси связь открытая, дальше идёт то, чем пользуется сам сайт.

  • HTTPS

    То же самое, только участок от браузера до прокси закрыт TLS.

  • SOCKS5

    Пропускает любое соединение TCP. Имя узла отдаётся прокси, а не разбирается на вашей машине, поэтому посещённый домен не утекает вашему провайдеру.

  • SSH

    Это вовсе не прокси. Туннель до вашего сервера превращается в настоящий SOCKS5 на петле ещё до того, как браузер о нём узнает.

Адрес хранится один раз, а работает в пятидесяти профилях

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

Один адрес лежит в одном месте. Профиль связан с записью по номеру и при этом несёт свою копию связи. Копия здесь нарочно: профиль не может оказаться связанным и без прокси одновременно, а это отправило бы окно в сеть настоящим адресом. Правка записи обновляет все профили, которые за ней следуют, и окно называет их число до того, как вы нажмёте сохранение.

Библиотека живёт в аккаунте, поэтому на втором компьютере список тот же. Записи склеиваются по номеру в аккаунте, а не по адресу: адрес человек правит, и склейка по нему создала бы вторую строку вместо правки первой. Правка, сделанная без связи, сильнее серверной записи, пока сервер её не примет, так что новый пароль от продавца не затрётся на ближайшей сверке.

Рядом стоит витрина: справочник из 8 поставщиков с указанием регионов и порядка цен. Заказ там это записанный запрос, по которому с вами свяжутся. Денег он не берёт, и в библиотеку сам по себе ничего не кладёт.

Библиотека прокси в ARMANOS: строка на каждый сохранённый адрес с видом связи, логином и итогом последней проверки
Строка на адрес. Итог последней проверки остаётся в строке, поэтому мёртвые записи видно без повторного прогона всего списка.

Пароль не попадает в командную строку

Почти каждый платный прокси идёт с логином. Очевидный способ отдать его браузеру это командная строка: --proxy-server=http://логин:пароль@узел:порт. Способ плох дважды.

Во-первых, командную строку читает любая программа, запущенная под вами, а домашний трафик продаётся гигабайтами. Во-вторых, он попросту не работает. Замерено на собранном движке: простая запись дала 13 запросов через прокси, запись с паролем ноль запросов и ни одной загруженной страницы.

Поэтому ARMANOS поднимает рядом свой маленький прокси на петле, по одному на открытый профиль. С браузером он говорит вовсе без пароля. С вашим настоящим прокси он говорит с логином, языком HTTP CONNECT или SOCKS5 со входом по RFC 1929, смотря что нужно. В командной строке остаётся только http://127.0.0.1:порт, а пароль живёт в памяти программы.

Порт на петле доступен другим программам этой машины, поэтому мост спрашивает разовый пропуск и без него отвечает обычным отказом 407. Пропуск предъявляет встроенное расширение защиты профиля, а не человек: это случайная строка, годная на один запуск и ничего не стоящая вне его. Если расширение не записалось на диск, отвечать некому, и пропуск отменяется, чтобы не оставить вас с мёртвым окном; программа говорит об этом в журнале. Если мост не поднялся вовсе, запуск отказывает, а не отправляет браузер к прокси, войти на который он не сможет.

--proxy-server=http://логин:пароль@узел:порт
0 запросов, ни одной страницы
--proxy-server=http://127.0.0.1:порт, впереди мост
13 запросов через прокси

Замерено на собранном ARMANOS Browser 153.0.7978.0. Движок отвергает запись с паролем, поэтому до появления моста профили на прокси с логином были мертвы полностью.

На диске пароль закрыт, а если закрыть нечем, вам скажут

Пароли прокси лежат в двух файлах: в библиотеке и в записях профилей. Права только для хозяина спасают от соседа за тем же компьютером. Они не спасают от резервной копии, от папки пользователя, уехавшей в облако, и от программы, запущенной под вами же.

Оба файла закрывают пароль средствами системы: связкой ключей macOS или DPAPI в Windows. Закрытое значение пишется с меткой enc1: и открывается при чтении. Если система закрыть не может, ARMANOS пишет как раньше и не делает вид, что закрыл. Своего постоянного ключа в исходнике нет: ключ, лежащий внутри программы, это украшение, а не защита.

В общем аккаунте обычный список прокси не возит пароли вовсе. Пароль выдаётся отдельным ходом, по одной записи, и выдача пишется в журнал, поэтому увольнение сотрудника действительно что-то значит. Чтобы выгрузить всю библиотеку вместе с паролями, нужна роль управляющего.

Закрыть одну библиотеку было мало

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

Через прокси идёт весь трафик профиля

Chromium принимает правила прокси в двух видах, и один из них ловушка. Запись http=узел:порт означает «через этот прокси ходить по адресам http://», и только по ним. Замерено поддельным прокси на петле: запрос http шёл через него, а запрос https получал ответ напрямую, и прокси его не видел.

Сегодня весь настоящий трафик это https. Значит, окно уходило в сеть вашим настоящим адресом, пока программа показывала профиль «за прокси», а ради предотвращения ровно этого продукт и существует. Теперь адрес пишется одной строкой, а одна строка применяется ко всем схемам.

WebRTC это вторая дорога мимо прокси: он умеет открывать свой UDP. Обоим движкам поставлено disable_non_proxied_udp: ARMANOS Browser получает это доводом запуска, встроенный движок настройкой самого окна. Проверка утечек в программе это не утверждает, а меряет: поднимает скрытое окно с той же настройкой и спрашивает у него кандидатов WebRTC, как это сделал бы сайт.

Если у профиля есть прокси, который нельзя выразить рабочим правилом, запуск отказывает с причиной proxy_unusable. Открыть окно на настоящем адресе хуже, чем не открыть его вовсе.

ЧтоКуда идёт
Страницы по httpsЧерез прокси профиля
Страницы по httpЧерез прокси профиля
Разбор имён узлов на SOCKS5Отдаётся прокси, на вашей машине не разбирается
UDP от WebRTCЗакрыт, если он идёт не через прокси
Стартовая страница ARMANOSТолько петля, прокси не касается
Связь самой программы с аккаунтомВаше обычное соединение, без прокси профиля

Страна выхода задаёт часы и язык

Часовой пояс, спорящий с адресом, проверяют одним из первых. Поэтому страна выхода здесь не украшение: она решает, какие у профиля часы и какой список языков.

Страну узнаёт проба, идущая через сам прокси, по TLS, с обходом до четырёх источников подряд. Четырёх, а не одного, по простой причине: бесплатный источник начинает отвечать 429 при пакетном запуске, и один отказ не вправе решать, кем будет профиль. Ответ запоминается на профиле и стирается, как только меняется выход, в том числе после смены адреса.

Известная страна превращается в согласованные часы и стопку языков. Список доходит до движка доводами --lang и --accept-lang, а расширение защиты закрепляет navigator.languages сверху, потому что Chromium показывает там только первый язык.

Если страну прочитать не удалось совсем, профиль всё равно открывается, а вы получаете уведомление. Переписать отпечаток задним числом было бы хуже: аккаунты, куда профиль уже вошёл, увидели бы новую машину.

Страна выходаЧасыЯзыки
ГерманияEurope/Berlinde-DE, de, en
БразилияAmerica/Sao_Paulopt-BR, pt, en
УкраинаEurope/Kyivuk-UA, uk, ru, en
ЯпонияAsia/Tokyoja-JP, ja, en

Три способа сменить адрес и один способ раздать набор

Мобильные прокси покупают именно ради смены адреса. Продавец даёт ссылку: сходи по ней, и модем возьмёт новый адрес. ARMANOS держит эту ссылку прямо в строке библиотеки, и она перестаёт жить в переписке с продавцом.

Запрос уходит напрямую, а не через тот прокси, который сейчас перезапускается. Отправить его по каналу, который в этот миг падает, значит получить обрыв вместо ответа. Перенаправление принимается только на тот же узел, а ответ читается с ограничением, чтобы большая страница не съела весь срок ожидания.

Адрес меряется до и, после короткой паузы, ещё раз. Поэтому в строке виден новый выход, а не прежний. Если продавец ответил, а адрес остался тем же, программа так и говорит. У продавцов свои пределы частоты, и объявить смену, которой не было, значит подтолкнуть вас к неверному шагу.

  1. 1

    Рукой

    Кнопка «Сменить IP» в строке библиотеки. Меряется и «до», и «после», поэтому видно, что случилось на самом деле, а не что просили.

  2. 2

    Перед запуском

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

  3. 3

    По времени

    Свой срок у профиля, не меньше пяти минут. Меняются только открытые профили, отсчёт идёт от открытия окна, а неудачная попытка всё равно отмечается по времени, чтобы за час не выжечь оплаченный предел смен.

  4. 4

    По кругу из набора

    Раздача набора прокси выбранным профилям. Открытые пропускаются и своего прокси не съедают, а место в круге запоминается, поэтому следующая раздача продолжает круг, а не выдаёт то же самое.

Выход через свой сервер, по SSH

Если у вас уже есть сервер, у вас уже есть выход, и он не стоит ничего сверху. ARMANOS поднимает рядом с профилем обычный ssh с динамической переадресацией, и тот открывает настоящий SOCKS5 на петле. Браузеру достаётся socks5://127.0.0.1:порт, про ssh он не знает ничего, и ни одна дорога запуска не меняется.

Пароль не касается командной строки. ssh спрашивает его своим ходом SSH_ASKPASS, а маленький ответчик читает его из безымянного канала в папке, открытой только хозяину. Канал стирается сразу, как только туннель поднят, и содержимого его на диске не бывает вовсе. Зашифрованный ключ работает так же: пароль от ключа ssh спрашивает тем же ходом.

Ваши личные файлы ssh остаются нетронутыми. Свой файл известных узлов лежит внутри данных программы, а запуск идёт с -F /dev/null, поэтому ProxyJump или ProxyCommand из вашей личной настройки не уведут профиль туда, куда вы его не посылали. Имена узлов хранятся без хеша нарочно: когда ключ сервера меняется, кнопка забывает строку именно этого узла и только её.

Оборванный туннель выглядит живым: порт на петле открыт, а страницы просто не грузятся. ServerAliveInterval делает обрыв заметным, ARMANOS трижды пробует поднять туннель на том же порту и после этого говорит прямо. Туннель снимается вместе с профилем, поэтому закрытое окно не оставляет живого подключения к вашему серверу.

Путь к файлу ключа остаётся на этой машине

Строка вроде /Users/вася/.ssh/id_ed25519 на втором компьютере не значит ничего, а иногда там лежит чужой ключ. Поэтому путь хранится местно и не ездит вместе с библиотекой. Сам закрытый ключ ARMANOS не читает и не хранит: его читает ssh.

Что показывает проверка и чего она не знает

Проверка идёт той же дорогой, что и запуск. Прокси с логином проходит через тот же мост на петле, а запись ssh сперва поднимает настоящий туннель. Это важно: пока проверка шла своим путём, рабочий платный SOCKS5 с паролем всегда показывался сломанным и горел в списке красным, а профиль за ним оставался без страны выхода.

Возвращаются адрес выхода, страна и город, часовой пояс по данным источника и время ответа. Последнее число это первый ответ, а не весь обход источников. Источник, ответивший 429 при массовой проверке, раньше добавлял к замеру свой срок ожидания, и исправный прокси показывал двенадцать секунд.

Итог пишется в строку вместе со временем, поэтому список показывает мёртвые записи без повторного прогона при каждом открытии. Кнопка «Проверить все» обходит библиотеку и говорит, сколько ответило. Мост проверки и туннель проверки снимаются по её окончании, в том числе при удаче, чтобы ничего не осталось слушать порт.

Проверка отвечает на один узкий вопрос: ответил ли этот адрес сейчас и откуда. Она не говорит, как относится к этому адресу конкретный сайт, и ничего не говорит про следующий час.

  • Она может сказать

    Адрес отвечает, выход виден в такой-то стране под таким-то IP, и ответ пришёл за столько-то.

  • Она не может сказать

    Считает ли площадка этот адрес чистым, сколько людей сидит на нём рядом с вами и будет ли он отвечать вечером.

Чего это не делает

  • Прокси здесь не продаются. Витрина это справочник из 8 поставщиков, а заказ на ней это записанный запрос: денег он не берёт и в библиотеку сам ничего не кладёт.
  • Проверка это мгновение, а не приговор. Она говорит, что адрес ответил из такой-то страны прямо сейчас, и ничего не говорит о том, как к нему относится площадка.
  • Часы и язык следуют за выходом только для 22 стран из таблицы. Вне их профиль остаётся с часами и языками, которые выдал его собственный отпечаток, и предупреждения об этом случае нет.
  • Смена адреса целиком зависит от ссылки продавца. ARMANOS сходит по ней и померяет итог, но заставить модем взять новый адрес не может и честно скажет, если адрес остался прежним.
  • Разовый пропуск к мосту на петле предъявляет расширение защиты ARMANOS Browser. На встроенном движке мост работает без пропуска, поэтому, пока такой профиль открыт, к этому порту может подключиться другая программа этой машины.

Как проверить

Каждое утверждение выше лежит в одном файле, и почти у каждого есть стенд, который можно запустить.

Правило прокси применяется ко всем схемам, и https не проходит мимо
apps/desktop/src/main/main.js · apps/desktop/test/proxy-covers-https.js
Пароль доходит до прокси через мост на петле, а не через командную строку
apps/desktop/src/lib/proxyAuthBridge.js · apps/desktop/test/proxy-auth-bridge.js · apps/desktop/test/прокси-с-паролем-живьём.js
Пароли прокси на диске закрыты средствами системы либо честно записаны незакрытыми
apps/desktop/src/lib/proxies.js · apps/desktop/test/proxy-password-sealed.js
Проверка идёт той же дорогой, что и запуск, вместе с мостом и туннелем
apps/desktop/src/main/main.js · apps/desktop/test/proxy-check-uses-bridge.js
Выход по SSH держит пароль вне командной строки и вне диска
apps/desktop/src/lib/sshTunnel.js · apps/desktop/test/выход-по-ssh.js

Дайте каждому профилю свой выход

Поставьте ARMANOS, вставьте список прокси один раз и откройте профиль за ним.