Rsyslog — это демон (сервис), предназначенный для регистрации и ведения журналов системных событий. Он позволяет собирать сообщения от операционной системы и различных сервисов, фильтровать их по нужным параметрам и записывать в соответствующие файлы журналов.
Одним из ключевых преимуществ Rsyslog является гибкость настройки. С помощью правил и фильтров можно определить, какие сообщения нужно сохранять, куда их записывать и какие журналы пересылать на другие серверы. Rsyslog поддерживает работу как с UDP, так и с TCP, что позволяет выбирать подходящий способ передачи журналов в зависимости от требований к надёжности и производительности.
Помимо локальной обработки журналов, с помощью Rsyslog можно настроить централизованный сервер ведения журналов, на который другие Linux-серверы будут отправлять свои системные логи. Это особенно полезно в инфраструктурах с большим количеством серверов, а также может быть полезно для выполнения требований по защите и контролю доступа к информации. Храня журналы на отдельном сервере, можно централизованно управлять доступом к ним, контролировать срок их хранения и настраивать ротацию. Это может быть частью комплекса технических мер для выполнения требований GDPR и других политик информационной безопасности.
Для развертывания такого сервера можно использовать надежный SSD VPS или выделенный сервер с SSD — в зависимости от количества клиентов, объема логов и требований к дисковому пространству.
В этом руководстве мы настроим AlmaLinux в качестве центрального Rsyslog-сервера, а также покажем, как настроить клиентский сервер для отправки журналов на него.
В качестве примера воспользуемся следующей схемой:
192.168.10.10 — центральный Rsyslog-сервер
└── 192.168.10.41 — (Клиент 1)
На центральном сервере журналы удалённых машин будут храниться в каталоге:
/var/log/servers/<IP-адрес-клиента>/
Например:
/var/log/servers/192.168.10.41/
По умолчанию Rsyslog использует порт 514 для Syslog. В этом руководстве для простоты мы будем использовать UDP, а в конце также покажем, как перейти на TCP.
Что нам понадобится
Перед началом работы убедитесь, что у вас есть:
- два сервера или виртуальные машины под управлением AlmaLinux;
- root-доступ или пользователь с правами sudo к серверам/виртуальным машинам.
В примерах этой статьи будем использовать:
Rsyslog-сервер: 192.168.10.10
(Сервер, получающий журналы событий от других серверов)
Клиент: 192.168.10.41
(Отправляет свои журналы событий на центральный Rsyslog-сервер)
Замените эти адреса на те, которые используются в вашей сети.
Настраиваем центральный Rsyslog-сервер
Установка Rsyslog на центральном сервере
Сначала установим Rsyslog на центральный сервер с AlmaLinux.
Обновите информацию о пакетах:
sudo dnf update -y
Затем установите Rsyslog:
sudo dnf install -y rsyslog
После завершения установки запустите службу и добавьте её в автозапуск:
sudo systemctl enable --now rsyslog
Проверьте её состояние:
sudo systemctl is-active rsyslog
Если всё настроено правильно, вы увидите:
Настройка Rsyslog на главном сервере
Теперь настроим наш rsyslog-сервер на AlmaLinux для приёма журналов удалённых серверов.
Вместо редактирования основного файла /etc/rsyslog.conf рекомендуется создать отдельный конфигурационный файл в /etc/rsyslog.d/. Rsyslog автоматически обрабатывает .conf-файлы из этого каталога.
Создайте новый файл /etc/rsyslog.d/10-remote.conf
Добавьте в него:
# Enable UDP syslog reception
module(load="imudp")
# Listen for incoming syslog messages on UDP port 514
input(
type="imudp"
port="514"
)
# Store remote logs in a separate directory for each client
template(
name="RemoteLogs"
type="string"
string="/var/log/servers/%FROMHOST-IP%/%PROGRAMNAME%.log"
)
# Write all remote messages to the dynamic log file
*.* action(
type="omfile"
dynaFile="RemoteLogs"
createDirs="on"
dirCreateMode="0750"
fileCreateMode="0640"
)
Сохраните файл.
Объясним, как работают эти настройки
Строка:
module(load="imudp")
загружает модуль imudp, который позволяет Rsyslog принимать Syslog-сообщения через UDP.
Далее:
input(
type="imudp"
port="514"
)
заставляет Rsyslog прослушивать UDP-порт 514.
Шаблон:
string="/var/log/servers/%FROMHOST-IP%/%PROGRAMNAME%.log"
определяет, где будут храниться журналы.
Например, если у клиента IP-адрес:
192.168.10.41
а сообщение отправляет sshd, Rsyslog сохранит его здесь:
/var/log/servers/192.168.10.41/sshd.log
Это позволяет легко разделять журналы разных серверов и сервисов.
Настройка доступа к журналам
Создадим основной каталог для удаленных журналов и установим права доступа:
sudo mkdir -p /var/log/servers
sudo chmod 0750 /var/log/servers
Проверьте, используется ли на вашем сервере SELinux:
getenforce
Если в ответе вы получили enforcing или permissive, выполните шаги, приведенные ниже; в противном случае перейдите к следующему разделу «Проверка конфигурации Rsyslog».
sudo restorecon -Rv /var/log/servers
Проверить контекст можно с помощью:
ls -Zd /var/log/servers
Проверка конфигурации Rsyslog
Перед перезапуском Rsyslog на центральном сервере следует проверить конфигурацию на наличие синтаксических ошибок.
Выполните:
sudo rsyslogd -N1
Если конфигурация верна, в конце вы увидите сообщение примерно такого содержания:
Если возникла ошибка, не перезапускайте службу, а проверьте настройки, исправьте ошибки и только после этого перезапустите rsyslog.
Перезапускаем Rsyslog
Перезапустите службу rsyslog:
sudo systemctl restart rsyslog
Проверьте её состояние:
sudo systemctl is-active rsyslog
Также проверим, прослушивает ли Rsyslog UDP-порт 514:
sudo ss -lunp | grep ":514"
Ожидаемый результат будет примерно таким:
Ограничение клиентов, которым разрешено отправлять журналы
На многих серверах с AlmaLinux типичным сетевым инструментом защиты является firewalld. AlmaLinux также рекомендует использовать firewall-cmd для управления правилами брандмауэра.
sudo firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.41" port port="514" protocol="udp" accept"
Где 192.168.10.41 — IP-адрес сервера, с которого наш центральный rsyslog-сервер будет получать журналы.
Примените изменения:
sudo firewall-cmd --reload
Проверьте:
sudo firewall-cmd --zone=public --list-rich-rules
Это лучше, чем оставлять Syslog-порт открытым для всего Интернета.
Настройка клиентского сервера
Теперь настроим другой сервер AlmaLinux, который будет отправлять журналы на центральный rsyslog-сервер.
В нашем примере:
Клиент: 192.168.10.41
Rsyslog-сервер: 192.168.10.10
Порт: 514/UDP
На клиенте установим и запустим Rsyslog:
sudo dnf install -y rsyslog
sudo systemctl enable --now rsyslog
Проверим его статус:
sudo systemctl is-active rsyslog
Настройка пересылки журналов
Создадим отдельный конфигурационный файл /etc/rsyslog.d/90-remote.conf
Добавьте в него:
# Forward all logs to the central Rsyslog server
*.* action(
type="omfwd"
target="192.168.10.10"
port="514"
protocol="udp"
)
Замените 192.168.10.10 на IP-адрес вашего центрального сервера Rsyslog.
Модуль omfwd используется Rsyslog для пересылки сообщений по UDP или TCP. Он встроен, поэтому загружать его отдельно не требуется.
Настраиваем очередь в rsyslog на случай недоступности сервера
В производственной среде мы рекомендуем не ограничиваться простым:
*.* action(
type="omfwd"
target="192.168.10.10"
port="514"
protocol="udp"
)
Если центральный сервер временно недоступен, часть сообщений может быть утеряна.
Для этого можно настроить очередь Rsyslog:
*.* action(
type="omfwd"
target="192.168.10.10"
port="514"
protocol="udp"
queue.type="linkedlist"
queue.filename="remote_fwd"
queue.saveOnShutdown="on"
action.resumeRetryCount="-1"
)
Эта конфигурация позволяет Rsyslog временно хранить сообщения в очереди и повторять попытки отправки, если сервер назначения недоступен. Red Hat также рекомендует использовать action queue для защиты от потери сообщений в случае недоступности удалённого сервера.
Проверка конфигурации клиента
Проверим конфигурацию:
sudo rsyslogd -N1
Если ошибок нет, перезапустите Rsyslog:
sudo systemctl restart rsyslog
Проверьте, запустилась ли служба Rsyslog:
sudo systemctl is-active rsyslog
Ответ должен быть:
Тестирование удалённого ведения журналов
Теперь проверим, может ли клиент отправлять сообщения на удаленный (центральный) сервер.
На сервере-клиенте выполните:
logger "Test message from AlmaLinux client"
Эта команда создаст тестовое сообщение Syslog.
Вернитесь на центральный сервер Rsyslog.
Проверьте каталог:
sudo ls -la /var/log/servers
Вы должны увидеть каталог с IP-адресом клиента:
192.168.10.41
Проверьте его:
sudo ls -la /var/log/servers/192.168.10.41/
Среди файлов должен появиться файл, связанный с программой, которая создала сообщение.
Найти тестовое сообщение можно с помощью:
sudo grep -R "Test message from AlmaLinux client" /var/log/servers/
Или воспользоваться командой tail:
sudo tail -f /var/log/servers/192.168.10.41/*.log
Если всё работает правильно, вы увидите своё тестовое сообщение.
Использование TCP вместо UDP в Rsyslog
UDP прост и быстр, но он не гарантирует доставку сообщений.
Для продакшен-систем, где потеря журналов недопустима, лучше использовать TCP. В документации RHEL по Rsyslog описаны imtcp на сервере и omfwd с protocol=»tcp» на клиенте.
Настройка главного rsyslog-сервера
Откройте файл для редактирования /etc/rsyslog.d/10-remote.conf и замените в нём все записи «imudp» на «imtcp» или добавьте в него:
# Enable TCP syslog reception
module(load="imtcp")
input(
type="imtcp"
port="514"
)
template(
name="RemoteLogsTCP"
type="string"
string="/var/log/servers/%FROMHOST-IP%/%PROGRAMNAME%.log"
)
*.* action(
type="omfile"
dynaFile="RemoteLogsTCP"
createDirs="on"
dirCreateMode="0750"
fileCreateMode="0640"
)
Откройте TCP-порт в firewalld:
sudo firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="192.168.10.41" port port="514" protocol="tcp" accept"
sudo firewall-cmd --reload
Где 192.168.10.41 — IP-адрес сервера, с которого наш центральный rsyslog-сервер будет получать журналы.
Проверьте конфигурацию:
sudo rsyslogd -N1
После этого перезапустите службу rsyslog:
sudo systemctl restart rsyslog
Проверьте порт:
sudo ss -ltnp | grep ":514"
Настройка Rsyslog на клиенте для TCP
На клиенте откройте файл /etc/rsyslog.d/90-remote.conf для редактирования и измените в нём protocol=»udp» на protocol=»tcp» или вставьте в него следующие настройки, заменив предыдущие:
*.* action(
type="omfwd"
target="192.168.10.10"
port="514"
protocol="tcp"
queue.type="linkedlist"
queue.filename="remote_fwd"
queue.saveOnShutdown="on"
action.resumeRetryCount="-1"
)
Проверьте файл конфигурации rsyslog:
sudo rsyslogd -N1
Перезапустите:
sudo systemctl restart rsyslog
Теперь создайте тестовое сообщение:
logger "Test TCP message from AlmaLinux client"
На сервере проверьте:
sudo grep -R "Test TCP message from AlmaLinux client" /var/log/servers/
Проверка работы Rsyslog
Если журналы не поступают на сервер, проверьте систему в следующем порядке.
1. Проверьте Rsyslog
На центральном Rsyslog-сервере:
sudo systemctl is-active rsyslog
На клиенте:
sudo systemctl is-active rsyslog
2. Проверьте конфигурацию
На обоих серверах:
sudo rsyslogd -N1
3. Проверьте порт
На сервере:
sudo ss -lunp | grep ":514"
Для TCP:
sudo ss -ltnp | grep ':514'
4. Проверьте firewalld
sudo firewall-cmd --list-all
5. Проверьте SELinux
getenforce
Если используется Enforcing, проверьте контекст каталога:
ls -Zd /var/log/servers
6. Проверьте журналы Rsyslog
sudo journalctl -u rsyslog -n 100 --no-pager
Для просмотра журнала в режиме реального времени:
sudo journalctl -u rsyslog -f
7. Проверьте сетевое соединение
С клиента можно проверить доступность порта TCP:
nc -vz 192.168.10.10 514
Для UDP такая проверка менее надёжна, поэтому для диагностики можно воспользоваться tcpdump.
На Rsyslog-сервере:
sudo tcpdump -ni any udp port 514
После этого на клиенте:
logger "tcpdump test message"
Если пакеты видны в tcpdump, сетевое соединение работает, и проблему нужно искать в конфигурации Rsyslog или SELinux.
Ротация удалённых журналов на главном rsyslog-сервере
Если Rsyslog-сервер собирает логи с большого количества машин, каталог /var/log/servers может быстро разрастаться.
Поэтому в производственной среде стоит настроить logrotate.
Создайте файл /etc/logrotate.d/remote-rsyslog
Добавьте в него:
/var/log/servers/*/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 root root
}
Эта конфигурация:
- будет ежедневно ротировать журналы;
- будет хранить 14 старых копий;
- будет сжимать старые журналы;
- не будет выдавать ошибку, если файл отсутствует;
- не будет создавать пустые журналы.
Перед использованием в продакшен-среде проверьте вашу конкретную схему каталогов и требования к хранению логов.
Централизованное ведение журналов с помощью Rsyslogd настроено: Итог
В данной инструкции мы настроили централизованное ведение журналов в AlmaLinux с помощью Rsyslog: подготовили сервер для приёма логов, настроили клиентский сервер для их пересылки, проверили работу UDP/TCP-соединения, добавили очередь для более надёжной доставки и настроили ротацию журналов.
Такая схема позволяет хранить логи нескольких серверов в одном месте, упрощает их поиск и анализ, а также помогает быстрее находить проблемы в инфраструктуре.
Хотя в инструкции в качестве примера приведена конфигурация из двух серверов — центрального Rsyslog-сервера и одного клиента, — этот подход можно использовать для любого количества клиентских серверов. Достаточно настроить каждый из них на пересылку журналов на центральный Rsyslog-сервер.
Для стабильной работы централизованного ведения журналов важно иметь надёжную серверную инфраструктуру. Если вам нужен сервер для централизованного ведения журналов, мониторинга, резервного копирования или других задач, вы можете рассмотреть быстрые SSD VPS или выделенный сервер с SSD соответствующей конфигурации на нашем сайте.
