#Когда возникает проблема и к каким системам относится
После перевода приложения на отдельную учётную запись другой процесс не может подключиться к Unix-сокету. Проверяют реального создателя сокета, разрешения родительского каталога и socket activation. Rocky Linux с приложением, использующим Unix-domain socket для связи процессов; пользователь службы изменён недавно.
#Основные причины: как отличить одну от другой
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Сокет создаёт другой UIDНа socket остаётся прежний владелец после смены User= | stat показывает root или старую группу | Исправить пользователя создающей службы и штатные параметры SocketMode |
| Недоступен родительский каталогКлиенту не хватает x на /run/папке | namei -l показывает закрытую цепочку | Назначить доступ только требуемой группе |
| Сокет управляется socket unitsystemd создаёт файл раньше службы | systemctl cat *.socket показывает SocketUser/SocketGroup | Настраивать socket unit вместо ручного chmod |
#Пошаговая диагностика и устранение неисправности
- Шаг 1. Найдите точный путь сокета из сообщения клиентаВ терминале прочитайте журнал ошибки приложения и убедитесь, что речь о Unix socket, а не TCP-порту. Путь вида /run/имя/сервис.sock часто пересоздаётся при каждой загрузке.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
ss -xlpn | head -50systemctl --failed
- Шаг 2. Сравните права сокета с UID клиентаВставьте реальный путь из сообщения. stat показывает владельца и режим сокета; namei — права прохода по всем каталогам. Наличие chmod 660 у сокета бесполезно, если каталог закрыт.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
SOCK="/run/имя/сервис.sock"stat -c "%a %U:%G %n" "$SOCK"namei -l "$SOCK"
- Шаг 3. Узнайте, кто именно создаёт сокетСопоставьте серверную службу и приложение-клиент, их User/Group. Если используется systemd socket activation, сокет создаёт .socket unit, и смена владельца у файла вручную пропадёт после перезапуска.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
systemctl list-sockets --allsystemctl status имя.socket --no-pager
- Шаг 4. Проверьте определения socket и serviceИзучите SocketMode, SocketUser, SocketGroup и ListenStream, а также User и RuntimeDirectory родительского service. Не назначайте на весь /run права 777: это временная ФС, права должны создаваться штатными механизмами.
- Терминал Rocky Linux; административные права не обязательныLinux · Терминал (Bash)КомандаТерминал Rocky Linux; административные права не обязательны. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
systemctl cat имя.socketsystemctl cat имя.service
- Шаг 5. Проверьте дополнительные ограничения SELinuxЕсли обычные UNIX-права подходят, но подключение запрещено, проверьте актуальный отказ AVC. Не отключайте SELinux и не переводите все процессы в unconfined; настройте только проверенный тип сокета.
- Терминал Rocky Linux; нужны административные праваLinux · Терминал (Bash)КомандаНужен sudoТерминал Rocky Linux; нужны административные права. Диагностика или адресная проверка; выполните только при соответствии условиям шага.
getenforceSOCK="/run/имя/сервис.sock"ls -lZ "$SOCK"command -v ausearch && sudo ausearch -m AVC -ts recent | tail -30 || true
- Шаг 6. Исправьте конфигурацию, создающую сокетВыберите именно socket unit, если он управляет файлом. В drop-in добавляйте только доказанно нужные SocketGroup/SocketMode и сохраняйте исходный вариант. Если приложение создаёт сокет самостоятельно, проверьте его собственный umask и конфигурацию.
- Терминал Rocky Linux; нужны административные праваLinux · Терминал (Bash)С осторожностьюНужен sudoТерминал Rocky Linux; нужны административные права. Меняет настройки/состояние службы: сначала копия и возможность отката.
sudo systemctl edit имя.socketКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
- Шаг 7. Проверьте новый сокет после штатного перезапускаВ согласованное окно перезапустите конкретный сокет и сервис согласно порядку приложения. Не удаляйте /run/*.sock вручную при активном сервере. Снова проверьте stat/namei и реальное подключение клиента.
- Терминал Rocky Linux; нужны административные праваLinux · Терминал (Bash)С осторожностьюНужен sudoТерминал Rocky Linux; нужны административные права. Меняет настройки/состояние службы: сначала копия и возможность отката.
sudo systemctl daemon-reloadsudo systemctl restart имя.socketsystemctl status имя.socket имя.service --no-pagerss -xlpn | grep "сервис.sock" || trueКоманда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.
#Как убедиться, что неисправность устранена
Клиент под своим UID подключается к правильному сокету, права сохраняются после нового старта службы и перезагрузки; другим пользователям не выдаётся лишний доступ.
#Если предложенный способ не сработал
Если сокет исчезает, проверьте порядок запуска и RuntimeDirectory, затем журнал создающего процесса. Не меняйте владельца самого сокета вручную как постоянное исправление.