systemd/systemd-netlogd
GitHub: systemd/systemd-netlogd
一个轻量级的 systemd journal 网络日志转发守护进程,通过标准 syslog 协议将日志可靠地发送到远程主机。
Stars: 92 | Forks: 32
# systemd-netlogd
[](https://github.com/systemd/systemd-netlogd/actions)
[](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, 命名空间, 子域名变形, 守护进程, 安全传输, 安全测试工具, 客户端加密, 无缓冲, 日志管理, 日志转发, 日志过滤, 构建工具, 系统日志, 网络通信, 轻量级工具, 运维工具, 防御工具