The sflow/sflowtool Docker image provides a simple way to run sflowtool. Run the following command to print the contents of sFlow packets:
$ docker run -p 6343:6343/udp sflow/sflowtool startDatagram ================================= datagramSourceIP 10.0.0.111 datagramSize 144 unixSecondsUTC 1321922602 datagramVersion 5 agentSubId 0 agent 10.0.0.20 packetSequenceNo 3535127 sysUpTime 270660704 samplesInPacket 1 startSample ---------------------- sampleType_tag 0:2 sampleType COUNTERSSAMPLE sampleSequenceNo 228282 sourceId 0:14 counterBlock_tag 0:1 ifIndex 14 networkType 6 ifSpeed 100000000 ifDirection 0 ifStatus 3 ifInOctets 4839078 ifInUcastPkts 15205 ifInMulticastPkts 0 ifInBroadcastPkts 4294967295 ifInDiscards 0 ifInErrors 0 ifInUnknownProtos 4294967295 ifOutOctets 149581962744 ifOutUcastPkts 158884229 ifOutMulticastPkts 4294967295 ifOutBroadcastPkts 4294967295 ifOutDiscards 101 ifOutErrors 0 ifPromiscuousMode 0 endSample ---------------------- endDatagram =================================The -g option flattens the output so that it is more easily filtered using grep:
$ docker run -p 6343:6343/udp sflow/sflowtool -g | grep ifInOctets 2019-09-03T22:37:21+0000 10.0.0.231 0 3203000 0:6 0:2 0:1 ifInOctets 0 2019-09-03T22:37:23+0000 10.0.0.232 0 7242462 0:5 0:2 0:1 ifInOctets 53791415069 2019-09-03T22:37:23+0000 10.0.0.253 0 8178007 0:7 0:2 0:1 ifInOctets 31663763747 2019-09-03T22:37:23+0000 10.0.0.253 0 8178007 0:3 0:2 0:1 ifInOctets 1333603780050 2019-09-03T22:37:26+0000 10.0.0.253 0 8178008 0:1 0:2 0:1 ifInOctets 9116481296The -L option prints out CSV records with the selected fields:
$ docker run -p 6343:6343/udp sflow/sflowtool -L agent,ifIndex,ifInOctets 10.0.0.253,23,432680126074 10.0.0.30,2,54056144719 10.0.0.253,21,3860664000830 10.0.0.253,3,1345269893416 10.0.0.253,2,1910370790761The -J option prints out the decoded sFlow datagrams as JSON (with a blank line between each datagram):
$ docker run -p 6343:6343/udp sflow/sflowtool -J { "datagramSourceIP":"172.17.0.1", "datagramSize":"1388", "unixSecondsUTC":"1567707952", "localtime":"2019-09-05T18:25:52+0000", "datagramVersion":"5", "agentSubId":"0", "agent":"10.0.0.253", "packetSequenceNo":"8254753", "sysUpTime":"165436226", "samplesInPacket":"8", "samples":[{ "sampleType_tag":"0:1", "sampleType":"FLOWSAMPLE", "sampleSequenceNo":"2594544", "sourceId":"0:3", "meanSkipCount":"500", "samplePool":"1622164761", "dropEvents":"584479", "inputPort":"21", "outputPort":"3", "elements":[{ "flowBlock_tag":"0:1", "flowSampleType":"HEADER", "headerProtocol":"1", "sampledPacketSize":"118", "strippedBytes":"4", "headerLen":"116", ...The -j option formats the JSON output as a single line per datagram making the output easy to parse in scripts. For example, the following emerging.py script downloads the Emerging Threats compromised IP address database, parses the JSON records, checks to see if source and destination addresses can be found in the database, and prints out information on any matches:
#!/usr/bin/env python from sys import stdin from json import loads from requests import get blacklist = set() r = get('https://rules.emergingthreats.net/blockrules/compromised-ips.txt') for line in r.iter_lines(): blacklist.add(line) for line in stdin: datagram = loads(line) localtime = datagram["localtime"] samples = datagram["samples"] for sample in samples: sampleType = sample["sampleType"] elements = sample["elements"] if sampleType == "FLOWSAMPLE": for element in elements: tag = element["flowBlock_tag"] if tag == "0:1": try: src = element["srcIP"] dst = element["dstIP"] if src in blacklist or dst in blacklist: print "%s %s %s" % (localtime,src,dst) except KeyError: passRun the command:
docker run -p 6343:6343/udp sflow/sflowtool -j | ./emerging.pyThese were just a few examples, see the sflowtool home page for additional information.
Forwarding using sFlow-RT describes how to set up and tear down sFlow streams using the sFlow-RT analytics engine. This is a simple way to direct a stream of sFlow to a desktop running sflowtool. For example, suppose sflowtool is running on host 10.0.0.30 and sFlow-RT is running on host 10.0.0.1, the following command would start a session:
curl -H "Content-Type:application/json" -X PUT --data '{"address":"10.0.0.30"}' \ http://10.0.0.1:8008/forwarding/sflowtool/jsonand the following command would end the session:
curl -X DELETE http://10.0.0.1:8008/forwarding/sflowtool/jsonNote: The sflow/sflow-rt Docker image is a convenient way to run sFlow-RT:
docker run -p 8008:8008 -p 6343:6343/udp sflow/sflow-rt
No comments:
Post a Comment