使用Unix Stream Socket连接Suricata与Telegraf时遇客户端消息过长问题
问题:Suricata与Telegraf通过Unix Stream套接字连接失败
环境信息
Host: Ubuntu 20.04 Docker: SURICATA_VERSION=6.0.6 Docker: INFLUXDB_VERSION=2.1.1 Docker: TELEGRAF_VERSION=1.21
Suricata配置
- eve-log: enabled: yes filetype: unix_stream filename: /var/run/suricata/suricata-command.socket types: - stats: totals: no # 合并所有线程的统计数据 threads: yes # 单线程统计数据
Telegraf配置
# Suricata统计和告警日志插件 [[inputs.suricata]] ## Suricata统计和告警日志的数据接收器 # 此处填写用于监听的Unix套接字文件名 source = "/tmp/suricata-command.socket" # 扁平化字段键的分隔符,例如"detect"的子项"alert" # 当分隔符为"_"时会转换为"detect_alert" delimiter = "_" ## 检测告警日志开关 # alerts = false
错误日志
25/7/2022 -- 09:56:27 - <Warning> - [ERRCODE: SC_ERR_SOCKET(200)] - Write error on Unix socket "/var/run/suricata/suricata-command.socket": Broken pipe; reconnecting... 25/7/2022 -- 09:56:27 - <Notice> - Reconnected socket "/var/run/suricata/suricata-command.socket" 25/7/2022 -- 09:56:27 - <Info> - Command server: client message is too long, disconnect him.
问题分析与解决步骤
1. 统一套接字路径
Suricata配置的套接字路径为/var/run/suricata/suricata-command.socket,但Telegraf配置的是/tmp/suricata-command.socket,路径不一致直接导致连接失败。需将两者配置为同一路径,例如统一设置为/var/run/suricata/suricata-command.socket。
2. 容器间共享套接字目录
由于Suricata和Telegraf分属不同Docker容器,需将套接字所在目录作为共享卷挂载到两个容器:
- 给Suricata容器挂载主机目录或Docker卷到
/var/run/suricata - 给Telegraf容器挂载同一目录或卷到
/var/run/suricata
确保两个容器能访问到同一个套接字文件。
3. 调整权限设置
套接字文件需要允许Telegraf容器读取,可通过以下方式调整:
- 启动容器时指定相同的用户ID(UID)和组ID(GID)
- 在挂载卷时设置权限为
777(仅测试环境使用,生产环境需配置更严格的权限)
4. 解决"消息过长"问题
错误日志中的client message is too long是因为Suricata输出的单线程统计数据量过大,可调整Suricata配置:
- 将
threads: yes改为threads: no,仅输出合并后的统计数据 - 若Telegraf版本支持,可调整Suricata插件的缓冲区大小参数
内容的提问来源于stack exchange,提问作者sfl0r3nz05
相关产品推荐
相关产品推荐

