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
相关产品推荐
相关产品推荐

