Netflow

Netflow数据包主要有3个版本:

- ``Netflow V5``
- ``Netflow V7``
- ``Netflow V9 / V10 (IPfix)``

尽管前两个版本非常简单,但是构建或剖析Netflow v9 / v10并不容易.

Netflow V1

netflow = NetflowHeader()/NetflowHeaderV1()/NetflowRecordV1()
pkt = Ether()/IP()/UDP()/netflow

Netflow V5

netflow = NetflowHeader()/NetflowHeaderV5(count=1)/NetflowRecordV5(dst="192.168.0.1")
pkt = Ether()/IP()/UDP()/netflow

NetflowV9 / IPfix

Netflow v9和IPfix使用基于模板的系统. 这意味着通过网络发送的记录需要事先在Flowset数据包中发送"模板".

需要使用此模板来了解记录的格式,因此在构建或解剖记录时需要提供此模板.

幸运的是,Scapy知道如何检测模板,并将提供剖析方法来解决这一问题.

Note

以下示例适用于Netflow V9. 使用IPfix时,请使用完全相同的格式,但用V10对应的类名替换它们(如果存在的话!Scapy在两者之间共享一些类). 看看netflow

  • Build

header = Ether()/IP()/UDP()
netflow_header = NetflowHeader()/NetflowHeaderV9()

# Let's first build the template. Those need an ID > 255
flowset = NetflowFlowsetV9(
    templates=[NetflowTemplateV9(
        template_fields=[
            NetflowTemplateFieldV9(fieldType=1, fieldLength=1),  # IN_BYTES
            NetflowTemplateFieldV9(fieldType=2, fieldLength=4),  # IN_PKTS
            NetflowTemplateFieldV9(fieldType=4),  # PROTOCOL
            NetflowTemplateFieldV9(fieldType=8),  # IPV4_SRC_ADDR
            NetflowTemplateFieldV9(fieldType=12),  # IPV4_DST_ADDR
        ],
        templateID=256,
        fieldCount=5)
    ],
    flowSetID=0
)
# Let's generate the record class. This will be a Packet class
# In case you provided several templates in ghe flowset, you will need
# to pass the template ID as second parameter
recordClass = GetNetflowRecordV9(flowset)
# Now lets build the data records
dataFS = NetflowDataflowsetV9(
    templateID=256,
    records=[ # Some random data.
        recordClass(
            IN_BYTES=b"\x12",
            IN_PKTS=b"\0\0\0\0",
            PROTOCOL=6,
            IPV4_SRC_ADDR="192.168.0.10",
            IPV4_DST_ADDR="192.168.0.11"
        ),
        recordClass(
            IN_BYTES=b"\x0c",
            IN_PKTS=b"\1\1\1\1",
            PROTOCOL=3,
            IPV4_SRC_ADDR="172.0.0.10",
            IPV4_DST_ADDR="172.0.0.11"
        )
    ],
)
pkt = header / netflow_header / flowset / dataFS
  • Dissection

Scapy提供了两种解析NetflowV9 / IPFix的方法:

对于前面的示例:

pkt = Ether(raw(pkt))  # will loose the defragmentation
pkt = netflowv9_defragment(pkt)[0]