Запуск Discord через socks5 proxy flatpak linux

Это небольшой гайд про то как запустить Flatpak версию Discord через socks5 прокси, при этом не натягивая TUN на всю систему, как обычно, это бывает в классических случаях. Работа данного способа была проверенна на Fedora 42 Gnome и Plasma workstation. Во всех остальных случаях думаю работать будет аналогично. Гайд сделан сугубо от нуба и ламера, не претендует на профессиональность

Перед началом действий, убедитесь что Discord работает через socks5 прокси в ручном режиме

Для того чтобы проверить будет ли Discord вообще работать с socks5 прокси. Нужно попробовать запустить его с флагом для Flatpak среды которая четко будет указывать что данное приложение должно быть запущено с заданными параметрами. Команда для запуска выглядит так

flatpak run com.discordapp.Discord --proxy-server="socks5://127.0.0.1:7771"

В данном случае параметры в строке “socks5://127.0.0.1:7771” можно заменить на свои. В моем случае, при использовании V2rayN, он по умолчанию цепляет socks5 и не только на порт 10808. Соответственно строчка в моем случае выглядит так “socks5://127.0.0.1:10808”
Pasted image 20250430033209
Теперь чтобы все выглядело красиво нужно все это дело автоматизировать и еще лучше прицепить в .desktop файл, который в Gnome и Plasma используется, чтобы запускать приложения из ярлыков, которые находятся в обзоре Gnome и “пуске” Plasma соответственно. В моем случае, решение проблемы с запуском любезно советовала мне нейронка Grok.


Перейдем непосредственно к настройке

  • После того как вы убедились что у вас работает ручной запуск Discord с параметром данным выше. Нужно все это дело засунуть в скрипт. Все буду показывать через GUI утилиты, консоль это легче и проще для кого-то, а для кого-то нет
  1. Создаем файл скрипта. Создать можно просто в домашней директории, то есть /home/ваш_ник. Создать можно штатными средствами, в моем случае это обычный текстовик Gnome который идет по умолчанию в Fedora 42

    В файл мы вписываем сам скрипт, он очень простой, те же самые строчки, что из запуска вручную.
#!/bin/bash
flatpak run com.discordapp.Discord --proxy-server="socks5://127.0.0.1:7771"

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


Также не забываем про права на файл

chmod +x ~/ваш_скрипт.sh

Соответственно название скрипта вписываем свое, открыть терминал Gnome можно по клику правой клавишей мыши(чтобы задать права через терминал) прямо в той директории в которой находитесь в проводнике, прям как в windows ничего нового

  1. Создаем .desktop файл в директории
/home/ваш_ник/.local/share/applications

В случае с Gnome обычно там хранятся пользовательские .desktop файлы, в случае с Plasma все должно быть похоже. Содержание файла должно быть таким

[Desktop Entry]
Name=Discord (Proxy)
Exec=/home/ваш_ник/discord-proxy.sh
Type=Application
Icon=com.discordapp.Discord
Terminal=false
Comment=Discord with SOCKS5 Proxy
Categories=Network;Chat;
  • Параметр Name указывает на то как будет называться ярлык
  • Параметр Exec указывает на запуск нашего скрипта. Тут думаю все понятно и нужно просто вставить путь до нашего скрипта (в моем случае это discord-proxy.sh, в вашем - по вашему)
  • Icon - тут можно ничего не трогать, если discord уже был установлен в системе, иконка должна где-то лежать, у меня по крайней мере было так. Но в случае чего иконку можно указать и в качестве пути, принимаются обычные png файлы, путь к ним прописывается по аналогии с exec. Вот пример одного из .desktop файлов который я создавал для V2rayN

    Переваривает даже кириллицу в пути
  • Comment - комментарий от любезной нейронки чтобы мы не забыли потом что тут делали и для чего был этот файл, также коммент отображается в Plasma, насколько помню в качестве подписи
  • Categories - тут больше актуально для Plasma или Gnome но если есть расширения по типу “пуск” обычно там идет сортировка на категории приложений, она берется как раз отсюда, чтобы в Plasma у вас ярлык добавился в нужную категорию, нужно тут соответственно вписать что-то то куда вы хотите чтобы добавился ваш ярлык. Про остальные категории и что лучше тут указать думаю можно погуглить или спросить у нейронки. Для обзора Gnome это не очень актуально, в нем карусель без сортировки, в моем случае оставил все как есть

После создания сохраняем файл, может потребоваться ввести пароль sudo, чтобы сохранить файл, вводим и сохраняем.
Также в случае с Gnome может потребоваться обновление кэша либо перелогиниваемся, тоже должно сработать. Команда для обновления кэша ниже

update-desktop-database ~/.local/share/applications
  1. В итоге должна получиться вот такая иконка(ярлык) которая будет запускать нам Discord через наш скрипт в котором мы указали тот самый параметр запуска(флаг) с socks5 прокси. Подключение к голосовым каналам работать не будет так как данный способ не проксирует UDP

P.s Для rpm версии которая была установлена через DNF шаги будут похожими, только строка для запуска в скрипте будет чуть другая, ну и для простой “portable” версии которая распространяется на сайте discord через tar.gz архив, шаги тоже будут очень похожи. Там ярлык запуска придется создавать в любом случае, так как вся программа лежит в архиве и запускается по исполняемому файлу
P.ss Буду рад если в комментариях напишете способ получше или дополните мой. Также если нужен будет способ с запуском rpm версии или “portable” версии, тоже пишите, может подскажу команды для запуска именно для этих версий.

           ┌───┐════════════════════════════════════════════════════════════════════════════                        
           │ ┌─┼──────────────────────────────────────────────────────────────────────────┐ ║                       
           │ │ │  / __ \____ _      _____  ________  ____/ /  / /_  __  __   /   |  /  _/ │ ║                       
           └─┼─┘ / /_/ / __ \ | /| / / _ \/ ___/ _ \/ __  /  / __ \/ / / /  / /| |  / /   │ ║                       
           ║ │  / ____/ /_/ / |/ |/ /  __/ /  /  __/ /_/ /  / /_/ / /_/ /  / ___ |_/ /  ┌─┼─┐                       
           ║ │ /_/    \____/|__/|__/\___/_/   \___/\__,_/  /_.___/\__, /  /_/  |_/___/  │ │ │                       
           ║ └──────────────────────────────────────────────────────────────────────────┼─┘ │                       
            ════════════════════════════════════════════════════════════════════════════└───┘

Ну и да, забыл написать что команда для запуска обычной “DNF” версии discord очень похожа

Discord --proxy-server="socks5://127.0.0.1:7771"

Ну и ее также можно засунуть в .desktop файл через .sh скрипт

забыл добавить что голосовые звонки при этом работать не будут, если я не ошибаюсь, т.к. сокс прокси в дискорде (да и во всём electron т.к. основан на chromium) проксирует только TCP, у тебя возможно блокировка UDP на тспу отлетела, проверь лог сокс прокси при звонке, должны быть udp пакеты на высокие порты 50ххх

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

Это галлюцинация нейронки, такой переменной не существует. Вы конечно можете её задать, но flatpak о её существовании не знает, и соответственно никак использовать не будет.

Здесь, как мне кажется, переизобретен велосипед. Всё сделать можно намного проще:

  1. Скопировать оригинальный .desktop из flatpak’а в ~/.local/share/applications:
    1.1. Из ~/.local/share/flatpak если дискорд установлен только для текущего юзера
    1.2. Из /var/lib/flatpak если дискорд установлен для всех юзеров
    cp СИСТЕМНЫЙ_ИЛИ_ЮЗЕР_FLATPAK/exports/share/applications/com.discordapp.Discord.desktop ~/.local/share/applications/

  2. Открыть скопированный .desktop в редакторе

  3. Найти строчку Exec=/usr/bin/flatpak run ... и добавить в конце --proxy-server=ВАШ_СЕРВЕР

  4. Если хотите, можно поменять имя в строчке Name=...

Пример:

  • Было: Exec=/usr/bin/flatpak run --branch=stable --arch=x86_64 --command=com.discordapp.Discord --file-forwarding com.discordapp.Discord @@u %U @@
  • Стало: Exec=/usr/bin/flatpak run --branch=stable --arch=x86_64 --command=com.discordapp.Discord --file-forwarding com.discordapp.Discord @@u %U @@ --proxy-server=socks5://127.0.0.1:1080

Готово!

In Chrome SOCKSv5 is only used to proxy TCP-based URL requests. It cannot be used to relay UDP traffic.

И это она мне тоже советовала, и это я тоже пробовал но опять же у меня почему-то не сработало, не знаю влияет ли месторасположение команды “–proxy-server=ВАШ_СЕРВЕР” на ее работоспособность. Потому что вы посоветовали ее поставить в конец, а вот мне она советовала не в самый конец ставить. Сейчас даже ради интереса посмотрю, будет ли работать так как вы посоветовали. По результатам отпишу

Она в самом конце потому что во flatpak’е всё что идёт после id приложения передается как аргументы самому приложению.

Name

flatpak-run — Run an application or open a shell in a runtime
Synopsis

flatpak run [OPTION...] REF [ARG...]

flatpak run [OPTION...] REF [ARG...]
где OPTION - это параметры самого flatpak’а
где REF - это название приложения
где ARG - это параметры самого приложения

Так ну получается оригинальные .desktop хранятся у меня в /var/lib/flatpak/exports/share/applications насколько я опять же понимаю. Там какой-то жесткий линк на /var/lib/flatpak/app/com.discordapp.Discord/current/active/export/share/applications . И после копирования и модификации строчки

Exec=/usr/bin/flatpak run --branch=stable --arch=x86_64 --command=com.discordapp.Discord --file-forwarding com.discordapp.Discord @@u %U @@ --proxy-server=socks5://127.0.0.1:1080

Да все заработало. И это правда наверное проще намного чем писать скрипт. Наверное как раз команду нужно было вписывать в самый конец строки. Но опять же, не знаю как проще будет обычному пользователю который знаком только с виндой. Я вот минут 5 сейчас сидел и думал где у меня оригинальный .desktop файл от флетпак версии дискорд находится. Я думаю некоторым будет проще и скрипт написать. Хотя понятно что и в целом линуксоидам не нужно вообще что-то расписывать, они и сами знают как себе хороший ярлык сделать. Но спасибо, не знаю можно ли тут как-то закрепить сообщение но было бы очень кстати

Ну всё со временем приходит :slight_smile:

Чтобы узнать как установлен дискорд: flatpak list --app

Вот что выводит у меня:

Name          Application ID               Version       Branch       Installation
Discord       com.discordapp.Discord       0.0.93        stable       user
Kate          org.kde.kate                 25.04.0       stable       system

Жалко что flatseal такое не показывает в gui

Так и есть

У меня все стоит в “system”. Вообще давно пора в дискорде сделать настройку прокси серверов как это делается у Телеграмма например. Но я не программист так что говорить за внедрение такой фичи не могу, может ее вообще невозможно внедрить, но она бы, решила думаю очень много проблем, которые есть. Даже в каком нибудь Spotify в клиенте есть настройка прокси сервера. Но пока что разработчики Discord создают только впечатление самых ленивых людей в мире

так и есть, они долгое время не обновляли хром встроенный, где уже добавили возможность стримить демку со звуком на линуксе, потом сломали её на несколько версий (где-то 2-3 недели).

в спотифае используется тот же --proxy-server просто кнопку добавили, я уверен он также не умеет в udp, но в спотифае такое и не нужно

То есть, есть возможность добавить поддержку UDP и это может быть не самым сложным занятием? Или все таки у Discord есть какие-то ограничения которые потребуют чуть ли не все переписать на что-то новое? Вообще учитывая что это Electron то наверное надо бы и об этом подумать :grin: но там уже столько всего настроено что менять будет очень больно

Это надо чтобы сам хромиум добавил поддержку udp при проксировании, я не думаю что разработчики дискорда будут изворачиваться ради этого.

Понятно, значит зависит все по сути не от них, или частично не от них. Спасибо за погружение в лор, может быть тогда стоит ждать когда к команде --proxy-server прикрутят UDP хотя и может быть это тоже не будет решением проблемы, хотя в той же WIN у меня все через ProxiFyre все замечательно работает, в тч и UDP, и там вроде реально работает а не потому что у меня отвалилась блокировка на основном провайдере. Я чего-то в данном случае не посмотрел, даже можно было не на порты смотреть а в целом на пинги в голосовом канале когда подключаешься, с проксей у меня там 100 минимум, сейчас было по 50-60 когда на линуксе тестировал этот метод

ProxiFyre использует виндовский апи для фильтра интернет трафика (грубо говоря тот же самый tun), поэтому всё работает.

Я у себя использую iptables + TPROXY. Весь tcp+udp трафик идёт на xray, а там фильтры по доменам. Всё идёт как обычно, кроме доменов, они идут через другую страну.

Это уже более сложная настройка, я сам настраивал это несколько дней, пытаясь понять как работает роутинг в линуксе.

Получается что такого же просто способа как на WIN, просто вписать пару строчек в конфиг, поставить его на автозагрузку в nssm и так далее, и просто забыть, короче на линуксе такого нет. В целом ничего удивительного, популярность дает о себе знать, но… Надеемся и верим что приход более простой аудитории как я, которая способна максимум скрипт написать или файл .desktop поменять, что приход такой аудитории все таки поменяет чуть тренды в разработке ПО под Линуксы, кто-то говорит что это плохо, кто-то что хорошо, но я сам замечаю как за 5 лет линукс стал проще, проще для обычного человека, и это не может не радовать ведь спасения от WIN просто не было

я видел что Nekoray и V2rayN поддерживают tun mode на линуксе (если хочешь в один клик как на винде), но у меня оно не работало

Так ладно что поддерживают, мне нужно как раз чтобы у меня отдельно дискорд через прокси работал, в Neko точно помню что есть но на винде работало точно, а тут не знаю, может быть я пытался когда-то но не работало, скорее всего. Именно проксирование отдельных exe а в случае с линуксом вообще наверное такого функционала нет

у меня работает через nekoray от mahdi на федоре, нативный и флатпак дискорд, настраивал так же как и для винды, только процесс один и case-sensitive:

  1. settings → routing → common tab → default outbound - direct
  2. route tab → default → advanced → создаёшь 2 правила:
    inbound mixed-in, outbound proxy (чтобы локальный прокси socks/http шёл на vless)
    process_name Discord, outbound proxy (чтобы Discord процесс шел на vless)
скрины


остальной трафик (браузер без прокси и все остальные проги) пойдёт в direct, но на счёт днс не уверен, но это сильно и не парит.