mod_sflow是一个基于 Apache 的轻量、持续、实时的 sFlow 模块。
什么是 sFlow
sFlow 是一种网络流量分析的协议。通过流量分析,可以实现更有效地监控网络的状况。例如,最近爆出的OpenSSL心脏出血漏洞,由于是通过 OpenSSL 漏洞直接读取内存信息,而不是直接入侵系统,因此服务器日志上不会有相关的记录,使用常规手段难以难以追查。但是,由于来回通信包的长度等特征非常明显,因此利用sFlow之类的技术分析流量特征,就可以追溯攻击流量和攻击历史。特别是,这次的 OpenSSL 漏洞可以无限制反复利用,这既方便了攻击者,不用依靠精妙的技巧来操控读取地址,反复读取即可获得大量内存片段,另一方面也使攻击行为更容易被侦测到。
目前已有大量设备支持sFlow协议。sFlow协议的以下特性使其非常适合监测大流量传输的网络:
- 使用内置在硬件中的专用芯片,减轻路由器或交换机的CPU、内存负担。
- 通过分布在网络不同位置的 sFlow agent 将数据传送给中央 sFlow 采集器,由中央采集器进行分析。
- 使用采样分析技术。大部分的包被丢弃,只留下样本被传送给采集器。sFlow 协议也支持 1:1 的采样,也就是收集每个包的信息。只不过具体的芯片实现的最大采样率有所不同。
mod_sflow 就是一个开源的 sFlow 中央采集器,可以实时分析收到的 sFlow 数据。
安装
编译安装此模块于 Apache 的模块目录,同时在 apache httpd.conf
目录中添加此项:
rm -f `apxs -q LIBEXECDIR`/mod_sflow.so
apxs -c -i -a mod_sflow.c sflow_api.c
重启 Apache 服务:
apachectl restart
注意,rm -f
那一步很重要。这是 Apache #47951 问题的临时解决方案。
配置
mod_sflow 会读取 /etc/hsflowd.auto
的信息。这个文件会在你运行hsflowd
服务时自动生成。
你也可以在httpd.conf
或 ../httpd/conf.d/sflow.conf
中配置:
<IfModule mod_sflow.c>
<Location /sflow>
SetHandler sflow
</Location>
</IfModule>
重启 Apache 后,你可以访问 http://<server>/sflow/
来查看状态:
counter method_option_count 0
counter method_get_count 34
counter method_head_count 0
counter method_post_count 0
counter method_put_count 0
counter method_delete_count 0
counter method_trace_count 0
counter method_connect_count 0
counter method_other_count 0
counter status_1XX_count 0
counter status_2XX_count 17
counter status_3XX_count 0
counter status_4XX_count 17
counter status_5XX_count 0
counter status_other_count 0
string hostname 10.0.0.119
gauge sampling_n 400
输出
mod_sflow 的会在 UDP 端口输出内容。你可以使用支持 sFlow 协议的工具查看,例如,免费软件 sflowtool。
sflowtool的会输出类似如下的内容:
startDatagram =================================
datagramSourceIP 10.0.0.150
datagramSize 192
unixSecondsUTC 1294168545
datagramVersion 5
agentSubId 32576
agent 10.0.0.150
packetSequenceNo 7
sysUpTime 25000
samplesInPacket 1
startSample ----------------------
sampleType_tag 0:1
sampleType FLOWSAMPLE
sampleSequenceNo 1
sourceId 3:65537
meanSkipCount 400
samplePool 124
dropEvents 0
inputPort 0
outputPort 1073741823
flowBlock_tag 0:2100
extendedType socket4
socket4_ip_protocol 6
socket4_local_ip 10.0.0.150
socket4_remote_ip 10.0.0.70
socket4_local_port 80
socket4_remote_port 63023
flowBlock_tag 0:2201
flowSampleType http
http_method 2
http_protocol 1001
http_uri /membase.php
http_host 10.0.0.150
http_useragent Java/1.6.0_22
http_bytes 3487
http_duration_uS 24278
http_status 200
endSample ----------------------
endDatagram =================================
startDatagram =================================
datagramSourceIP 10.0.0.150
datagramSize 116
unixSecondsUTC 1294168501
datagramVersion 5
agentSubId 32576
agent 10.0.0.150
packetSequenceNo 3
sysUpTime 42000
samplesInPacket 1
startSample ----------------------
sampleType_tag 0:2
sampleType COUNTERSSAMPLE
sampleSequenceNo 3
sourceId 3:65537
counterBlock_tag 0:2201
http_method_option_count 0
http_method_get_count 113
http_method_head_count 0
http_method_post_count 0
http_method_put_count 0
http_method_delete_count 0
http_method_trace_count 0
http_methd_connect_count 0
http_method_other_count 0
http_status_1XX_count 0
http_status_2XX_count 112
http_status_3XX_count 0
http_status_4XX_count 1
http_status_5XX_count 0
http_status_other_count 0
endSample ----------------------
endDatagram =================================
编撰 SegmentFault
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。