systemd/systemd-netlogd

GitHub: systemd/systemd-netlogd

一个轻量级的 systemd journal 网络日志转发守护进程,通过标准 syslog 协议将日志可靠地发送到远程主机。

Stars: 92 | Forks: 32

# systemd-netlogd [![构建状态](https://static.pigsec.cn/wp-content/uploads/repos/2026/04/a19c1fa242131655.svg)](https://github.com/systemd/systemd-netlogd/actions) [![许可证:LGPL v2.1+](https://img.shields.io/badge/License-LGPL%20v2.1+-blue.svg)](https://www.gnu.org/licenses/lgpl-2.1) 使用 Syslog 协议(RFC 5424 和 RFC 3164)通过网络将来自 systemd journal 的消息转发到远程主机。支持通过 UDP、TCP、TLS(RFC 5425)和 DTLS(RFC 6012)传输的单播和组播目标。 systemd-netlogd 按顺序读取 journal 并转发到网络——无本地缓冲或额外的磁盘使用。它(使用 `sd-network`)在网络连通时开始发送日志,在网络断开时停止发送,并以非特权的 `systemd-journal-netlog` 用户身份运行。 ## 功能特性 - **网络感知** — 通过 `sd-network` 自动检测网络状态变化 - **零缓冲** — 顺序读取 journal,无本地缓存 - **安全传输** — UDP、TCP、TLS(RFC 5425)、DTLS(RFC 6012) - **标准格式** — RFC 5424(推荐)、RFC 3164(传统 BSD syslog) - **智能过滤** — 排除敏感设施(auth/authpriv)和日志级别 - **Namespace 支持** — 从特定的 journal namespace 转发或聚合所有 namespace - **结构化数据** — 将元数据附加到消息或从 journal 字段中提取 - **安全加固** — 以非特权用户身份运行,并带有 systemd 安全沙箱 - **容错性** — 带有游标持久化的自动重连,确保无消息丢失 - **轻量级** — 内存占用极小,除 systemd 和 OpenSSL 外无其他运行时依赖 ## 快速开始 ``` # Configure sudo tee /etc/systemd/netlogd.conf <= 230(推荐 v255+)、meson(>= 0.51)、gperf、libcap、OpenSSL ``` # Install dependencies (Debian/Ubuntu) sudo apt install build-essential meson gperf libcap-dev libsystemd-dev libssl-dev libcmocka-dev # Install dependencies (Fedora/RHEL) sudo dnf install gcc meson gperf libcap-devel systemd-devel openssl-devel libcmocka-devel # Install dependencies (Arch Linux) sudo pacman -S base-devel meson gperf libcap openssl cmocka # Build git clone https://github.com/systemd/systemd-netlogd.git cd systemd-netlogd meson setup build meson compile -C build # Run tests meson test -C build # Install sudo meson install -C build # Create system user and start sudo useradd -r -d / -s /usr/sbin/nologin -g systemd-journal systemd-journal-netlog sudo systemctl daemon-reload sudo systemctl enable --now systemd-netlogd ``` ### 打包 该仓库包含针对多个发行版的打包文件: - **RPM** — `systemd-netlogd.spec`(Fedora、RHEL、Rocky Linux) - **DEB** — `debian/` 目录(Ubuntu、Debian) - **Arch Linux** — `PKGBUILD` ## 配置 配置文件:`/etc/systemd/netlogd.conf` Drop-in 覆盖配置:`/etc/systemd/netlogd.conf.d/*.conf` 修改后重载:`sudo systemctl reload systemd-netlogd` ### 选项 | 选项 | 描述 | 默认值 | |--------|-------------|---------| | `Address=` | 目标地址(IP:端口或组播组) | **必需** | | `Protocol=` | `udp`、`tcp`、`tls`、`dtls` | `udp` | | `LogFormat=` | `rfc5424`、`rfc5425`(TLS)、`rfc3164`(传统) | `rfc5424` | | `Directory=` | 自定义 journal 目录路径 | 系统默认 | | `Namespace=` | Journal namespace:`*`(所有)、`+id`(id+默认)、`id` | 默认 | | `ConnectionRetrySec=` | 失败后的重连延迟 | `30s` | | `TLSCertificateAuthMode=` | 证书验证:`deny`、`warn`、`allow`、`no` | `deny` | | `TLSServerCertificate=` | CA/服务器证书 PEM 路径 | 系统 CA 证书库 | | `KeepAlive=` | 启用 TCP keepalive 探测 | `false` | | `KeepAliveTimeSec=` | Keepalive 空闲超时 | `7200` | | `KeepAliveIntervalSec=` | Keepalive 探测间隔 | `75` | | `KeepAliveProbes=` | Keepalive 探测次数 | `9` | | `SendBuffer=` | Socket 发送缓冲区大小(字节、K、M、G) | 系统默认 | | `NoDelay=` | 禁用 Nagle 算法(降低延迟) | `false` | | `StructuredData=` | 静态结构化数据 `[SD-ID@PEN ...]` | 无 | | `UseSysLogStructuredData=` | 从 journal 提取 `SYSLOG_STRUCTURED_DATA` | `false` | | `UseSysLogMsgId=` | 从 journal 提取 `SYSLOG_MSGID` | `false` | | `ExcludeSyslogFacility=` | 要排除的空格分隔的 facility 列表 | 无 | | `ExcludeSyslogLevel=` | 要排除的空格分隔的 level 列表 | 无 | **Facility:** `kern`、`user`、`mail`、`daemon`、`auth`、`syslog`、`lpr`、`news`、`uucp`、`cron`、`authpriv`、`ftp`、`ntp`、`security`、`console`、`solaris-cron`、`local0`-`local7` **Level:** `emerg`、`alert`、`crit`、`err`、`warning`、`notice`、`info`、`debug` ### 示例 **基本 UDP:** ``` [Network] Address=192.168.1.100:514 ``` **生产环境 TLS(推荐):** ``` [Network] Address=logs.example.com:6514 Protocol=tls LogFormat=rfc5425 TLSCertificateAuthMode=deny TLSServerCertificate=/etc/pki/tls/certs/ca-bundle.crt KeepAlive=yes NoDelay=yes ExcludeSyslogFacility=auth authpriv ``` **DTLS(加密 UDP):** ``` [Network] Address=192.168.1.100:4433 Protocol=dtls TLSCertificateAuthMode=warn ``` **带过滤的 TCP:** ``` [Network] Address=192.168.1.100:514 Protocol=tcp ExcludeSyslogFacility=auth authpriv ExcludeSyslogLevel=debug ``` **云服务:** ``` [Network] Address=logs7.papertrailapp.com:12345 Protocol=tls LogFormat=rfc5424 TLSCertificateAuthMode=deny KeepAlive=yes ``` **云服务:** ``` [Network] Address=logs-01.loggly.com:6514 Protocol=tls LogFormat=rfc5424 StructuredData=[YOUR-CUSTOMER-TOKEN@41058] TLSCertificateAuthMode=deny ``` **组播:** ``` [Network] Address=239.0.0.1:6000 ``` **带结构化数据和消息 ID (Message ID):** ``` [Network] Address=192.168.1.100:514 Protocol=tcp LogFormat=rfc5424 StructuredData=[app@12345 env="production" region="us-east"] UseSysLogStructuredData=yes UseSysLogMsgId=yes ``` **所有 journal namespace:** ``` [Network] Address=192.168.1.100:514 Protocol=tcp Namespace=* ``` 查看 [`examples/`](examples/) 目录以获取更多可用于生产环境的配置。 ## 安全 systemd-netlogd 通过 systemd 安全加固以最低权限运行: - 以专用的 `systemd-journal-netlog` 用户(非 root)运行 - `ProtectSystem=strict`、`ProtectHome=yes`、`PrivateTmp=yes` - `ProtectKernelTunables=yes`、`ProtectKernelModules=yes`、`ProtectKernelLogs=yes` - `MemoryDenyWriteExecute=yes`、`LockPersonality=yes` - `SystemCallArchitectures=native`、`PrivateDevices=yes` 审计安全态势: ``` sudo systemd-analyze security systemd-netlogd.service ``` 最佳实践: - 在不受信任的网络中转发时使用 `Protocol=tls` - 在生产环境中,配合有效的 CA 证书设置 `TLSCertificateAuthMode=deny` - 排除敏感日志:`ExcludeSyslogFacility=auth authpriv` 查看 [SECURITY.md](SECURITY.md) 以获取完整的安全策略和漏洞报告说明。 ## 信号 | 信号 | 动作 | |--------|--------| | `SIGTERM`、`SIGINT` | 优雅关闭,保存游标状态 | | `SIGUSR1` | 切换调试日志级别 | | `SIGUSR2` | 保留 | ``` # Enable debug logging temporarily sudo kill -SIGUSR1 $(pidof systemd-netlogd) journalctl -u systemd-netlogd -f ``` ## 故障排除 ``` # Check service status sudo systemctl status systemd-netlogd journalctl -u systemd-netlogd -n 50 # Test network connectivity nc -vz remote-server 514 # TCP nc -u -vz remote-server 514 # UDP # Generate test log logger -p user.info "Test from systemd-netlogd" # Enable persistent debug logging sudo systemctl edit systemd-netlogd # Add: Environment=SYSTEMD_LOG_LEVEL=debug # Test TLS connectivity openssl s_client -connect server:6514 -CAfile /path/to/ca.pem # Reset state (re-forward from current journal position) sudo systemctl stop systemd-netlogd sudo rm /var/lib/systemd-netlogd/state sudo systemctl start systemd-netlogd ``` ## 状态持久化 该守护进程在每次成功转发后,会将其 journal 游标保存到 `/var/lib/systemd-netlogd/state`。这确保了在重启或网络中断期间不会丢失任何消息。在启动时,它会从上次保存的位置继续。 ## 文档 | 文档 | 描述 | |----------|-------------| | [手册页](doc/index.rst) | 完整参考(`man systemd-netlogd`) | | [常见问题](FAQ.md) | 常见问题解答 | | [ARCHITECTURE.md](ARCHITECTURE.md) | 内部设计与数据流 | | [TESTING.md](TESTING.md) | 测试套件与验证指南 | | [CONTRIBUTING.md](CONTRIBUTING.md) | 开发环境设置与贡献指南 | | [SECURITY.md](SECURITY.md) | 安全策略和漏洞报告 | | [CHANGELOG.md](CHANGELOG.md) | 发布历史 | | [examples/](examples/) | 可用于生产环境的配置示例 | ## 许可证 LGPL-2.1-or-later —— 与 systemd 采用相同许可证。详见 [LICENSE.LGPL2.1](LICENSE.LGPL2.1)。 ## 作者 Susant Sahani
标签:DTLS, OISF, RFC 3164, RFC 5424, Syslog, systemd, TCP, TLS, UDP, 命名空间, 子域名变形, 守护进程, 安全传输, 安全测试工具, 客户端加密, 无缓冲, 日志管理, 日志转发, 日志过滤, 构建工具, 系统日志, 网络通信, 轻量级工具, 运维工具, 防御工具