Что означает ошибка 13
Ошибка Permission denied (код 13 / EACCES) возникает, когда Linux-задача пытается привязаться к сетевому порту, но не имеет достаточных прав. Типичные сценарии: запуск приложения без root, попытка использовать порт ниже 1024 (80, 443), блокировка брандмауэром или политика SELinux/AppArmor.
Причины возникновения
- Недостаток прав root – не-root-пользователь не может использовать «защищённые» порты (<1024).
- Отсутствие необходимых capabilities – процесс не получил
CAP_NET_BIND_SERVICE. - Блокировка брандмауэром –
iptables,firewalldилиufwблокируют входящий трафик на порт. - Порт уже занят – другой процесс уже слушает этот порт.
- Политика SELinux/AppArmor – ограничения SELinux могут запретить приложению доступ к порту.
- Неправильная конфигурация приложения – указан занятый или заблокированный порт.
Способы решения
Способ 1: Запустите приложение с правами root или sudo
- Откройте терминал.
- Выполните команду с
sudo:sudo <your‑app>. - Если приложение запускается через сервис, отредактируйте его unit-файл и добавьте
User=root(или используйтеsudoв ExecStart).
💡 Совет: Используйте
sudoтолько для низких портов; для постоянного доступа рассмотритеsetcapвместо полного root.
Способ 2: Используйте порт >1024 (измените конфигурацию)
- Откройте конфигурационный файл приложения (
sudo nano /etc/yourapp.conf). - Найдите строку
portи измените её на порт >1024, напримерport=8080. - Перезапустите сервис:
sudo systemctl restart yourapp.
Способ 3: Откройте порт в брандмауэре
firewalld
sudo firewall-cmd --permanent --add-service=http # для порта 80
sudo firewall-cmd --reload
iptables
sudo iptables -I INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables-save > /etc/iptables/rules.v4
⚠️ Важно: После изменения правил перезапустите firewalld (
sudo systemctl restart firewalld) или iptables (sudo systemctl restart iptables).
Способ 4: Освободите занятый порт
- Определите процесс:
sudo lsof -i :80. - Запишите PID (
123456). - Завершите его:
sudo kill -9 123456. - Повторите попытку запуска приложения.
Способ 5: Добавьте необходимые права с помощью setcap
- Убедитесь, что
libcap2-binустановлен (sudo apt install libcap2-bin). - Добавьте capability:
sudo setcap 'cap_net_bind_service=+ep' /path/to/binary. - Проверьте:
getcap /path/to/binary— должно показатьcap_net_bind_service=+ep.
Профилактика
- Используйте порты >1024 для пользовательских сервисов – избегайте необходимости в root.
- Настройте сервисы через systemd с явным указанием пользователя и группы.
- Регулярно проверяйте брандмауэр (
sudo firewall-cmd --list-all,sudo iptables -L -n). - Мониторьте занятые порты (
sudo ss -tulpn) и устраняйте конфликты. - Включите SELinux/AppArmor в режиме « enforcing» и ведите его логи (
audit.log). - Документируйте конфигурацию портов и храните резервные копии в VCS для быстрого восстановления.