You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solaris 11.4中/dev/log绑定失败及审计日志流转机制咨询

Solaris系统audit插件与/dev/log套接字问题解析

问题描述

我想了解Solaris系统中audit_binfile、audit_syslog等插件如何捕获并修改内核环形缓冲区的日志。我了解到日志消息通过/dev/log套接字传输,因此编写了如下程序尝试访问该套接字,但运行时即使设置了SO_REUSEADDR仍报错“bind: Address already in use”。请指出我的错误所在,或判断我对/dev/log的理解是否有误。

测试代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <syslog.h>

#define SOCK_PATH "/dev/log"

int main(int argc, char *argv[])
{
    struct sockaddr_un addr;
    char buf[4096];
    int fd, n, yes = 1;

    // Create socket
    if ((fd = socket(AF_UNIX, SOCK_DGRAM, 0)) == -1) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    // Set SO_REUSEADDR option
    if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1) {
        perror("setsockopt");
        exit(EXIT_FAILURE);
    }

    // Bind to /dev/log socket
    memset(&addr, 0, sizeof(addr));
    addr.sun_family = AF_UNIX;
    strncpy(addr.sun_path, SOCK_PATH, sizeof(addr.sun_path)-1);
    if (bind(fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) {
        perror("bind");
        exit(EXIT_FAILURE);
    }

    // Read from socket and print log messages
    while ((n = recv(fd, buf, sizeof(buf), 0)) > 0) {
        buf[n] = '\0';
        printf("%s", buf);
    }

    // Close socket
    close(fd);

    return 0;
}

问题分析与解决

1. 对/dev/log的核心误解

在Solaris里,/dev/log是系统日志服务(syslogd或rsyslogd)独占绑定的UNIX数据报套接字。内核和应用程序的日志是主动发送到这个套接字,而非让第三方程序绑定它来接收。你的程序试图绑定/dev/log,但此时系统日志服务已经在占用这个套接字,必然会触发“Address already in use”错误。

2. SO_REUSEADDR的作用边界

SO_REUSEADDR在UNIX套接字中的功能和TCP场景不同:它仅允许套接字处于TIME_WAIT状态时重新绑定,无法让两个活跃套接字共享同一个路径。既然系统日志服务正活跃使用/dev/log,这个选项对你的问题完全无效。

3. 正确的日志捕获方式

如果要获取/dev/log的日志,不需要绑定这个套接字,可行方案有两种:

  • 转发式捕获:修改系统日志服务配置,将日志转发到你程序监听的自定义UNIX套接字或TCP端口,你的程序绑定自己的套接字接收即可。
  • 替换式捕获:停止系统日志服务后,再运行你的程序绑定/dev/log,但这会导致原有系统日志功能失效,仅适合测试场景。

而针对审计日志,Solaris有更原生的方案:使用auditpipe设备。audit_binfile、audit_syslog这类插件本质是通过auditpipe读取内核环形缓冲区的审计事件,再做后续处理。你可以直接通过命令行测试:

# 启用auditpipe插件
auditconfig -setplugin auditpipe active
# 读取审计日志
praudit /dev/auditpipe

4. audit插件的工作流程

  • 内核将审计事件写入专属的内核环形缓冲区
  • auditd守护进程通过auditpipe设备读取缓冲区内容
  • auditd加载audit_binfile、audit_syslog等插件,将事件分发给它们
  • audit_binfile把事件写入指定审计文件;audit_syslog将事件格式化为syslog消息,发送到/dev/log交给系统日志服务处理

内容的提问来源于stack exchange,提问作者phantom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 10:20:18