Claude Desktop на Linux, через прокси

от автора

Я сижу на Debian под KDE Plasma и для решения проблемы “your country is not supported”, часто встречающийся у популярных агентов, предпочитаю мультихоп прокси (на последней миле у меня sign-box слушает 127.0.0.1:7890). Claude Code в терминале бегают через него, а вот десктопное приложение делало вид, что прокси не существует. Пришлось разобраться, и заодно оформить это в аккуратный воспроизводимый вид.

Явление официальной сборки под Linux

Во времена древних богов, воителей и королей простой народ использовал неофициальную сборку claude-desktop-debian от aaddrick, которая распаковывала виндовый установщик и заворачивала его в Electron. Однако, в конце июня 2026 Anthropic, аки Прометей, снизошла до “менее 1% пользователей” и выпустила официальную бету под Linux.

Пакет claude-desktop ставится из apt-репозитория downloads.claude.ai, и дальше речь пойдёт про него. Заявлена поддержка Debian 12 и новее, Ubuntu 22.04 и новее, на архитектурах amd64 и arm64, но я лично запускал его только на Debian 13 amd64 из под KDE.

Ставим из репозитория

Всё как обычно с внешними apt-репозиториями. Качаем ключ подписи, добавляем репозиторий, ставим пакет.

sudo curl -fsSLo /usr/share/keyrings/claude-desktop-archive-keyring.asc \  https://downloads.claude.ai/claude-desktop/key.ascecho "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/claude-desktop-archive-keyring.asc] https://downloads.claude.ai/claude-desktop/apt/stable stable main" \  | sudo tee /etc/apt/sources.list.d/claude-desktop.listsudo apt update && sudo apt install claude-desktop

Перед тем как довериться ключу, отпечаток можно сверить руками.

gpg --show-keys /usr/share/keyrings/claude-desktop-archive-keyring.asc# должно быть: 31DD DE24 DDFA B679 F42D  7BD2 BAA9 29FF 1A7E CACE

Дальше обновления будут прилетать штатно вместе с apt upgrade. Проверим, что поставилось, и на что смотрит лаунчер.

Репозиторий, версия пакета и симлинк лаунчера

Репозиторий, версия пакета и симлинк лаунчера

Обратите внимание на последнюю строку, /usr/bin/claude-desktop это символическая ссылка на нативный бинарник /usr/lib/claude-desktop/claude-desktop, обычный Electron-бинарник. Именно к нему мы дальше и прицепим флаг прокси.

Почему GUI не видит прокси

Claude Code, консольный агент, читает свои настройки из файла ~/.claude/.env и переменные http_proxy/https_proxy, а Claude Desktop к этому файлу отношения не имеет, это отдельное приложение на Electron, то есть внутри там Chromium со своим сетевым стеком.

При этом Chromium под KDE берёт настройки прокси из системных настроек рабочего окружения, а переменные http_proxy из окружения он попросту игнорирует.

Посмотрим, что мы имеем.

KDE, нативный бинарник Electron и заданные, но бесполезные для GUI переменные прокси

KDE, нативный бинарник Electron и заданные, но бесполезные для GUI переменные прокси

Окружение KDE, бинарник это стриптованный ELF (тот самый Chromium внутри Electron), переменные прокси в шелле заданы. Но десктопному Claude от них ни тепло ни холодно. В системных настройках KDE прокси у меня стоит в режиме “не использовать”, и приложение честно ходит напрямую. На GNOME была бы та же история, только настройки читались бы из gsettings.

Городить системный прокси на всё окружение ради одного приложения не хочется. Значит, надо рассказать о прокси электрону.

Решение, флаг —proxy-server

У Chromium есть собственный ключ командной строки --proxy-server, который перебивает любые системные настройки. Именно его мы и передадим приложению. Заодно проверим на живом трафике, что флаг действительно работает. Поднимем фейковый прокси-порт, который просто пишет в лог всё, что к нему стучится, и запустим Claude с этим флагом.

Приложение с флагом --proxy-server честно уходит на подставной прокси

Приложение с флагом —proxy-server честно уходит на подставной прокси

Весь трафик приложения, включая claude.ai:443, ушёл на наш подставной прокси. Флаг работает. Осталось оформить это так, чтобы не запускать приложение руками из терминала каждый раз.

Обёртка-скрипт

Пишем маленький лаунчер, который подставляет флаг и передаёт дальше все аргументы и кладём его в ~/.local/bin/claude-desktop-proxy.

#!/usr/bin/env bashPROXY_HOST="127.0.0.1"PROXY_PORT="7890"PROXY="http://$PROXY_HOST:$PROXY_PORT"args=("--proxy-server=${PROXY}""--proxy-bypass-list=localhost;127.0.0.1;10.0.0.0/8;172.16.0.0/12;192.168.0.0/16;<local>")exec /usr/bin/claude-desktop "${args[@]}" "$@"

Пара слов про содержимое. Скрипт намеренно простой, добавляет два флага и запускает бинарник. --proxy-bypass-list уводит мимо прокси то, что должно ходить напрямую. Это локалхост и приватные диапазоны 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, куда попадают LAN и дефолтные bridge-сети Docker. Иначе обращения к контейнерам и соседям по сети гоняло бы через туннель.

Делаем скрипт исполняемым.

chmod +x ~/.local/bin/claude-desktop-proxy

Правка desktop-файла

Скрипт есть, теперь надо, чтобы иконка в меню и обработчик ссылок claude:// запускали именно его.

Системный файл /usr/share/applications/claude-desktop.desktop править бесполезно, он принадлежит root и будет перезаписан при первом же обновлении пакета, в KDE лучше положить свой файл с тем же именем в ~/.local/share/applications/, пользовательский каталог перекрывает системный.

Берём за основу оригинальный desktop-файл и меняем в нём все строки Exec, чтобы они шли через обёртку. Обязательно сохраните StartupWMClass и действия New chat/New Claude Code session, иначе сломается группировка окон и пункты контекстного меню.

[Desktop Entry]Name=ClaudeComment=Desktop application for Claude.aiGenericName=AI AssistantKeywords=AI;Chat;Assistant;Claude;Code;LLM;Exec=claude-desktop-proxy %UIcon=claude-desktopType=ApplicationStartupNotify=trueStartupWMClass=claude-desktopSingleMainWindow=trueCategories=Utility;Development;MimeType=x-scheme-handler/claude;Actions=NewChat;NewCode;[Desktop Action NewChat]Name=New chatExec=claude-desktop-proxy claude://claude.ai/new[Desktop Action NewCode]Name=New Claude Code sessionExec=claude-desktop-proxy claude://code/new

Полный путь в Exec не обязателен. Первый токен система ищет как обычную команду, и если каталог обёртки есть в PATH, хватает одного имени. ~/.local/bin туда обычно уже входит, так что Exec=claude-desktop-proxy резолвится сам. Если каталога в PATH нет, укажите реальный абсолютный путь, например /home/pasha/.local/bin/claude-desktop-proxy.

После правки обновляем кэш меню.

update-desktop-database ~/.local/share/applications

Проверка

Полностью выходим из Claude Desktop, именно выходим, а не сворачиваем, и открываем заново из меню. Теперь он поднимается через обёртку. Смотрим на живые соединения.

ss показывает, что процессы Claude держат соединения с прокси на 7890

ss показывает, что процессы Claude держат соединения с прокси на 7890

Процессы claude и claude-desktop держат установленные соединения с 127.0.0.1:7890, то есть весь трафик приложения идёт через прокси. Что и требовалось. Приложение при этом выглядит и работает как обычно, никаких сторонних изменений внутри него нет.

Итог

Claude Code читает ~/.claude/.env, а Claude Desktop это Chromium, которому на KDE нужен свой ключ --proxy-server, лечится обёрткой на несколько строк и пользовательским desktop-файлом, ничего в системных каталогах трогать не пришлось, так что решение переживает обновления пакета.

Полезные ссылки:

  • официальная инструкция по установке под Linux;

  • статья спецов из Anthropic про установку Claude Desktop;

  • неофициальная сборка, с которой всё начиналось.

Благодарю за прочтение. Если тема близка, заходите на мой Telegram-канал Pavel Zloi, пишу там про on-prem модельки, серверы, агентов и прочите радости жизни.

ссылка на оригинал статьи https://habr.com/ru/articles/1055848/