Что означает ошибка EADDRINUSE (порт 514 уже используется)
Ошибка появляется, когда приложение (чаще всего rsyslog или syslog-ng) пытается привязать сокет к порту 514 (стандартный порт для syslog), но система сообщает, что этот порт уже занят другим процессом. В журнале вы увидите сообщения вроде:
rsyslogd: error: bind to address 0.0.0.0:514 failed: Address already in use
Это значит, что любой процесс, уже слушающий UDP/TCP‑порт 514, препятствует запуску вашего syslog‑демона.
Причины возникновения
- Запущен второй syslog‑демон (например,
systemd-journaldв режимеForwardToSyslog=yes). - Сторонний сервис (например,
snort,suricataили пользовательский скрипт) использует порт 514 для собственных логов. - Конфигурация Docker/Podman: контейнер с проброшенным портом 514 уже работает на хосте.
- Неправильный параметр в
/etc/rsyslog.conf: попытка слушать одновременно UDP и TCP без указанияModLoad imudp/imtcp. - Остаточный процесс после неудачного обновления, оставшийся в памяти.
Способы решения
Способ 1: Найти и остановить конфликтующий процесс
- Выполните команду, чтобы увидеть, кто занимает порт:
sudo ss -ulpn | grep :514
Пример вывода:udp UNCONN 0 0 *:514 *:* users:(("systemd-journald",pid=1234,fd=12)) - Остановите процесс по PID или имени службы:
sudo systemctl stop systemd-journald # или, если это сторонний процесс: sudo kill -9 1234 - Перезапустите
rsyslog:sudo systemctl restart rsyslog - Проверьте статус:
sudo systemctl status rsyslog
⚠️ Важно: Останавливая
systemd-journald, убедитесь, что журналирование не требуется другими сервисами. После перезапускаrsyslogможно снова включитьsystemd-journald:
sudo systemctl start systemd-journald
Способ 2: Перенаправить syslog на альтернативный порт
Если конфликтовать с другим сервисом невозможно, измените порт, который использует rsyslog.
- Откройте конфигурацию:
sudo nano /etc/rsyslog.conf - Найдите строки, отвечающие за ввод:
module(load="imudp") # UDP listener input(type="imudp" port="514") module(load="imtcp") # TCP listener input(type="imtcp" port="514") - Замените
514на свободный, например515:input(type="imudp" port="515") input(type="imtcp" port="515") - Сохраните файл и перезапустите сервис:
sudo systemctl restart rsyslog - При необходимости измените конфигурацию клиентов (например, в
/etc/rsyslog.d/remote.conf) чтобы они отправляли логи на новый порт.
Способ 3: Отключить прослушивание одного из протоколов
Если вам нужен только UDP или только TCP, отключите ненужный модуль, тем самым освобождая порт для другого процесса.
- В файле
/etc/rsyslog.confзакомментируйте лишний ввод:#input(type="imtcp" port="514") # отключаем TCP - Перезапустите
rsyslog:sudo systemctl restart rsyslog - Проверьте, что теперь порт занят только одним процессом:
sudo ss -ulpn | grep :514
Способ 4: Проверить Docker/Podman контейнеры
Если вы используете контейнеры, один из них может пробрасывать порт 514 на хост.
- Список контейнеров с пробросом портов:
sudo docker ps --format "{{.ID}} {{.Names}} {{.Ports}}" | grep 514 - Остановите конфликтующий контейнер:
sudo docker stop <container_id> - Перезапустите
rsyslog.
Профилактика
- Регулярно проверяйте используемые порты:
sudo ss -tulnв cron‑задании поможет вовремя заметить конфликты. - Не запускайте одновременно два syslog‑демона. Оставьте только один (обычно
rsyslogилиsystemd-journaldсForwardToSyslog=no). - При работе с контейнерами явно указывайте маппинг портов и проверяйте, не конфликтует ли он с хостом.
- Обновляйте конфигурацию после установки новых пакетов, которые могут добавить свои слушатели (например,
snort).