المقدمة
يصف هذا وثيقة Scapy، أداة معالجة حزم Python لمحولات N9K لإنشاء ومعالجة الحزم بسهولة.
المتطلبات الأساسية
قم بتنزيل Scapy إلى ذاكرة التمهيد للمحول.
لتنزيل Scapy، أستخدم الارتباط من GitHub GitHub-SCAPY
المتطلبات
توصي Cisco بأن تكون لديك معرفة بالمواضيع التالية:
- المحول Nexus 9000/3000 Switch.
المكونات المستخدمة
تم إنشاء المعلومات الواردة في هذا المستند من الأجهزة الموجودة في بيئة معملية خاصة. بدأت جميع الأجهزة المُستخدمة في هذا المستند بتكوين ممسوح (افتراضي). إذا كانت شبكتك قيد التشغيل، فتأكد من فهمك للتأثير المحتمل لأي أمر.
التركيب
قم بتنزيل التعليمة البرمجية Scapy واستخراجها إلى ذاكرة الفلاش الخاصة بتمهيد المحول لديك؛ يتوفر FTP أو SFTP أو SCP.
قم بتمكين الميزة، في هذه الحالة، SCP.
switch(config)# feature scp-server
switch(config)# sh feature | i scp
scpServer 1 enabled
انسخ الملف إلى المحول من الكمبيوتر المحمول.
scp scapy-vxlan-master.zip admin@10.88.164.13:/
بمجرد أن تكون الصورة في ذاكرة Boot Flash (الذاكرة المؤقتة)، يلزم فك ضغطها. ويجب تمكين ميزة أساسية وإزالتها من 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
بمجرد فك ضغطها، يمكن تحديد موقع الملفات باستخدام الأمر dir على ذاكرة التمهيد المؤقتة، المضغوطة وغير المضغوطة.
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
والآن أصبحت لعبة Scapy متاحة.
لاحظ أنك تحتاج لاستدعاء البرنامج بامتيازات الجذر، كما تحتاج أيضا إلى الانتقال إلى دليل Scapy.
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
>>>
إنشاء حزمة
هذا مثال على كيفية إنشاء حزمة IP أساسية لتوضيح إجراء إنشاء حركة مرور البيانات باستخدام 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'
آخر إمكانية أن يرسل ربط من PCAP مبرد التقط سابقا. ويتم تحقيق ذلك باستخدام الأمر rdpcap.
مخرجات ذلك الأمر هي قائمة بايثون تحتوي على كل الحزم الملتقطة في ملف PCAP الخاص بك. في هذا المثال، يحتوي traffic.pcap على 10 حزم ويتم تعيين هذه الحزم إلى القائمة التي تم إنشاؤها على هيئة PKTS.
>>> pkts = rdpcap('bootflash/traffic.pcap')
>>> len(pkts)
10
>>> type(pkts)
<class 'scapy.plist.PacketList'>
ملاحظة: يلزم تخزين ملف PCAP في ذاكرة التمهيد المؤقتة للمحول.
إرسال حركة مرور
بمجرد إنشاء الحزمة، نستخدم الأمر sendp لبدء إرسال الحزمة الخاصة بنا عبر الواجهة المحددة.
>>> 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.
أنت يستطيع بعد ذلك تكررت من خلال قائمة الربط أن يرسل الحركة مرور عبر القارن أنت تعين.
>>> 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.
ملاحظة: لا يتاح إلا الوصول إلى وضع منافذ المحول لكي يتم إستخدامه. وإلا، فإنه يعرض خطأ.
مثال على الخطأ:
>>> 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
ضمنت القارن يكون usable، ركضت ال ifconfig أمر، القارن ينبغي كنت عددت في هناك.
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
...
التحقق من الصحة
يمكنك إستخدام الأمر للتحقق من أي حزمة محددة.
>>> 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'