Inleiding
Dit document beschrijft Scapy, een Python-pakketmanipulatietool voor N9K-switches om eenvoudig pakketten te maken en te manipuleren.
Voorwaarden
Download Scapy naar de switch bootflash.
Als u Scapy wilt downloaden, gebruikt u de link van GitHub GitHub-SCAPY
Vereisten
Cisco raadt kennis van de volgende onderwerpen aan:
Gebruikte componenten
De informatie in dit document is gebaseerd op de apparaten in een specifieke laboratoriumomgeving. Alle apparaten die in dit document worden beschreven, hadden een opgeschoonde (standaard)configuratie. Als uw netwerk live is, moet u zorgen dat u de potentiële impact van elke opdracht begrijpt.
Installatie
Download en haal de Scapy code naar uw switch boot flash; FTP, SFTP, of SCP zijn beschikbaar.
Schakel de optie, in dit geval SCP, in.
switch(config)# feature scp-server
switch(config)# sh feature | i scp
scpServer 1 enabled
Kopieer het bestand van de laptop naar de switch.
scp scapy-vxlan-master.zip admin@10.88.164.13:/
Zodra het beeld in de laarsflits is, moet het worden gedecompresseerd. Het moet mogelijk maken functie bash en unzip het uit bash.
switch(config)# feature bash
switch(config)# run bash
bash-4.3$ sudo su -
root@switch#cd /bootflash
root@switch#unzip scapy-vxlan-master.zip
Zodra gedecompresseerd, kunnen de bestanden worden gevonden met de dir opdracht op de boot flitser, de gecomprimeerde en niet gecomprimeerde.
switch# dir bootflash: | i i scapy
4096 Jul 09 18:00:01 2019 scapy-vxlan-master/
1134096 Jul 19 23:35:26 2023 scapy-vxlan-master.zip
Nu is Scapy beschikbaar.
Bericht dat u het programma met wortelvoorrechten moet roepen en u moet ook aan de folder van Scapy navigeren.
switch(config)# run bash
Enter configuration commands, one per line. End with CNTL/Z.
bash-4.2$ sudo su -
root@switch#cd /
root@switch#cd bootflash/scapy-vxlan-master <<< Move to the scapy folder scapy-vxlan-master
root@switch#python <<< Run python once located inside the folder
Python 2.7.2 (default, Mar 9 2015, 15:52:40)
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from scapy.all import * <<< Import libraries from scapy
>>>
Een pakket maken
Dit is een voorbeeld van hoe u een standaard IP-pakket maakt om de procedure te illustreren om verkeer te genereren met Scapy.
Create l2 source and destination mac addresses.
>>> l2=Ether()
>>> l2.src='00:aa:12:34:12:34'
>>> l2.src='00:ff:aa:bb:cc:11'
Create l3 source and destination IP addresses.
>>> l3=IP()
>>> l3.src='10.1.1.1'
>>> l3.dst='10.2.2.2'
Een andere mogelijkheid is om een pakket te verzenden vanuit een pcap-bestand dat eerder is opgenomen. Dit wordt bereikt met de opdracht rdpcap.
De uitvoer van die opdracht is een Python-lijst met alle pakketten die in uw pcap-bestand zijn opgenomen. In dit voorbeeld bevat traffic.pcap 10 pakketten en die pakketten worden toegewezen aan de lijst die als pakketten wordt gemaakt.
>>> pkts = rdpcap('bootflash/traffic.pcap')
>>> len(pkts)
10
>>> type(pkts)
<class 'scapy.plist.PacketList'>
Opmerking: het pcap-bestand moet worden opgeslagen in de opstartflitser van de switch.
Verkeer verzenden
Zodra het pakket is gemaakt, gebruiken we het opdrachtverzend om te beginnen met het verzenden van ons pakket via de opgegeven interface.
>>> packet = l2/l3. << packet now have the values for source and destination declared on creating a packet.
>>> sendp(packet, iface='Eth1-1'). << Sending the packet through interface eth1/1
.
Sent 1 packets.
U kunt dan door de lijst van pakketten herhalen om het verkeer over de interface te verzenden u specificeert.
>>> while True:
... for i in range(len(pkts)): <<< It goes through the list pkts with 10 packets and send 1 by 1
... sendp(pkts[i], iface='Eth1-1')
...
.
Sent 1 packets.
.
Sent 1 packets.
Opmerking: alleen toegang tot de modus switch-poorten is beschikbaar voor gebruik. Anders geeft het een fout weer.
Voorbeeld van de fout:
>>> sendp(l2/l3, iface='Eth1-6')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "scapy/sendrecv.py", line 335, in sendp
socket = socket or conf.L2socket(iface=iface, *args, **kargs)
File "scapy/arch/linux.py", line 477, in __init__
set_promisc(self.ins, self.iface)
File "scapy/arch/linux.py", line 165, in set_promisc
mreq = struct.pack("IHH8s", get_if_index(iff), PACKET_MR_PROMISC, 0, b"")
File "scapy/arch/linux.py", line 380, in get_if_index
return int(struct.unpack("I", get_if(iff, SIOCGIFINDEX)[16:20])[0])
File "scapy/arch/common.py", line 59, in get_if
ifreq = ioctl(sck, cmd, struct.pack("16s16x", iff.encode("utf8")))
IOError: [Errno 19] No such device
Zorg ervoor dat de interface bruikbaar is, voer de ifconfig-opdracht uit, de interface moet daar worden vermeld.
bash-4.3$ ifconfig | grep Eth
Eth1-1 Link encap:Ethernet HWaddr 00:a2:ee:74:4b:88
Eth1-2 Link encap:Ethernet HWaddr 00:a2:ee:74:4b:89
Eth1-5 Link encap:Ethernet HWaddr 00:a2:ee:74:4b:8c
Eth1-6 Link encap:Ethernet HWaddr 00:a2:ee:74:4b:8d
Eth1-8 Link encap:Ethernet HWaddr 00:a2:ee:74:4b:8f
Eth1-11 Link encap:Ethernet HWaddr 00:a2:ee:74:4b:c1
...
Verifiëren
U kunt de opdracht gebruiken om een bepaald pakket te controleren.
>>> pkts[5].show()
###[ Ethernet ]###
dst = 01:00:0c:cc:cc:cd
src=58:97:bd:00:a4:f2
type = 0x8100
###[ 802.1Q ]###
prio = 6
id = 0
vlan = 104
type = 0x32
###[ LLC ]###
dsap = 0xaa
ssap = 0xaa
ctrl = 3
###[ SNAP ]###
OUI = 0xc
code = 0x10b
###[ Spanning Tree Protocol ]###
proto = 0
version = 2
bpdutype = 2
bpduflags = 60
rootid = 32872
rootmac = 58:97:bd:00:a4:f1
pathcost = 0
bridgeid = 32872
bridgemac = 58:97:bd:00:a4:f1
portid = 32769
age = 0.0
maxage = 20.0
hellotime = 2.0
fwddelay = 15.0
###[ Raw ]###
load = '\x00\x00\x00\x00\x02\x00h'