基于syslog-ng的消息内IP伪造及中继源IP篡改方案咨询
在syslog-ng环境下实现日志源IP伪造的方案
针对你描述的「中央日志服务器接收多主机日志→转发至中继服务器→中继伪造原主机IP转发」的架构,我整理了一套可行的实现思路,分步骤拆解如下:
一、中央日志服务器:传递原主机IP信息
首先要确保中央服务器在向中继转发日志时,把每一条日志的原始发送主机IP完整传递下去——因为中继收到的日志默认源IP是中央服务器的,必须把原IP嵌入到日志内容或结构化字段中,方便中继提取。
推荐配置方案(用结构化数据SDATA传递)
在中央服务器的syslog-ng配置中,使用syslog-protocol转发,并将原IP写入SDATA(syslog标准结构化数据字段):
# 中央服务器的destination配置,指向中继服务器 destination d_relay { syslog("你的中继服务器IP" port(601) syslog-protocol( # 将原日志的源IP写入SDATA字段,键名为original_source_ip sdata("original_source_ip" "${SOURCEIP}") ) ); }; # 关联source和destination log { source(s_all_hosts); # 这里是你接收多主机日志的source配置 destination(d_relay); };
这样中继服务器收到的日志会携带原始主机IP的结构化信息,后续提取更可靠。
二、中继服务器:提取原IP并伪造源转发
中继服务器需要完成两个核心动作:解析出原主机IP,然后以该IP作为源IP向目标主机发送日志。
1. 配置日志接收与原IP解析
首先配置source接收中央服务器的日志,并解析SDATA字段获取原IP:
# 中继服务器的source配置,接收中央服务器的syslog-protocol日志 source s_central_logs { syslog(port(601)); }; # 解析SDATA中的原IP字段 parser p_extract_original_ip { sdata-parser(); # 自动解析syslog的SDATA字段 };
2. 配置伪造源IP的转发规则
在destination中使用source-ip()选项指定提取到的原IP作为发送源:
# 中继服务器的destination配置,指向目标主机 destination d_target_hosts { syslog("目标主机IP/网段" port(514) # 用SDATA中提取的原IP作为发送源IP source-ip("${SDATA.original_source_ip}") ); }; # 关联source、parser和destination log { source(s_central_logs); parser(p_extract_original_ip); destination(d_target_hosts); };
3. 赋予syslog-ng修改源IP的权限
伪造源IP需要系统级权限,所以要确保syslog-ng进程拥有CAP_NET_RAW和CAP_NET_ADMIN能力。如果用systemd管理syslog-ng,修改其服务文件(比如/etc/systemd/system/syslog-ng.service):
[Service] ... CapabilityBoundingSet=CAP_NET_RAW CAP_NET_ADMIN AmbientCapabilities=CAP_NET_RAW CAP_NET_ADMIN ...
修改后重启服务:systemctl daemon-reload && systemctl restart syslog-ng
三、注意事项
- syslog-ng版本要求:
source-ip()选项从syslog-ng 3.10版本开始支持,请确保中继服务器的syslog-ng版本不低于此。 - 网络环境限制:要确保中继服务器的防火墙/路由允许伪造源IP的数据包出站,且目标主机不会因为源IP不在可信网段而丢弃日志。
- 回包问题:如果目标主机需要向原主机回包,伪造IP会导致回包无法正常到达(因为中继不是原主机),但纯日志转发场景一般不需要考虑这个。
内容的提问来源于stack exchange,提问作者Mr.Saad
相关产品推荐
相关产品推荐

