С выходом Manifest V3 в Google Chrome большинство расширений, позволяющих управлять настройками прокси, перестали полноценно работать, а некоторые и вовсе перестали. Основным функционалом для меня (как думаю и для большинства пользователей) было автоматическое туннелирование запросов для сформированного пользователем списка хостов, а также включение прокси для отдельной вкладки (окна), не затрагивая остальные.
Изучив доступные варианты в магазине расширений Chrome, понял что подходящих вариантов практически нет. Чаще всего расширения предлагают использовать пользовательский PAC скрипт или запустить прокси для всего браузера. В первом случае постоянное редактирование скрипта при попытке добавить очередной хост выглядит малопривлекательным, во втором сильно - урезает гибкость работы в интернете. Поэтому было принято решение написания собственного минималистичного расширения с удобным управлением, без сторонних библиотек. Программирование для меня - хобби, поэтому писал код в свободное от работы время.
В силу того, что Manifest V3 ударил и по блокировщикам рекламы в том числе, решил что настало время перейти на Firefox. Особенно после того, как посмотрел документацию и понял, что Proxy API здесь намного гибче. И, как самый крупный бонус, возможность установки расширения на Android версию браузера.
Сказано - сделано. Firefox позволил реализовать все пожелания по управлению прокси. API дает доступ к сетевым запросам, показывая: запрашиваемый адрес, id вкладки, с которой пришел запрос, режим (regular, incognito) и пр. и позволяет точечно пускать трафик через прокси, в зависимости от условий. Полная панель управления получилась такой.

Чтобы хост текущей вкладки было удобно добавлять/удалять из пользовательсного списка Host list, сделал большую кнопку сверху. Простой вариант - брать хост из адресной строки не подошел, так как он становится доступным только после ответа от сервера. Если запрос “зависнет”, то пришлось бы ждать, пока он не “отвалится” по таймауту. Поэтому выручил browser.webRequest.onBeforeRequest.
По настройкам прокси все стандартно. Доступные типы: HTTP, HTTPS, SOCKS4, SOCKS5 + авторизация. Я же использую локальный SOCKS5 без авторизации.

Сам Host list реализовал как обычную таблицу с полями, но с возможностью переключения на текстовое поле, чтобы можно было разом загрузить/выгрузить большой список. Также добавил поддержку поддоменов, если основной домен не должен быть туннелирован.

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

Реализация довольно простая - с помощью все того же onBeforeRequest. Но в этот раз нам нужно знать чем закончился запрос (т. е. доступен ли хост). Поэтому реализовал такую логику: если отслеживаемый хост хотя бы на один из запросов ответил кодом 200, красим поле зеленым цветом, если все запросы с ошибкой - красным, в процессе выполнения - синим.
Полный объем расширения со всеми иконками составил чуть меньше 40 кБ. Протестировал и опубликова его в Firefox ADD-ONS. Дополнение на момент написания поста собрало более 500 пользователей. Изначально даже не рассчитывал на аудиторию больше 10-15 человек. Что удивительно - большая часть установок пришлась на Android устройства, видимо там альтернатив значительно меньше. Товарищи же попросили портировать расширение для Google Chrome, потому как оказалось большая часть пользуется хромиум-подобными браузерами и осознанно обходят Firefox стороной.
Просмотрев документацию MV3 Chrome Extensions понял, что можно попрощаться с тумблером “прокси для вкладки” и прямого доступа к туннелированию запроса в зависимости от его параметров я не получу. Здесь прокси работает либо для всего браузера сразу, либо через PAC скрипт. Еще есть вариант с bypassList, который не пускает указанные адреса через прокси, но это совсем не то, что нам нужно. Также из ограничений - отсутствие авторизации для SOCKS5 (для кого-то может быть критично). Из хороших новостей Chrome API позволяет запускать разные прокси для обычного режима и режима инкогнито. Панель управления стала полегче, в отличие от версии для Firefox.

Проблему с работой Host list решил через генерирование PAC скрипта с обновлением параметров прокси для браузера после каждого добавления/изменения хоста.
Из других проблем MV3, это возможность “засыпания” расширения, которое хранит в оперативной памяти данные по хостам для всех вкладок, а также последние примененные параметры прокси. По наблюдениям приложение засыпает только во время простоя браузера, т. е. при отслеживании хостов для активных вкладок проблем не возникает. При пробуждении Host tracker будет пустым, с этим придется смириться, потому как использовать local storage самого расширения для этих целей - не самое удачное решение. С настройками прокси же проблем не возникает, после пробуждения их легко применить по необходимости.
Закончив работу над портированной версией также загрузил ее в интернет-магазин Chrome. Удивил единоразовый взнос в 5$ за возможность публикации там дополнений. Еще больше удивили сроки рассмотрения публикации. Если в Firefox все происходит в течении 15 минут, то здесь же пришлось ждать 3 дня. Внесение любых правок в уже существующий пакет также занимает не мало времени. Из положительных сторон - это возможность любого хромиум-подобного браузера установить расширение из магазина Chrome. Расширение протестировано на: Chrome, Edge и Яндекс Браузер.
В заключение скажу, что MV3 хоть и имеет заметные ограничения, но все же еще позволяет строить велосипеды, пусть и с некоторым количеством компромисов.
Ссылка на проект: github
Комментарии (4)

MaXaoH_Forever
23.06.2026 12:17То, что я напишу ниже, не является советом или указанием, это всего лишь мое мнение, не принимайте его как инструкцию.
Однажды, когда гуглоголовые выкатили новый Material Design и Chrome Refresh 2023, я сильно плевался на него (причины, как минимум - жирные контекстные меню, которые даже при достаточном пространстве по высоте умудрялись скрываться и приходилось прокручивать). Поставил версию 125 (последняя, где еще не был вырезан старый дизайн), полез в рабочую папку (папку хрома, не папку профиля) и отжал всевозможные права, оставив только чтение и выполнение. Далее выполнил некоторые твики по возвращению старого дизайна (описывать не буду, инфа есть в сети), и с тех пор по сей день пользуюсь этой версией. И, понятное дело, MV2 там работает. В качестве прокси расширения использую "обход блокировок рунета". Разработчик забросил поддержку после перехода на MV3, но не суть. В целом, реализация автора поста схожа с тем плагином. Если будет желание, то можно посмотреть фичи оттуда и увеличить функционал. Правда, учитывая, что не работает тот же Discord и Telegram, то приходится использовать полноценные туннели с проксированием конкретных приложений и маршрутизацией либо по доменам, либо по geoip+geosite базам
dartraiden
Выглядит как аналог ZeroOmega. И это хорошо, потому что последний имеет привычку периодически подвешивать весь браузер при включенном прокси.
Но лично мне в EasyProxy не хватает двух вещей: поддержки нескольких прокси (чтобы можно было переключаться вручную и автоматически, например, пуская один сайт через первый прокси, а другой через второй) и возможности указать список хостов в виде ссылки (по которой расширение будет периодически его скачивать). Не лишним было бы иметь и список исключений или, хотя бы, опцию "не гонять локальные ресурсы через прокси", чтобы не приходилось отключать прокси вручную, когда приспичит зайти на всякие 10.*, 172.16.* и 192.168.*
hurtavy
Вот несколько прокси - это важно. Сам для этого использую SwitchyOmega
martini-drinker Автор
Вариант с несколькими прокси не добавлял осознанно, так как расширение изначально задумывалось как простой способ работы с хост листом для одного прокси (в моем случае локального socks - туннеля до сервера). В случае нескольких прокси уже нужно указывать к какому прокси добавлять хост и в каком из списков содержится загружаемый хост в Host tracker. Все это уже выходит за рамки небольшого popup по нажатию на иконку расширения. Вариант же с black list можно добавить (учитывая что в прошлом уже поступало такое предложение), только нужно будет ограничивать одновременную работу hostlist и blacklist. Подгружаемый список хостов также можно добавить, обновлять автоматически при старте с возможностью ручного обновления. Спасибо за отклик.