Python で pcap から snmptrap のパケットを再現
業務上、snmptrap を生成して trapper の検証をする必要があったため、以下のツールを作成した。
参考 Sending packets from pcap with changed src/dst in scapy
snmptrapgen.py
import argparse
from scapy.all import *
class SNMPTrapGenerator(object):
def __init__(self, infile, dst_ip, src_ip=None):
try:
self.rd = PcapReader(infile)
self.dst_ip = dst_ip
self.src_ip = src_ip
except IOError:
print "Failed reading file %s contents" % infile
sys.exit(1)
def send(self, count=100):
pkt_cnt = 0
p_out = []
for p in self.rd:
pkt_cnt += 1
np = p.payload
if IP in np and UDP in np:
np[IP].dst = self.dst_ip
if self.src_ip is not None:
np[IP].src = self.src_ip
del np[IP].chksum
del np[UDP].chksum
p_out.append(np)
if pkt_cnt % count == 0:
send(PacketList(p_out))
p_out = []
# Send remianing in final batch
send(PacketList(p_out))
print "Total packets sent %d" % pkt_cnt
def main():
parser = argparse.ArgumentParser(prog="snmptrapgen", add_help=True)
parser.add_argument("-f", "--file", type=str,
required=True, help="Specify .pcap file.")
parser.add_argument("-d", "--dst_ip", type=str,
required=True, help="Sepcify destination ip address.")
parser.add_argument("-s", "--src_ip", type=str,
required=False, help="Specify source ip address.p")
args = parser.parse_args()
stg = SNMPTrapGenerator(args.file, args.dst_ip)
stg.send(1000)
if __name__ == "__main__":
main()
前準備
scapy と pypcap が必要であるため、以下のコマンドでインストールする。
# yum -y install libpcap-devel python-pip
# pip install scapy pypcap
あとは自前の pcap ファイルを使って snmptrapd などのサーバーに投入することができる。
頑張れば scapy で好きなパケットを作れたりするので試験したいパケットなどがあれば積極的に使っていきたい。