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   =================================

mod_sflow项目主页


编撰 SegmentFault


weakish
24.6k 声望844 粉丝

a vigorously lazy deadbeat with matured immaturity