1#!/usr/bin/env python3 2# 3# SPDX-License-Identifier: BSD-2-Clause 4# 5# Copyright © 2023. Rubicon Communications, LLC (Netgate). All Rights Reserved. 6# 7# Redistribution and use in source and binary forms, with or without 8# modification, are permitted provided that the following conditions 9# are met: 10# 1. Redistributions of source code must retain the above copyright 11# notice, this list of conditions and the following disclaimer. 12# 2. Redistributions in binary form must reproduce the above copyright 13# notice, this list of conditions and the following disclaimer in the 14# documentation and/or other materials provided with the distribution. 15# 16# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26# SUCH DAMAGE. 27# 28 29import argparse 30import logging 31logging.getLogger("scapy").setLevel(logging.CRITICAL) 32import scapy.all as sp 33 34def receive(recvif, recvport): 35 pkts = sp.sniff(iface=recvif, timeout=65) 36 37 if len(pkts) == 0: 38 print("No data") 39 return 40 41 for pkt in pkts: 42 udp = pkt.getlayer(sp.UDP) 43 if not udp: 44 continue 45 46 if udp.dport != recvport: 47 continue 48 49 hdr = pkt.getlayer(sp.NetflowHeader) 50 51 if hdr.version == 5: 52 v5hdr = pkt.getlayer(sp.NetflowHeaderV5) 53 out="" 54 for i in range(1, v5hdr.count + 1): 55 r = pkt.getlayer(sp.NetflowRecordV5, nb=i) 56 out = "%s,proto=%d,src=%s,dst=%s,srcport=%d,dstport=%d" % (out, r.prot, r.src, r.dst, r.srcport, r.dstport) 57 print("v=%d,count=%d%s" % (hdr.version, v5hdr.count, out)) 58 elif hdr.version == 10: 59 print("v=10") 60 return 61 62def main(): 63 parser = argparse.ArgumentParser("pft_read_ipfix.py", 64 description="IPFix test tool") 65 parser.add_argument('--recvif', nargs=1, 66 required=True, 67 help='The interface on which to look for packets') 68 parser.add_argument('--port', nargs=1, 69 required=True, 70 help='The port number') 71 72 args = parser.parse_args() 73 74 receive(args.recvif[0], int(args.port[0])) 75 76if __name__ == '__main__': 77 main() 78 79