Linux-приложение в подробностях
Это глубокое погружение: каждая крупная поверхность Linux-приложения, чем она управляет, её умолчания и как чинить, когда что-то ломается. Предполагается, что вы уже установили приложение и подключились. Если нет, начните с начала работы. Как работает сеть за приложением — в обзоре.
Linux-клиент — десктопное приложение GTK4/libadwaita поверх root-демона под systemd, поставляемое как AppImage плюс .deb. Всё это открыто на github.com/urnetwork/linux.
Настройки одним взглядом
Умолчания защищают вас без настройки. Органы управления подключением живут в шторке подключения; режим раздачи сидит в органах управления на главном экране; переопределение локации устройства — над глобусом подключённых провайдеров.
| Настройка | По умолчанию | Эффект | Главная цена |
|---|---|---|---|
| Режим соединения (Connection mode) | Авто | выбирает окна провайдеров; Авто ведёт качество и скорость вместе | Веб (Web) или Стриминг (Streaming) сужают до одного окна |
| Строгая анонимизация (Strong Anonymization) | Вкл | скрывает ваш исходный IP от провайдера | больше задержки |
| Постквантовое шифрование (Post Quantum Encryption) | Вкл | шифрует от приложения до провайдера | пропускает провайдеров без запечатанного сеанса |
| Kill switch (аварийный стоп) | Выкл | останавливает локальный откат, когда туннель лежит | нет трафика, пока провайдеры отказывают |
| Фиксированный IP (Fixed IP) | Выкл | один провайдер, один адрес выхода | нет замены при сбое |
| Блокировать рекламу и трекеры (Block ads and trackers) | Выкл | фильтрует трафик рекламы и трекеров | фильтрация может ломать некоторые сайты |
| Собственный DNS (Custom DNS) | зашифрованный DoH через туннель | DNS остаётся зашифрованным и внутри туннеля | ослабить его — и есть размен |
| Режим раздачи (Provide mode) | Никогда (Never) | раздаёт свободную полосу как выход для других | чужой трафик выходит с вашего IP |
| Переопределение локации устройства (Device location override) | Выкл | приложения, спрашивающие GeoClue, видят город вашего самого долгого провайдера | нужен GeoClue 2.7+; затрагивает каждое приложение на машине |
| Правила разделения (домен/IP) | пусто | перечисленные назначения используют ваше локальное подключение | этот трафик не защищён |
Оговорки к таблице:
- Выключить Строгую анонимизацию — это прямой режим: клиент говорит с провайдером напрямую и ускоряется, и этот провайдер тогда видит ваш реальный адрес. Умолчание защищает вашу личность. Тратьте её сознательно.
- Kill switch решает и судьбу пакета, который отбрасывает фильтр безопасности (см. режим раздачи): включён — блокируется напрочь, выключен — уходит вашим обычным маршрутом.
- Раздельного туннелирования по приложениям на Linux нет. Правила разделения — уровня доменов и IP.
- Удаления аккаунта на Linux тоже нет. Делайте это в веб-приложении на ur.io, которое управляет тем же аккаунтом.
Разделение с демоном
Две программы, два уровня привилегий:
urnetworkd— root-демон под управлениемurnetworkd.service, без единой GUI-зависимости. Он встраиваетDeviceLocalиз SDK, открывает и держит/dev/net/tun, качает пакеты через IO-цикл SDK и применяет маршруты и DNS. Его устанавливает.debили установочный tarball.urnetwork— десктопное приложение, gtkmm-4.0 и libadwaita, работает от вашего обычного пользователя и поставляется как AppImage. Оно держитDeviceRemote: вид на устройство демона, а не собственное устройство.
Они говорят по двум каналам:
- RPC устройства.
DeviceRemoteприложения ведётDeviceLocalдемона по взаимно аутентифицированному TLS RPC SDK на loopback,127.0.0.1:12025, — тот же транспорт, что у Windows-приложения. - Управляющий сокет. Unix-сокет на
/run/urnetwork/control.sockнесёт жизненный цикл туннеля: поднять туннель, снести его, задать режим раздачи, сообщить состояние демона.
Настоящая граница авторизации — unix-сокет. Loopback-TCP достижим любым локальным процессом, поэтому RPC устройства взаимно аутентифицирован сертификатами. Но ничто не запускает туннель, минуя unix-сокет, где само ядро говорит демону, какой пользователь просит (SO_PEERCRED, проверяется до разбора единого байта запроса, с авторизацией по идентификатору пользователя, никогда — процесса). Каталог — 0750 root:urnetwork, сокет — 0660, и правило такое: root или член группы urnetwork.
Перенос RPC устройства тоже на unix-транспорт — записанное продолжение в SDK; заметки о конструкции называют ограничение loopback, а не выдают loopback за приватный.
Две половины должны совпадать
Linux — первая платформа URnetwork, где приложение и туннель обновляются независимо: AppImage самообновляется от вашего имени, демон обновляется через apt. Поэтому при подключении приложение проверяет две вещи: версию управляющего протокола и то, что обе половины несут ровно одну и ту же сборку SDK. Несовпадение отклоняется сразу, с отдельным сообщением (служба не запущена, служба устарела, приложение устарело, сборки различаются), потому что у каждого своя починка, а молча полуработающий туннель хуже ошибки.
Как устанавливаются части
Обе половины берутся со страницы релизов: .deb, .install.tar.gz и .AppImage, amd64 и arm64, с нижней границей glibc 2.35 — то есть Ubuntu 22.04 или Debian 12 и новее. Листинга в магазинах нет.
Пакету принадлежит всё привилегированное и стабильное: демон в /usr/lib/urnetwork/urnetworkd, его юнит systemd, desktop-запись, иконки, данные карты мира, из которых рисуется глобус, переводы и лаунчер в /usr/bin/urnetwork.
GUI-AppImage пакетом не устанавливается никогда. Он живёт в вашем домашнем каталоге (~/.local/lib/urnetwork/URnetwork.AppImage), доступном на запись пользователю, чтобы заменять себя без root. Лаунчер перебирает фиксированный список мест ($URNETWORK_APPIMAGE, затем ~/.local/lib/urnetwork/, затем ~/Applications/, затем /usr/lib/urnetwork/, затем любой urnetwork-gui в $PATH) и запускает первое попадание; когда не установлено ничего, печатает однострочную подсказку, где взять.
Демон работает с нужной привилегией и отдаёт ненужное: NoNewPrivileges, ProtectHome (он безголовый и никогда не должен читать домашние каталоги пользователей), PrivateTmp, каталоги состояния и логов только для root. Он упорядочен относительно network-pre.target — слота, который нужен VPN, чтобы действовать до подъёма сети, — и работает постоянно, а не активируется по сокету, потому что лениво запущенный юнит вовсе не может участвовать в этом упорядочивании.
Маршруты
Когда туннель поднимается, демон не заменяет ваш маршрут по умолчанию. Он его перебивает, как это делает wg-quick:
- Он добавляет маршруты через туннельный интерфейс (
urnet0), покрывающие всё пространство IPv4, кроме приватных диапазонов LAN: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16. - Они специфичнее вашего существующего умолчания
0.0.0.0/0, поэтому выигрывают, не трогая его. Снос — это просто их удаление; ваша исходная маршрутизация не изменяется никогда. - Исключение приватных диапазонов сохраняет работу принтера, NAS и локальных сервисов, пока вы подключены, — то же поведение, что у клиентов Android, Apple и Windows.
NetworkManager велено держать руки при себе: urnet0 помечен неуправляемым через конфигурационный drop-in NetworkManager и правило udev, поэтому сетевой менеджер десктопа никогда не дерётся с демоном за интерфейс.
DNS
DNS на туннельном линке ставится через systemd-resolved (resolvectl), стандартный резолвер десктопов Ubuntu: резолверы линка нацеливаются на сетевые, с ~., чтобы запросы шли через него, и всё откатывается при сносе. Не каждая система ведёт resolved, поэтому поведение по замыслу «по возможности»:
- С systemd-resolved: DNS туннельного линка перехватывается и восстанавливается.
- Без него: туннель всё равно маршрутизирует, но DNS на этом линке не перехватывается. Ваши запросы продолжают пользоваться тем резолвером, какой был у системы.
Ещё одна тонкость: поисковый домен из DHCP (lan, home) — более длинное совпадение, чем ~., и победит его для имён в этом домене. Если у вас необычная схема резолверов, проверьте, куда действительно идёт ваш DNS.
Более осмысленный контрол — собственный лист Собственный DNS приложения. Он редактирует настройки резолверов SDK, чьё умолчание — зашифрованный DNS over HTTPS, резолвящийся через туннель. Он предлагает DoH и незашифрованное разрешение, удалённое или локальное, редактируемые списки серверов по семействам, переключатель локального резервного DNS, который пускает локальный резолвер наперегонки на старте туннеля, чтобы запросы не замирали, региональные рекомендации для мест, где самая строгая конфигурация заведомо ломается, и одно действие возврата к безопасным умолчаниям.
Трей
Значок статуса — StatusNotifierItem с меню com.canonical.dbusmenu, произносимым напрямую через GDBus: протокол, который KDE и большинство панелей поддерживают нативно, а GNOME — через расширение AppIndicator. Без хоста трея приложение не показывает значка, а не падает.
Закрытие окна прячет в трей и оставляет туннель работать. Меню несёт подключение/отключение, показ и выход. Выход здесь — настоящий: он завершает сеанс и опускает туннель. Изо дня в день вам нужна кнопка закрытия, а не выход.
Окно
Сначала вход, затем главный вид: контрол подключения, глобус провайдеров и шторка. Вход принимает код на почту или телефон, Создать аккаунт (Create account), код авторизации, сгенерированный на устройстве, где вы уже вошли, или подпись кошелька через Solana (Phantom, Solflare) или Bittensor. Там же сидит унаследованная кнопка Попробовать гостевой режим (Try Guest Mode). Она чеканит на сервере обычный постоянный аккаунт, но это приложение выбрасывает сид-фразу восстановления, которая приходит с ним, — так что пользуйтесь другими путями, если хотите возможность восстановить аккаунт позже.
Глобус провайдеров рисуется из топологии мира, идущей в комплекте с приложением. Никакие тайлы карт не подтягиваются, поэтому ничто о карте, на которую вы смотрите, не покидает вашу машину.
Шторка подключения несёт сеанс:
- Карточка органов управления соединением. Выбранная локация, режим соединения Авто, Веб или Стриминг и четыре переключателя: Фиксированный IP, Строгая анонимизация, Постквантовое шифрование и kill switch. Режим выбирает, какое окно провайдеров работает: Веб — окно качества (2–6 провайдеров сразу), Стриминг — окно скорости (1–2), а Авто ведёт оба бок о бок — поэтому у обычного сеанса открыто обычно 3–8 провайдеров, а не один. Строгая анонимизация — то, что запрещает прямой путь клиент↔провайдер, поэтому ни один провайдер никогда не видит ваш реальный адрес; выключить её — прямой размен из таблицы выше. Постквантовое шифрование запечатывает сам сеанс (см. панель идентичности ниже).
- Карточки клиентской и локальной статистики с живыми графиками, каждая открывает лист деталей.
- Статус Собственного DNS, открывающий редактор резолверов выше.
- Блокировать рекламу и трекеры.
- Тариф и использование. Ваш уровень, полоса использовано/ожидает/доступно, строки дневного лимита и рефералов, Получить UR Pro (Get UR Pro) и активация кода баланса.
- Панель постквантовой идентичности (ниже).
Листы, каждый — настоящий экран, а не заглушка:
- Локации. Секции SDK по корзинам: сначала подключённые пиры вашей сети, затем лучший доступный, затем страны с живыми счётчиками провайдеров. Набор в поиске добавляет лучшие совпадения плюс регионы, города и устройства. Город здесь — то, что ищут, а не то, до чего прокручивают.
- Подключённые провайдеры. Глобус над строками по одному провайдеру, который сейчас в вашем окне, начиная с самого старого соединения, с идентификатором клиента, городом/регионом/страной, координатами, длительностью и удалением на месте.
- Контракты. Живые контракты на передачу за вашим сеансом, по стопке на пира, отправка и приём порознь.
- Правила разделения. Правила уровня доменов и IP, которые принуждают конкретный трафик к вашему локальному подключению, поверх живой ленты того, к чему они применяются.
- Активировать код. Применить код баланса, с историей активированных.
- Апгрейд. UR Pro на месяц или год через Stripe checkout, встроенный в приложение там, где в системе есть WebKitGTK, и с откатом в ваш браузер иначе — потому что путь оплаты не должен жёстко падать никогда.
Отдельных экранов Аккаунт, Кошелёк или Таблица лидеров на Linux сегодня нет. Тариф и баланс живут в шторке и листе активации, а настройки аккаунта — в веб-приложении на ur.io. Выход из аккаунта — на главном виде.
Переопределение локации устройства
Linux получает настоящую версию того, что Android называет «синхронизацией локации устройства»: приложениям, которые спрашивают систему, где вы, можно сообщать координаты провайдера, с которым вы соединены дольше всего, вместо вашего фактического местоположения. Переключатель сидит над глобусом подключённых провайдеров, с гидом по настройке, и выключен, пока вы его не включите.
Механизм узкий. У GeoClue — сервиса, у которого десктопные приложения спрашивают локацию, — есть статический источник, который читает фиксированную позицию из /etc/geolocation и следит за изменениями файла. Этот файл — единственная точка впрыска, и живёт он под /etc, поэтому запись делает демон по тому же управляющему каналу; GUI его не трогает никогда и root ему не нужен.
Гид прямо называет пределы. Нужен GeoClue 2.7.0 или новее, который есть не в каждой системе; Ubuntu 22.04 и Debian 12 поставляют версию старше и не смогут удовлетворить требование никогда. И движется только то, что сообщает GeoClue: за ним следуют Настройки и Карты GNOME, Firefox и песочничные приложения Flatpak и Snap. Chrome и KDE Plasma вообще не спрашивают GeoClue, всё, что вычисляет вашу локацию из IP-адреса, не затронуто, а Firefox откатывается на собственный запрос, если система отвечает медленно. К тому же меняется локация, сообщаемая каждому приложению на машине, а не только URnetwork. Всё остальное в приложении работает независимо от этого.
Режим раздачи
Раздача по умолчанию выключена, и органы управления на главном экране предлагают Авто, Всегда, Сеть (только устройства вашего собственного аккаунта) или Никогда (Auto, Always, Network, Never). Провайдеры участвуют в протоколе UR; ur.xyz документирует, как работают вознаграждения.
Когда вы раздаёте, вас защищает открытый слой ip_security движка connect. Он ведёт глубокую инспекцию пакетов на вашем собственном выходе и отбрасывает трафик класса DMCA (сигнатуры BitTorrent и файлообмена с отслеживанием состояния, отбрасывание непрозрачных протоколов) и класса CFAA (шаблоны атак и вторжений) до того, как он покинет вашу машину. Тот же фильтр работает и на вашем собственном отправном пути как обычного пользователя, включали вы раздачу или нет, поэтому ваш трафик судится на вашей машине до того, как достигнет любого провайдера.
При совпадении пакет отбрасывается, без записи назначения, домена и содержимого. Сигнатура BitTorrent на трафике, который вы несёте для кого-то другого, дополнительно поднимает оператору флаг злоупотребления, держащий только идентификатор отправившего устройства и логический признак, и обработчика для него оператор сегодня не поставляет. Непрозрачно-зашифрованный поток — простое отбрасывание, которое не докладывает ничего вовсе. Запечатывание фильтр не обходит, потому что он работает там, где трафик выходит. А судьбу пакета отбрасываемого класса с вашей собственной машины решает kill switch: выключен — уходит по вашему локальному подключению, включён — останавливается.
Панель постквантовой идентичности
Шторка показывает сеансовую идентичность этого устройства: идентикон, канонический хеш ключа и идентификатор клиента (клик копирует), колоду идентичностей провайдеров, с которыми у вас установлены проверенные сеансы, полный список идентичностей провайдеров и диалог «Поделиться» для сравнения отпечатка по другому каналу.
Что делает настройка: Постквантовое шифрование поставляется включённым, и пока оно включено, ваш клиент запечатывает трафик сквозным шифрованием до провайдера по сеансу, согласованному с X25519MLKEM768 (гибрид классики плюс ML-KEM). Это запечатанное звено и делает средний узел слепым: оператор несёт байты, которые не может прочитать. Оно работает по принципу fail-closed: пока настройка включена, клиент не отправляет и не принимает данные приложения в открытом виде, поэтому провайдер, с которым не удаётся установить такой сеанс, пропускается, а не используется незапечатанным. Цена — потерянный провайдер, а не потерянное шифрование, и незаметно понизить вас нельзя. Каждая текущая сборка провайдера включает отвечающую сторону, так что пропуск редок. Выключите настройку — и трафик снова сможет пойти по стандартному пути TLS-к-платформе. Подписи идентичности остаются Ed25519, шифр — AES-256-GCM. «Постквантовое» означает этот обмен ключами, не шире.
Что сеть делает под капотом
Ваш трафик проходит четыре звена: вы → экстендер → оператор → провайдер → интернет. Экстендер — звено достижимости, которое пересылает ваш зашифрованный сеанс, не читая его; как ваш первый узел, он ваш адрес видит. Обзор объясняет полный путь, почему он останавливается на четырёх звеньях, и окна провайдеров.
Для настроек этого приложения важно разделение между двумя ретранслирующими сторонами. Провайдер никогда не узнаёт, кто вы, потому что между вами стоит оператор. Оператор не может прочитать, что вы отправляете, потому что Постквантовое шифрование по умолчанию запечатывает сеанс сквозным шифрованием до провайдера. На заводской установке выполняется и то и другое, поэтому ни одна сторона не держит одновременно вашу личность и вашу активность. Три состояния, которые дают два переключателя:
| Режим | Видит оператор | Видит провайдер | По умолчанию и доступность |
|---|---|---|---|
| Ретранслируемый запечатанный | ваш аккаунт и исходное подключение, на каких провайдерах вы сидите, и шифртекст с его таймингом и объёмом | назначения, которые он выводит, и идентификатор устройства/контракта, не ваш реальный IP | заводское умолчание: Постквантовое шифрование, включено в шторке подключения |
| Ретранслируемый стандартный | ваш аккаунт и исходное подключение, на каких провайдерах вы сидите, и назначения и байты пакетов внутри | назначения, которые он выводит, и идентификатор устройства/контракта, не ваш реальный IP | только при выключенном Постквантовом шифровании |
| Прямой | меньше участия в ретрансляции | ваш реальный IP и назначения, которые он выводит | по явному выбору: выключите Строгую анонимизацию |
Модель угроз прорабатывает эти строки против именованных противников и прямо говорит, где каждая из них отказывает.
На стороне оператора хранить почти нечего: записи о подключениях держат односторонний хеш с ключом (перемешанный одним секретным ключом) от вашего блока IP, а не адрес, реестр контрактов держит идентификаторы клиентов и счётчики байтов без назначения, хоста, URL и домена где бы то ни было, а путь данных не логирует ничего. Географический запрос всё же записывает приблизительный город на подключение; то, куда вы через него ходите, не записывается вовсе. Ни один независимый аудит не покрывает протокол и серверный код оператора (две сторонние оценки 2025 года покрывают другие поверхности: тест на проникновение веб-приложения и API и пройденную оценку Leviathan MASA AL2 Android-приложения — не Linux-клиента). Существующие вместо этого проверки — сам открытый код, непрерывно проверяемый любым, и конструкция выхода: выход — это децентрализованный флот отдельно управляемых провайдеров, а не один хранитель, держащий всё. Ограничение: насколько независим этот флот на самом деле, никогда не измерялось, и ничто не мешает оператору вести собственных провайдеров (модель угроз §6.1).
Ограничения
- Kill switch поставляется выключенным. Это настоящий переключатель в шторке подключения, но пока вы его не включите, трафик при отсутствии живых провайдеров откатывается на ваше обычное подключение, а не останавливается. Шторка применяет его вживую по RPC устройства, и демон восстанавливает ваш выбор при следующем старте.
- Через туннель — только IPv4. IPv6 через него не маршрутизируется, поэтому в сети с включённым IPv6 сайт, умеющий v6, всё ещё может увидеть ваш реальный адрес. Отключите IPv6 на подключении, если всё должно выходить через провайдера.
- Нет раздельного туннелирования по приложениям. Правила — уровня доменов и IP.
- Нет входа через Google или Apple.
- Перехват DNS зависит от systemd-resolved, как описано выше.
Устранение неполадок
«Системная служба URnetwork не запущена»
Проверьте демон и его сокет:
systemctl status urnetworkd
journalctl -u urnetworkd -fДемон рассказывает, что настраивает и что восстанавливает, поэтому это первое место, где искать проблемы подъёма туннеля, маршрутов и DNS. Логи GUI остаются в вашей пользовательской сессии, отдельно от привилегированной половины, — в этом и смысл разделения.
Если демон работает, а приложение всё равно не может до него достучаться, вы, вероятно, не в группе urnetwork: id -nG подскажет. Добавьте себя командой sudo usermod -aG urnetwork "$USER" и выйдите из системы и войдите снова.
«Служба устарела» / «разные сборки»
Обновите обе половины до одного релиза: демон — установкой более нового .deb (или перезапуском install.sh из более нового tarball), AppImage — в ~/.local/lib/urnetwork/. Проверка существует, чтобы наполовину обновлённая установка сказала об этом, а не тихо сбоила.
AppImage не стартует
Ubuntu 22.04+ по умолчанию не поставляет libfuse2, а AppImage он нужен. .deb объявляет эту зависимость, поэтому установка пакета демона обычно решает вопрос; иначе установите libfuse2 (или libfuse2t64 на более новых выпусках). Проверьте и то, что файл исполняемый.
Нет значка в трее
У вашего десктопа нет хоста StatusNotifierItem. На GNOME установите расширение AppIndicator; KDE и большинство панелей поддерживают его нативно. Без него приложение прекрасно работает: закрытие окна просто прячет его, а открываете вы снова из меню приложений.
Ссылки urnetwork:// ничего не делают
Кошельковый вход возвращается через ссылку urnetwork://, которой после установки нужна обновлённая база desktop-записей. Запустите update-desktop-database ~/.local/share/applications (или системный путь с sudo). Пакетная установка делает это за вас; ручная могла и не сделать.
Интерфейс существует, но ничего не маршрутизируется
Проверьте, что NetworkManager не управляет urnet0. Пакет поставляет конфигурационный drop-in и правило udev, помечающие его неуправляемым, и обоим нужна перезагрузка (nmcli general reload conf, udevadm control --reload), которую делает установщик.
Остальное
Обзор объясняет сеть из конца в конец: провайдеры, контракты, что каждая сторона может и не может видеть, и шифрование. FAQ отвечает на частые вопросы. Другие платформы: Android, iOS, macOS, Windows и браузер.