Nədən danışacağıq
Bəzən şəbəkədə hər hansı problemi araşdıran zaman avadanlığa gələn və ordan çıxan trafikə baxmaq lazım olur. Serverlərdə bunu tcpdump və onun əsasında çalışan Wireshark kimi alətlərlə etmək olar. Şəbəkə avadanlıqlarında da belə bir imkan var və bir çox hallarda elə tcpdump əsasında çalışır. Bu yazıda NX OS əməliyyat sisteminin aləti olan Ethanalyzer haqqında danışacağam.
Nexus avadanlıqlarında çalışan bu alət avadanlığın mərkəzi prosessoruna (bundan sonra CPU) gələn və CPU-dan göndərilən trafikə baxmağa imkan verir. Ethanalyzerin həm də məlumatı .pcap və ya .pcapng formatında svitçin yaddaşında saxlamaq kimi funksiyası var. Daha sonra həmin faylı kompüterdə Wireshark kimi trafik analizi proqamları ilə açmaq olar. Çox uzatmadan təcrübəyə keçək.
Test mühiti
Təcrübə zamanı aşağıdakı topologiyaya istinad edəcəyik:
Svitçlərin konfiqurasiyası aşağıdakı kimidir:
LEAF1#
feature ospf
router ospf NETADMIN
router-id 1.1.1.1
interface Ethernet1/2
ip address 10.10.10.1/30
ip router ospf NETADMIN area 0.0.0.0
interface loopback0
ip address 192.168.1.1/32
ip router ospf NETADMIN area 0.0.0.0
LEAF2#
feature ospf
router ospf NETADMIN
router-id 2.2.2.2
interface Ethernet1/2
ip address 10.10.10.6/30
ip router ospf NETADMIN area 0.0.0.0
interface loopback0
ip address 192.168.2.2/32
ip router ospf NETADMIN area 0.0.0.0
LEAF3#
feature ospf
router ospf NETADMIN
router-id 3.3.3.3
interface Ethernet1/1
ip address 10.10.10.2/30
ip router ospf NETADMIN area 0.0.0.0
interface Ethernet1/2
ip address 10.10.10.5/30
ip router ospf NETADMIN area 0.0.0.0
interface loopback0
ip address 192.168.3.3/32
ip router ospf NETADMIN area 0.0.0.0
OSPF marşrutlama protokolunu Loopback interfeyslərə çata bilmək üçün istifadə edirik. Testlərimizi LEAF3 svitçində edəcəyik. Öncə ethanalyzerin sintaksisinə nəzər salaq:
ethanalyzer local interface inband
Bu sətr bizə LEAF3 svitçinin CPU-na daxil olan və ordan gedən istənilən trafiki görməyə imkan verir. Gəlib baxaq:
LEAF3# ethanalyzer local interface inband
Capturing on 'ps-inb'
1 2024-03-17 13:48:48.793934702 7c:69:f6:0f:92:1a → 01:80:c2:00:00:00 STP 60 RST. Root = 32768/1/7c:69:f6:0f:92:17 Cost = 0 Port = 0x8003
2 2 2024-03-17 13:48:48.830941508 7c:69:f6:10:00:d2 → 01:80:c2:00:00:00 STP 60 RST. Root = 32768/1/7c:69:f6:0f:92:17 Cost = 2 Port = 0x8003
3 2024-03-17 13:48:50.794720439 7c:69:f6:0f:92:1a → 01:80:c2:00:00:00 STP 60 RST. Root = 32768/1/7c:69:f6:0f:92:17 Cost = 0 Port = 0x8003
4 4 2024-03-17 13:48:50.831773045 7c:69:f6:10:00:d2 → 01:80:c2:00:00:00 STP 60 RST. Root = 32768/1/7c:69:f6:0f:92:17 Cost = 2 Port = 0x8003
5 5 2024-03-17 13:48:52.222961049 10.10.10.6 → 224.0.0.5 OSPF 82 Hello Packet
6 2024-03-17 13:48:52.794380685 7c:69:f6:0f:92:1a → 01:80:c2:00:00:00 STP 60 RST. Root = 32768/1/7c:69:f6:0f:92:17 Cost = 0 Port = 0x8003
7 7 2024-03-17 13:48:52.831520963 7c:69:f6:10:00:d2 → 01:80:c2:00:00:00 STP 60 RST. Root = 32768/1/7c:69:f6:0f:92:17 Cost = 2 Port = 0x8003
8 8 2024-03-17 13:48:54.186660618 10.10.10.5 → 224.0.0.5 OSPF 82 Hello Packet
9 2024-03-17 13:48:54.793952061 7c:69:f6:0f:92:1a → 01:80:c2:00:00:00 STP 60 RST. Root = 32768/1/7c:69:f6:0f:92:17 Cost = 0 Port = 0x8003
10 10 2024-03-17 13:48:54.831392702 7c:69:f6:10:00:d2 → 01:80:c2:00:00:00 STP 60 RST. Root = 32768/1/7c:69:f6:0f:92:17 Cost = 2 Port = 0x8003
LEAF3#
Varsayılan olaraq ethanalyzer ilk 10 paketi tutur. Paketlərin sayını dəyişə, hətta limitsiz edə bilərik. Bir az sonra ethanalyzerin bütün açar sözlərinə nəzər salacağam. Hələlik isə avadanlığa daxil olan paketlərə baxaq. Gördüyümüz kimi svitçə STP və OSPF paketləri gəlir. Bu tip paketlər svitçin CPU-na daxil olur (10.10.10.6 → 224.0.0.5) və ya ordan çıxır (10.10.10.5 → 224.0.0.5).
Ethanalyzer: açar sözlər
LEAF3# ethanalyzer ?
background-session – Adından da göründüyü kimi fonda paketləri tutmağa imkab verir.
copy-background-snapshot – Fonda tutulan paketləri fayl şəklində svitçin yaddaşında saxlayır
copy-compressed-background-snapshot Fonda tutulan paketləri sıxılmış fayl şəklində svitçin yaddaşında saxlayır
local – CPU (Sup – Supervizor) tərəfə gedən və ordan çıxan paketlərin tutulması. Təcrübədə ən çox bundan istifadə olunur.
LEAF3# ethanalyzer local ? interface – Göstərilən interfeysdə real zaman şəklində trafikə baxmaq read – daha öncə cihazda saxlanılan faylı oxumaq
LEAF3# ethanalyzer local interface ?
front-panel Avadanlığın fiziki portundan trafikin götürülməsi. Məsələn, LEAF3 svitçində eth1/1 yazmaqla LEAF1-dən gələn və LEAF3-ün CPU-na ünvanlanan trafiki görə bilərik. Diqqət yetirin, məhz CPU-ya gedən trafiki görə bilirik. Yəni LEAF1-dən LEAF3-ün Lo0 interfeysinən ping sorğular göndərsək onları görə biləcəyik, amma LEAF1-dən LEAF2-nin Lo0 interfeysinə gedən ping sorğuları görə bilməyəcəyik, çünki LEAF3 nöqteyi nəzərindən bu trafik ötürülən trafikdir.
inband CPU daxil olan/çıxan trafiki görməyə imkan verir
inband-in CPU-ya daxil olan trafiki görməyə imkan verir
inband-out CPU-dan çıxan trafiki görməyə imkan verir
mgmt İdarəetmə interfeysində trafikə baxmaq üçün istifadə olunur
netstack Netstack interfeysə gələn trafikin oxunması
port-channel port-channel ilə gələn trafikin oxunması
vlan VLAN-a məxsus trafikin oxunması
LEAF3# ethanalyzer local interface inband ?
autostop Ethanalyzerin avtomatik dayanma şərtini qeyd etmək üçün istifadə olunur
capture-filter Tutulması lazım olan trafiki müəyyən edir.
capture-ring-buffer Bəzən tutulan trafik çox ola bilər və onu bir neçə fayla bölmək lazım gələ bilər. Bu açarsözü vasitəsi ilə bölnümə şərtini müəyyən etmək olar.
decode-internal NXOS ƏS daxili məlumatlarını tutmağa imkan verir.
detail Varsayılan olaraq ethanalyzer yalnız paketin qısa məlumatlarını göstərir. detail açarsözü ilə 1 paketin daxilinə baxa bilirik.
display-filter Tutulan paketlər arasında lazım olan paketləri göstərməyə imkan verir. Capture-filterdən fərqli olaraq, bu açarsözü ilə bütün trafik tutulur, amma yalnız filterdə göstərilən məlumatlar əks olunur.
limit-captured-frames Bir az əvvəl tutulan paketlərin limitini dəyişə biləcəyimizi demişdim. Bu açar sözü məhz bu məqsədlə istifadə olunur. Dəyəri 0 yazsaq Ctrl+C sıxanadək paketlərin tutulması prosesi davam edəcək.
limit-frame-size Freymin sadəcə bir hissəsini tutmaq üçün istifadə olunur.
raw paketin Hex/Ascii formatında tutulmasına imkan verir.
write tutulan paketləri fayl şəklində svitçin yaddaşında saxlamaq üçün istifadə olunur.
Display-filter
display-filter çoxsaylı paketlərin arasında konkret paketə baxmaq üçün olduqca rahat açarsözüdür. display-filter IP, MAC, protokol, port daxil olmaqla bir çox məlumatlar üzrə filtrləmə imkanı verir. Display-filterin sintaksisi Wireshark ilə eynidir. Aşağıda Wireshark-da display-filter hissəsini şəklini görə bilərsiz:

Gəlin LEAF3-də 10.10.10.1 ünvanında gələn paketləri filtrləyək:
LEAF3# ethanalyzer local interface inband display-filter "ip.addr==10.10.10.1" limit-captured-frames 0
Capturing on 'ps-inb'
9 2024-03-17 14:58:43.020795155 10.10.10.1 → 224.0.0.5 OSPF 82 Hello Packet
10 2024-03-17 14:58:43.020823597 10.10.10.1 → 224.0.0.5 OSPF 82 Hello Packet
Hər sətrin əvvəlindəki sıra nömrəsinə fikir verin burada 9 və 10-cü paketləri görürük. Bu o deməkdir ki, ümumilikdə svitç 10 paket tuta bilib, lakin yalnız ikisi bizim şərtimizə uyğun gəldiyi üçün onları əks etdirib.
Capture-filter
display-filterd-dən fərqli olaraq, capture filter yalnız göstərilən şərtə uyğun olan paketləri tutur. Bu filterin sintaksisi tcpdump alətinin sintaksisi ilə eynidir və display filterdən fərqlənir. Bəzi protokollar isə filtrləmə ümumiyyətlə yoxdur, məsələn CDP. Əgər filteri yazmaqda çətinlik çəkirsinizsə Wireshark-ın Capture filter hissəsi köməyə çata bilər. Əgər filter üçün açarsözü döğrudursa sətr yaşı olacaq, səhvdirsə qırmızı. Məsələn, CDP açarsözü ilə capture filter yoxdur:

tcpdump filterləri haqqında ətraflı bu linkdən oxuya bilərsiniz. Biz isə test edək:
LEAF3# ethanalyzer local interface inband capture-filter "host 10.10.10.1" limit-captured-frames 0
Capturing on 'ps-inb'
1 2024-03-17 15:11:05.676916974 10.10.10.1 → 224.0.0.5 OSPF 82 Hello Packet
2 2024-03-17 15:11:05.676962024 10.10.10.1 → 224.0.0.5 OSPF 82 Hello Packet
3 2024-03-17 15:11:13.463577217 10.10.10.1 → 224.0.0.5 OSPF 82 Hello Packet
4 2024-03-17 15:11:13.463605771 10.10.10.1 → 224.0.0.5 OSPF 82 Hello Packet
Burada ip.addr əvəzinə host sözündən istifadə etmişik. Sistem bu şərtə cavab verən 4 paket tuta bilib və hamısını əks etdirib. host ilə birlikdə src və ya dst istifadə etmək olar. Məsələn, src host 10.10.10.1.
Ethanalyzer: details
Mənə görə, tutulan trafikin detallarına baxmaq üçün ən yaxşı alət Wireshark-dır, amma əgər yalnız bir paketə baxmaq lazımdırsa bu zaman details açarsözündən istifadə edə bilərik:
LEAF3# ethanalyzer local interface inband capture-filter "src host 10.10.10.1" limit-captured-frames 1 detail
Capturing on 'ps-inb'
1
Frame 1: 82 bytes on wire (656 bits), 82 bytes captured (656 bits) on interface ps-inb, id 0
Interface id: 0 (ps-inb)
Interface name: ps-inb
Encapsulation type: Ethernet (1)
Arrival Time: Mar 17, 2024 15:18:36.983118802 UTC
[Time shift for this packet: 0.000000000 seconds]
Epoch Time: 1710688716.983118802 seconds
[Time delta from previous captured frame: 0.000000000 seconds]
[Time delta from previous displayed frame: 0.000000000 seconds]
[Time since reference or first frame: 0.000000000 seconds]
Frame Number: 1
Frame Length: 82 bytes (656 bits)
Capture Length: 82 bytes (656 bits)
[Frame is marked: False]
[Frame is ignored: False]
[Protocols in frame: eth:ethertype:ip:ospf]
Ethernet II, Src: 2c:5a:0f:51:f1:3d, Dst: 01:00:5e:00:00:05
Destination: 01:00:5e:00:00:05
Address: 01:00:5e:00:00:05
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
.... ...1 .... .... .... .... = IG bit: Group address (multicast/broadcast)
Source: 2c:5a:0f:51:f1:3d
Address: 2c:5a:0f:51:f1:3d
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
Type: IPv4 (0x0800)
Internet Protocol Version 4, Src: 10.10.10.1, Dst: 224.0.0.5
0100 .... = Version: 4
.... 0101 = Header Length: 20 bytes (5)
Differentiated Services Field: 0xc0 (DSCP: CS6, ECN: Not-ECT)
1100 00.. = Differentiated Services Codepoint: Class Selector 6 (48)
.... ..00 = Explicit Congestion Notification: Not ECN-Capable Transport (0)
Total Length: 68
Identification: 0xbe47 (48711)
Flags: 0x0000
0... .... .... .... = Reserved bit: Not set
.0.. .... .... .... = Don't fragment: Not set
..0. .... .... .... = More fragments: Not set
Fragment offset: 0
Time to live: 1
Protocol: OSPF IGP (89)
Header checksum: 0x064a [validation disabled]
[Header checksum status: Unverified]
Source: 10.10.10.1
Destination: 224.0.0.5
Open Shortest Path First
OSPF Header
Version: 2
Message Type: Hello Packet (1)
Packet Length: 48
Source OSPF Router: 1.1.1.1
Area ID: 0.0.0.0 (Backbone)
Checksum: 0xcb7f [correct]
Auth Type: Null (0)
Auth Data (none): 0000000000000000
OSPF Hello Packet
Network Mask: 255.255.255.252
Hello Interval [sec]: 10
Options: 0x02, (E) External Routing
0... .... = DN: Not set
.0.. .... = O: Not set
..0. .... = (DC) Demand Circuits: Not supported
...0 .... = (L) LLS Data block: Not Present
.... 0... = (N) NSSA: Not supported
.... .0.. = (MC) Multicast: Not capable
.... ..1. = (E) External Routing: Capable
.... ...0 = (MT) Multi-Topology Routing: No
Router Priority: 1
Router Dead Interval [sec]: 40
Designated Router: 10.10.10.1
Backup Designated Router: 10.10.10.2
Active Neighbor: 3.3.3.3
LEAF3#
Ethanalyzer: write
Tutulan paketləri fayl şəklində yaddaşda saxlamaq üçün write açar sözündən istifadə olunur:
LEAF3# ethanalyzer local interface inband capture-filter "src host 10.10.10.1" limit-captured-frames 0 write bootflash:$(SWITCHNAME)_$(TIMESTAMP).pcap
Capturing on 'ps-inb'
2
LEAF3# dir bootflash:
592 Mar 17 15:23:19 2024 LEAF3_2024-03-17-15.23.15.pcap
$(SWITCHNAME) və $(TIMESTAMP) verilənləri müvafiq olaraq svitçin adını və faylın yaranma vaxtını faylın adına əlavə edir.
Daha çox test
Gəlin bir neçə test edək və əmin olaq ki, ethanalyzer yalnız CPU-ya gedən paketləri görür. Ssenarimizdə LEAF1-in Lo0 interfeysindən LEAF3-ün Lo0 interfeysini (192.168.3.3) pingləyəcəyik. Paketləru LEAF3 svitçində tutacağıq. Bu halda ethanalyzer bizə paketləri göstərməlidir. Əks olunan paketlərini sayını limitləmək üçün display-filterdən istifadə edək və icmp protokolu üzrə filtrləyək:
LEAF3# ethanalyzer local interface front-panel eth1/1 display-filter "icmp" limit-captured-frames 0
Capturing on 'Eth1-1'
1 2024-03-17 15:31:22.687865749 192.168.1.1 → 192.168.3.3 ICMP 98 Echo (ping) request id=0x4e3a, seq=0/0, ttl=255
2 2024-03-17 15:31:22.688720314 192.168.3.3 → 192.168.1.1 ICMP 98 Echo (ping) reply id=0x4e3a, seq=0/0, ttl=255 (request in 1)
3 2024-03-17 15:31:22.689625696 192.168.1.1 → 192.168.3.3 ICMP 98 Echo (ping) request id=0x4e3a, seq=256/1, ttl=255
4 2024-03-17 15:31:22.690184240 192.168.3.3 → 192.168.1.1 ICMP 98 Echo (ping) reply id=0x4e3a, seq=256/1, ttl=255 (request in 3)
5 2024-03-17 15:31:22.690965230 192.168.1.1 → 192.168.3.3 ICMP 98 Echo (ping) request id=0x4e3a, seq=512/2, ttl=255
6 2024-03-17 15:31:22.691482565 192.168.3.3 → 192.168.1.1 ICMP 98 Echo (ping) reply id=0x4e3a, seq=512/2, ttl=255 (request in 5)
7 2024-03-17 15:31:22.692241792 192.168.1.1 → 192.168.3.3 ICMP 98 Echo (ping) request id=0x4e3a, seq=768/3, ttl=255
8 2024-03-17 15:31:22.692799707 192.168.3.3 → 192.168.1.1 ICMP 98 Echo (ping) reply id=0x4e3a, seq=768/3, ttl=255 (request in 7)
9 2024-03-17 15:31:22.693533838 192.168.1.1 → 192.168.3.3 ICMP 98 Echo (ping) request id=0x4e3a, seq=1024/4, ttl=255
10 2024-03-17 15:31:22.694291676 192.168.3.3 → 192.168.1.1 ICMP 98 Echo (ping) reply id=0x4e3a, seq=1024/4, ttl=255 (request in 9)
Gəlin LEAF1-dən bu dəfə LEAF2-nin Lo0 interfeysini (192.168.2.2) pingləyək. LEAF1-in marşrut cədvəlinə əsasən, 192.168.2.2 IP-ünvanı LEAF3-dən keçməklə əlçatandır:
LEAF1# show ip route 192.168.2.2
192.168.2.2/32, ubest/mbest: 1/0
*via 10.10.10.2, Eth1/2, [110/9], 00:37:02, ospf-NETADMIN, intra
LEAF1# show ip route 192.168.3.3
192.168.3.3/32, ubest/mbest: 1/0
*via 10.10.10.2, Eth1/2, [110/5], 00:37:52, ospf-NETADMIN, intra
Bu o deməkdir ki, LEAF3 üçün bu trafik ötüb keçəndir və ethanalyzer bunu görməməlidir. Yoxlayaq:

ping sorğuları getməsinə baxmayaraq LEAF3-də heç nə görə bilmirik, çünki bu trafik CPU deyil, daha aşağı, cihaz və modul səviyyəsində email edilir.
SPAN to CPU və ethanalyzer
Bonus olaraq isə maraqlı bir alətdən danışacağam. SPAN haqqında yəqin ki, məlumatınız var. IT təhlükəsizlik əməkdaşları ondan çox istifadə edir. Bu alət cihazdan keçən trafiki üçüncü cihaza, trafik analizi ilə məşğul olan serverə ötürür. NXOS əməliyyat sistemində isə bu alət bizə cihazdan ötüb keçən (forwarded) trafiki görməyə imkan verir, hansı ki, bir az əvvəl görünmürdü.
SPAN to CPU adlanan bu metod hər hansı fiziki interfeysdən və ya port-channeldən gələn və gedən trafiki svitçin CPU-na yönləndirməyə imkan verir. Bəri başdan deyim ki, bu CPU-nu yükləmir çünki varsayılan limit var. Yalnız təsadüfi 50 paket CPU-ya göndərilir:
LEAF3# show hardware rate-limiter | i i span
Units for Config: kilo bits per second
Allowed, Dropped & Total: aggregated bytes since last clear counters
Module: 1
R-L Class Config Allowed Dropped Total
span 50 0 0 0
SPAN to CPU işə salmaq üçün standart SPAN konfiqurasiya edilir:
monitor session 1
source interface Ethernet1/1 both
destination interface sup-eth0
no shutdown
source – trafikin qaynağını müəyyən edir. destination – tutulan trafikin göndəriləcəyi yeri. SPAN to CPU metodunda bu sup-eth0-dır. Bəli, NX OS ƏS-də SPAN sessiyasını işə salmaq lazımdır və bunun üçün no shutdown yazılır. Gəlin bir az öncəki təcrübəni SPAN to CPU ilə yoxlayaq. LEAF1-dən LEAF2-nin Lo0 interfeysinə ping sorğuları göndərək və LEAF3-də onlara baxmağa çalışaq:

Diqqət yetirin, 50 paket göndərmişik və cavab almışıq. Yəni cəmi 100 paket olmalı idi, amma cihazda 54 göstərir çünki limit tətbiq olunub.
SPAN to CPU-da da filter tətbiq etmək olar. Bunun üçün VLAN Access Control List (VACL) istifadə olunur. Gəlin filter yazaq və tətbiq edək. VACL yazmaq üçün öncə ənənəvi ACL yazırıq, daha sonra vlan access-map konfiqurasiya rejimində həmin bu ACL-ə istinad edirik. Sonra isə yaradılmış VLAN access map SPAN sessiyaya tətbiq olunur. Amma bir məqam var, fikir versəniz yalnız gələn RX trafiki göstərmişik. Çünki, SPAN filter çıxan TX trafikə tətbiq oluna bilmir.
ip access-list FOR-SPAN
10 permit ip 192.168.1.1/32 192.168.2.2/32
vlan access-map VACL-FOR-SPAN 10
match ip address FOR-SPAN
action forward
monitor session 1
filter access-group VACL-FOR-SPAN
source interface Ethernet1/1 rx
destination interface sup-eth0
no shut
Şərtimizə əsasən yalnız 192.168.1.1 IP-dən 192.168.2.2-yə gedən sorğular CPU ya yönləndirilməli və ethanalyzer tərəfindən görülməlidir. Yoxlamaq üçün öncə 10.10.10.1-dən ping sorğuları göndərəcəyik. Daha sonra isə Lo0 interfeysindən.

Şəkildən göründüyü kimi, yalnız 192.168.1.1-dən gələn paketlər CPU-ya gedib. İndi filteri yığışdıraq və bir daha baxaq:

Gördüyümüz kimi, filter sildikdən sonra bütün paketləri CPU-da görə bildik.
Xülasə
Bu yazımda Ethanalyzer və SPAN to CPU haqqında danışdım. Şəbəkədə olan problemləri araşdırmaq üçün olduqca faydalı alətlərdir. Ethanalyzer yalnız CPU-ya gələn və ordan çıxan trafikə baxmağa imka verir. display və capture filter köməyi ilə istədiyiniz trafik tipini tuta bilərsiniz. SPAN to CPU ilə birlikdə isə ethanalyzer vasitəsi ilə cihazdan ötüb keçən trafikə baxmaq olar.
netadmin.az IT haqqında Azərbaycan dilində
