
Qëllimi i këtij projekti ishte:
- Studimi i protokollit DHCP gjatë punës në rrjetin IPv4
- Studimi i Python (pĂ«r mĂ« shumĂ« se nga zero đ )
- zëvendësimi i serverit (forku im), origjinali , i cili bëhet gjithnjë e më e vështirë për t'u mbledhur nën një sistem të ri operativ. Gjithashtu, nuk më pëlqen që binari, të cilin nuk e mundësoj "ta ndërroni tani"
- sigurimi i një serveri DHCP funksional me mundësinë e marrjes së adresës IP të abonentëve sipas adresës MAC të abonentit ose lidhjes MAC të ndërlidhësit + port (Mundësia 82)
- shkrimi i një 'biciklete' të re (Oh! kjo është aktiviti im i preferuar)
- marrja e kritikave pĂ«r angazhimin tim nĂ« Habr (ose mĂ« mirĂ«, njĂ« ftesĂ«) đ
Rezultati: funksionon đ Testuar nĂ« sistemet operative FreeBSD dhe Ubuntu. NĂ« teori, kodi mund tĂ« kĂ«rkohet tĂ« funksionojĂ« nĂ«n çdo sistem operativ, pasi duket se nuk ka lidhje specifike nĂ« kod.
Kujdes! Pasojat janë të shumta.
Lidhja me depozitën për ata që duan .
Procesi i instalimit, konfigurimit dhe pĂ«rdorimit tĂ« rezultateve tĂ« "studimit tĂ« materialeve" Ă«shtĂ« mĂ« poshtĂ«, dhe mĂ« pas pak teori rreth protokollit DHCP. PĂ«r veten. Dhe pĂ«r historinĂ« đ
Pak teori
ĂfarĂ« Ă«shtĂ« DHCP
Ky është një protokoll rrjeti që lejon një pajisje të mësojë adresën e saj IP (dhe parametrat e tjerë si gateway, DNS dhe shumë të tjera) nga serveri DHCP. Shkëmbimi i paketave ndodh mbi protokolin UDP. Parimi i përgjithshëm i funksionimit të pajisjes gjatë kërkesës për parametrat e rrjetit është:
- Pajisja (klienti) dërgon një kërkesë të gjerë UDP (DHCPDISCOVER) në gjithë rrjetin me kërkesën "ndonjë të lutem, më jepni një adresë IP". Zakonisht (por jo gjithmonë) kërkesa bëhet nga porta 68 (burimi), dhe caktimi është porti 67. Disa pajisje dërgojnë paketa edhe nga porta 67. Brenda paketës DHCPDISCOVER përfshihet adresa MAC e pajisjes klient.
- Të gjitha serverët DHCP që ndodhen në rrjet (dhe mund të jenë disa) formojnë një ofertë DHCPOFFER me konfigurimet e rrjetit për pajisjen që ka dërguar DHCPDISCOVER dhe gjithashtu e dërgojnë atë gjerësisht nëpër rrjet. Identifikimi i kush e pranon këtë paketë bazohet në adresën MAC të klientit, e cila është dhënë më parë në kërkesën DHCPDISCOVER.
- Klienti merr paketa me ofertat e konfigurimeve të rrjetit, zgjedh më tërheqëse (kriteret mund të jenë të ndryshme, për shembull, edhe sipas kohës së dërgimit të paketës, numrit të rrugëve ndërmjetëse) dhe bën një "kërkesë zyrtare" DHCPREQUEST nga serveri i preferuar DHCP me konfigurimet e rrjetit. Në këtë rast, paketa dërgohet për një server të caktuar DHCP.
- Serveri që merr DHCPREQUEST dërgon një paketë të formatit DHCPACK, në të cilën përsëri liston konfigurimet e rrjetit të destinuara për këtë klient.

Përveç kësaj, ka paketa DHCPINFORM, të cilat dërgohen nga klienti dhe qëllimi i tyre është të informojnë serverin DHCP se "klienti është aktiv" dhe po përdor parametrat e dhënë të rrjetit. Në këtë implementim të serverit, këto paketa injorohen.
Formati i paketave
Në përgjithësi, çarçafi i paketës Ethernet duket si më poshtë:
![]()
Në këtë rast, ne do të shqyrtojmë vetëm të dhënat e përmbajtjes së paketës UDP, pa kryetarët e protokolleve të niveleve OSI, pra strukturën e DHCP:
DHCPDISCOVER
Pra, procesi i marrjes së adresës IP për pajisjen fillon me dërgimin e një kërkese gjerësore nga klienti DHCP nga porta 68 në 255.255.255.255:67. Në këtë paketë, klienti përfshin adresën e tij MAC, si dhe çfarë saktësisht dëshiron të marri nga serveri DHCP. Struktura e paketës përshkruhet në formën e tabelës më poshtë.
Tabela e strukturës së paketës DHCPDISCOVER
Pozita në paketë
Emri i vlerës
Shembuj
Prezantimi
Byte
Shpjegim
1
Kërkesë për Nisje
1
Hex
1
Lloji i mesazhit. 1 â kĂ«rkesĂ« nga klienti pĂ«r serverin, 2 â pĂ«rgjigje nga serveri pĂ«r klientin
2
Tipi i harduerit
1
Hex
1
Lloji i adresĂ«s sĂ« harduerit, nĂ« kĂ«tĂ« protokoll, 1 â MAC
3
Gjatësia e adresës së harduerit
6
Hex
1
Gjatësia e adresës MAC të pajisjes
4
Hops
1
Hex
1
Numri i rrugëve ndërmjetëse
5
ID e Transaksionit
23:cf:de:1d
Hex
4
Identifikues unik i transaksionit. Krijohet nga klienti në fillim të operacionit të kërkesës
7
Sekondat e kaluara
0
Hex
4
Koha në sekonda që nga fillimi i procesit të marrjes së adresës
9
Flagat e Nisjes
0
Hex
2
Disa flagë, që mund të vendosen si tregues të parametrave të protokollit
11
Adresa IP e klientit
0.0.0.0
Vargu
4
Adresa IP e klientit (nëse ka)
15
Adresa IP e propozuar nga serveri (nëse ka)
0.0.0.0
Vargu
4
Adresa IP e serverit të njohur
19
Adresa IP e serverit (nëse e di)
0.0.0.0
Vargu
4
Adresa IP e agentit të rikthimit
23
Adresa IP e agjentit të rikthimit (p.sh. ndërlidhësi)
172.16.114.41
Vargu
4
Adresa MAC e klientit
27
14:d6:4d:a7:c9:55
Adresa MAC e dërguesit të paketës (klienti)
Hex
6
Mbushja e adresës së harduerit të klientit
31
Hapsirë e rezervuar. Zakonisht mbushur me zero
Â
Hex
10
Emri i hostit të serverit
41
Emri i serverit DHCP. Zakonisht nuk transmetohet
Â
Vargu
64
Emri i skedarit të nisjes
105
Emri i skedarit në server, i përdorur nga stacionet pa disqe gjatë ngarkimit
Â
Vargu
128
Magjiku cookies
235
"Numri magjik", me të cilin mund të përcaktohet gjithashtu se kjo paketë i përket protokollit DHCP
63:82:53:63
Hex
4
Opsionet DHCP. Mund të jenë në çdo rend
Numri i opsionit
236
Dec
53
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
1 â DHCPDISCOVER
3 â DHCPREQUEST
2 â DHCPOFFER
5 â DHCPACK
8 â DHCPINFORM
Gjatësia e opsionit
Â
Vlera e opsionit
1
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
1
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Dec
50
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Cila IP adresi dëshiron të marrë klienti
Â
Vlera e opsionit
4
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
172.16.134.61
Vargu
4
Â
Dec
55
Â
1
Parametrat e kërkuar të rrjetit nga klienti. Përbërja mund të jetë e ndryshme
01 â Maska e rrjetit
03 â Porti i shĂ«rbimit
06 â DNS
oc â Emri i hostit
0f â emri i domesĂ« sĂ« rrjetit
1c â adresa e kĂ«rkesĂ«s sĂ« transmetimit (broadcast)
42 â emri i serverit TFTP
79 â Rrethi static pa klasĂ«
Â
Vlera e opsionit
8
Â
1
Â
Kuptimi i opsionit
01:03:06:0c:0f:1c:42:79
Â
8
Â
Dec
82
Opsioni 53, i cili përcakton tipin e paketës DHCP
Â
Opsioni 82, nĂ« tĂ« cilin kalon adresa MAC e pajisjes â pĂ«rcjellĂ«s dhe disa vlera tĂ« tjera.
MĂ« sĂ« shpeshti â porti i switch-it ku punon klienti pĂ«rfundimtar DHCP. NĂ« kĂ«tĂ« opsion "janĂ« tĂ« pĂ«rfshira" parametrat shtesĂ«. Byte i parĂ« â numri i "nĂ«nopsioneve", byte i dytĂ« Ă«shtĂ« gjatĂ«sia e saj, mĂ« pas vlera e saj.
Në këtë rast, në opsionin 82 janë të përfshira nënopsionet:
Agent Circuit ID = 00:04:00:01:00:04, ku dy byte të fundit janë porti i klientit DHCP nga i cili erdhi kërkesa
Agent Remote ID = 00:06:c8:be:19:93:11:48 â adresa MAC e pajisjes pĂ«rcjellĂ«se DHCP
Â
Vlera e opsionit
18
Opsioni 53, i cili përcakton tipin e paketës DHCP
Â
Â
Kuptimi i opsionit
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
Â
Â
Fundi i paketës
255
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
255 simbolizon përfundimin e paketës
DHCPOFFER
Sapo serveri merr paketĂ«n DHCPDISCOVER dhe nĂ«se sheh se mund tĂ« ofrojĂ« diçka klientit nga e kĂ«rkuara, ai formon pĂ«rgjigjen â DHCPDISCOVER. PĂ«rgjigjja dĂ«rgohet nĂ« port "nga ku erdhi", si broadcast, pasi nĂ« kĂ«tĂ« moment, klienti ende nuk ka IP adresĂ«, kĂ«shtu qĂ« paketa mund tĂ« pranohet vetĂ«m nĂ«se dĂ«rgohet nĂ« mĂ«nyrĂ« tĂ« pĂ«rgjithshme. Klienti e njeh qĂ« kjo Ă«shtĂ« njĂ« paketĂ« pĂ«r tĂ« pĂ«rmes adresĂ«s sĂ« tij MAC brenda paketĂ«s, si dhe numrit tĂ« transaksionit qĂ« ai gjeneron nĂ« momentin e krijimit tĂ« paketĂ«s sĂ« parĂ«.
Tabela e strukturës së paketës DHCPOFFER
Pozita në paketë
Emri i vlerës (i zakonshëm)
Shembuj
Prezantimi
Byte
Shpjegim
1
Kërkesë për Nisje
1
Hex
1
Lloji i mesazhit. 1 â kĂ«rkesĂ« nga klienti pĂ«r serverin, 2 â pĂ«rgjigje nga serveri pĂ«r klientin
2
Tipi i harduerit
1
Hex
1
Lloji i adresĂ«s sĂ« harduerit, nĂ« kĂ«tĂ« protokoll, 1 â MAC
3
Gjatësia e adresës së harduerit
6
Hex
1
Gjatësia e adresës MAC të pajisjes
4
Hops
1
Hex
1
Numri i rrugëve ndërmjetëse
5
ID e Transaksionit
23:cf:de:1d
Hex
4
Identifikues unik i transaksionit. Krijohet nga klienti në fillim të operacionit të kërkesës
7
Sekondat e kaluara
0
Hex
4
Koha në sekonda që nga fillimi i procesit të marrjes së adresës
9
Flagat e Nisjes
0
Hex
2
Disa flamuj që mund të vendosen, si tregues të parametrave të protokollit. Në këtë rast, 0 - tregon llojin e kërkesës Unicast
11
Adresa IP e klientit
0.0.0.0
Vargu
4
Adresa IP e klientit (nëse ka)
15
Adresa IP e propozuar nga serveri (nëse ka)
172.16.134.61
Vargu
4
Adresa IP e serverit të njohur
19
Adresa IP e serverit (nëse e di)
0.0.0.0
Vargu
4
Adresa IP e agentit të rikthimit
23
Adresa IP e agjentit të rikthimit (p.sh. ndërlidhësi)
172.16.114.41
Vargu
4
Adresa MAC e klientit
27
14:d6:4d:a7:c9:55
Adresa MAC e dërguesit të paketës (klienti)
Hex
6
Mbushja e adresës së harduerit të klientit
31
Hapsirë e rezervuar. Zakonisht mbushur me zero
Â
Hex
10
Emri i hostit të serverit
41
Emri i serverit DHCP. Zakonisht nuk transmetohet
Â
Vargu
64
Emri i skedarit të nisjes
105
Emri i skedarit në server, i përdorur nga stacionet pa disqe gjatë ngarkimit
Â
Vargu
128
Magjiku cookies
235
"Numri magjik", me të cilin mund të përcaktohet gjithashtu se kjo paketë i përket protokollit DHCP
63:82:53:63
Hex
4
Opsionet DHCP. Mund të jenë në çdo rend
Numri i opsionit
236
Dec
53
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Opsioni 53, qĂ« pĂ«rcakton llojin e paketĂ«s DHCP 2 â DHCPOFFER
Â
Vlera e opsionit
1
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
2
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Dec
1
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Opsioni që ofron klientit DHCP maskën e rrjetit
Â
Vlera e opsionit
4
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
255.255.224.0
Vargu
4
Â
Dec
3
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Opsioni që ofron klientit DHCP portin e default
Â
Vlera e opsionit
4
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
172.16.12.1
Vargu
4
Â
Dec
6
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Opsioni që ofron klientit DHCP DNS
Â
Vlera e opsionit
4
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
8.8.8.8
Vargu
4
Â
Dec
51
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Koha e jetës së parametrave të dhënë në sekonda, pas së cilës klienti DHCP duhet të kërkojë ato përsëri
Â
Vlera e opsionit
4
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
86400
Opsioni 53, i cili përcakton tipin e paketës DHCP
4
Â
Dec
82
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Opsioni 82, përsërit atë që erdhi në DHCPDISCOVER
Â
Vlera e opsionit
18
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Opsioni 53, i cili përcakton tipin e paketës DHCP
18
Â
Fundi i paketës
255
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
255 simbolizon përfundimin e paketës
DHCPREQUEST
Pas marrjes së DHCPOFFER, klienti formon një paketë me kërkesë për parametrat e rrjetit jo për të gjithë serverët DHCP në rrjet, por vetëm për një të caktuar, oferta DHCPOFFER e të cilit i pëlqeu më shumë. Kriteret "pëlqyeshmërisë" mund të jenë të ndryshme dhe varen nga implementimi i klientit DHCP. Marrësi i kërkesës tregohet përmes adresës MAC të serverit DHCP. Gjithashtu, paketa DHCPREQUEST mund të dërgohet nga klienti edhe pa formimin e mëparshëm DHCPDISCOVER, nëse adresa IP e serverit ishte marrë më parë.
Tabela e strukturës së paketës DHCPREQUEST
Pozita në paketë
Emri i vlerës (i zakonshëm)
Shembuj
Prezantimi
Byte
Shpjegim
1
Kërkesë për Nisje
1
Hex
1
Lloji i mesazhit. 1 â kĂ«rkesĂ« nga klienti pĂ«r serverin, 2 â pĂ«rgjigje nga serveri pĂ«r klientin
2
Tipi i harduerit
1
Hex
1
Lloji i adresĂ«s sĂ« harduerit, nĂ« kĂ«tĂ« protokoll, 1 â MAC
3
Gjatësia e adresës së harduerit
6
Hex
1
Gjatësia e adresës MAC të pajisjes
4
Hops
1
Hex
1
Numri i rrugëve ndërmjetëse
5
ID e Transaksionit
23:cf:de:1d
Hex
4
Identifikues unik i transaksionit. Krijohet nga klienti në fillim të operacionit të kërkesës
7
Sekondat e kaluara
0
Hex
4
Koha në sekonda që nga fillimi i procesit të marrjes së adresës
9
Flagat e Nisjes
8000
Hex
2
Disa flamuj që mund të vendosen, si tregues të parametrave të protokollit. Në këtë rast është vendosur "broadcast"
11
Adresa IP e klientit
0.0.0.0
Vargu
4
Adresa IP e klientit (nëse ka)
15
Adresa IP e propozuar nga serveri (nëse ka)
172.16.134.61
Vargu
4
Adresa IP e serverit të njohur
19
Adresa IP e serverit (nëse e di)
0.0.0.0
Vargu
4
Adresa IP e agentit të rikthimit
23
Adresa IP e agjentit të rikthimit (p.sh. ndërlidhësi)
172.16.114.41
Vargu
4
Adresa MAC e klientit
27
14:d6:4d:a7:c9:55
Adresa MAC e dërguesit të paketës (klienti)
Hex
6
Mbushja e adresës së harduerit të klientit
31
Hapsirë e rezervuar. Zakonisht mbushur me zero
Â
Hex
10
Emri i hostit të serverit
41
Emri i serverit DHCP. Zakonisht nuk transmetohet
Â
Vargu
64
Emri i skedarit të nisjes
105
Emri i skedarit në server, i përdorur nga stacionet pa disqe gjatë ngarkimit
Â
Vargu
128
Magjiku cookies
235
"Numri magjik", me të cilin mund të përcaktohet gjithashtu se kjo paketë i përket protokollit DHCP
63:82:53:63
Hex
4
Opsionet DHCP. Mund të jenë në çdo rend
Numri i opsionit
236
Dec
53
Opsioni 53, i cili përcakton tipin e paketës DHCP
3
Opsioni 53, qĂ« pĂ«rcakton llojin e paketĂ«s DHCP 3 â DHCPREQUEST
Â
Vlera e opsionit
1
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
3
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Dec
61
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Identifikuesi i klientit: 01 (për Ethernet) + adresa MAC e klientit
Â
Vlera e opsionit
7
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
01:2c:ab:25:ff:72:a6
Hex
7
Â
Dec
60
Opsioni 53, i cili përcakton tipin e paketës DHCP
Â
"Identifikuesi i klasës së shitësit". Në rastin tim, njofton versionin e klientit DHCP. Mundësisht, pajisje të tjera, kthejnë diçka tjetër. Windows për shembull, raporton MSFT 5.0
Â
Vlera e opsionit
11
Opsioni 53, i cili përcakton tipin e paketës DHCP
Â
Â
Kuptimi i opsionit
udhcp 0.9.8
Vargu
Â
Â
Dec
55
Â
1
Parametrat e kërkuar të rrjetit nga klienti. Përbërja mund të jetë e ndryshme
01 â Maska e rrjetit
03 â Porti i shĂ«rbimit
06 â DNS
oc â Emri i hostit
0f â emri i domesĂ« sĂ« rrjetit
1c â adresa e kĂ«rkesĂ«s sĂ« transmetimit (broadcast)
42 â emri i serverit TFTP
79 â Rrethi static pa klasĂ«
Â
Vlera e opsionit
8
Â
1
Â
Kuptimi i opsionit
01:03:06:0c:0f:1c:42:79
Â
8
Â
Dec
82
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Opsioni 82, përsërit atë që erdhi në DHCPDISCOVER
Â
Vlera e opsionit
18
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Opsioni 53, i cili përcakton tipin e paketës DHCP
18
Â
Fundi i paketës
255
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
255 simbolizon përfundimin e paketës
DHCPACK
Si një konfirmim se "po, këtë IP adresë ti ke, dhe nuk do t'ia jap askujt tjetër" nga serveri DHCP, shërben paketa në formatin DHCPACK nga serveri për klientin. Ajo gjithashtu dërgohet në mënyrë të përgjithshme. Megjithatë, në kodin e mëposhtëm të serverit DHCP të realizuar në Python, për siguri unë dyfishoj çdo kërkesë të përgjithshme duke dërguar një paketë në IP-në specifike të klientit, nëse ajo është e njohur. Dhe DHCP serveri nuk shqetësohet fare nëse paketa DHCPACK arriti te klienti. Nëse klienti nuk merr DHCPACK, pas një kohe thjesht përsëriti DHCPREQUEST
Tabela e strukturës së paketës DHCPACK
Pozita në paketë
Emri i vlerës (i zakonshëm)
Shembuj
Prezantimi
Byte
Shpjegim
1
Kërkesë për Nisje
2
Hex
1
Lloji i mesazhit. 1 â kĂ«rkesĂ« nga klienti pĂ«r serverin, 2 â pĂ«rgjigje nga serveri pĂ«r klientin
2
Tipi i harduerit
1
Hex
1
Lloji i adresĂ«s sĂ« harduerit, nĂ« kĂ«tĂ« protokoll, 1 â MAC
3
Gjatësia e adresës së harduerit
6
Hex
1
Gjatësia e adresës MAC të pajisjes
4
Hops
1
Hex
1
Numri i rrugëve ndërmjetëse
5
ID e Transaksionit
23:cf:de:1d
Hex
4
Identifikues unik i transaksionit. Krijohet nga klienti në fillim të operacionit të kërkesës
7
Sekondat e kaluara
0
Hex
4
Koha në sekonda që nga fillimi i procesit të marrjes së adresës
9
Flagat e Nisjes
8000
Hex
2
Disa flamuj që mund të vendosen, si tregues të parametrave të protokollit. Në këtë rast është vendosur "broadcast"
11
Adresa IP e klientit
0.0.0.0
Vargu
4
Adresa IP e klientit (nëse ka)
15
Adresa IP e propozuar nga serveri (nëse ka)
172.16.134.61
Vargu
4
Adresa IP e serverit të njohur
19
Adresa IP e serverit (nëse e di)
0.0.0.0
Vargu
4
Adresa IP e agentit të rikthimit
23
Adresa IP e agjentit të rikthimit (p.sh. ndërlidhësi)
172.16.114.41
Vargu
4
Adresa MAC e klientit
27
14:d6:4d:a7:c9:55
Adresa MAC e dërguesit të paketës (klienti)
Hex
6
Mbushja e adresës së harduerit të klientit
31
Hapsirë e rezervuar. Zakonisht mbushur me zero
Â
Hex
10
Emri i hostit të serverit
41
Emri i serverit DHCP. Zakonisht nuk transmetohet
Â
Vargu
64
Emri i skedarit të nisjes
105
Emri i skedarit në server, i përdorur nga stacionet pa disqe gjatë ngarkimit
Â
Vargu
128
Magjiku cookies
235
"Numri magjik", me të cilin mund të përcaktohet gjithashtu se kjo paketë i përket protokollit DHCP
63:82:53:63
Hex
4
Opsionet DHCP. Mund të jenë në çdo rend
Numri i opsionit
236
Dec
53
Opsioni 53, i cili përcakton tipin e paketës DHCP
3
Opsioni 53, qĂ« pĂ«rcakton llojin e paketĂ«s DHCP 5 â DHCPACK
Â
Vlera e opsionit
1
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
5
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Dec
1
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Opsioni që ofron klientit DHCP maskën e rrjetit
Â
Vlera e opsionit
4
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
255.255.224.0
Vargu
4
Â
Dec
3
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Opsioni që ofron klientit DHCP portin e default
Â
Vlera e opsionit
4
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
172.16.12.1
Vargu
4
Â
Dec
6
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Opsioni që ofron klientit DHCP DNS
Â
Vlera e opsionit
4
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
8.8.8.8
Vargu
4
Â
Dec
51
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Koha e jetës së parametrave të dhënë në sekonda, pas së cilës klienti DHCP duhet të kërkojë ato përsëri
Â
Vlera e opsionit
4
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
86400
Opsioni 53, i cili përcakton tipin e paketës DHCP
4
Â
Dec
82
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Opsioni 82, përsërit atë që erdhi në DHCPDISCOVER
Â
Vlera e opsionit
18
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
Â
Kuptimi i opsionit
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Opsioni 53, i cili përcakton tipin e paketës DHCP
18
Â
Fundi i paketës
255
Opsioni 53, i cili përcakton tipin e paketës DHCP
1
255 simbolizon përfundimin e paketës
Instalimi
Instalimi përfshin vendosjen e moduleve python të nevojshme për punë. Supozohet se MySQL është instaluar dhe konfiguruar tashmë.
FreeBSD
pkg install python3 python3 -m ensurepip pip3 install mysql-connector
Ubuntu
sudo apt-get install python3 sudo apt-get install pip3 sudo pip3 install mysql-connector
Krijojmë Baza të Dhënash MySQL, ngarkojmë në të dumpin pydhcp.sql, duke konfiguruar skedarin e konfigurimit.
Konfigurimi
Të gjitha konfigurimet e serverit janë në një skedar me format xml. Skedari referues:
0.0.0.0
255.255.255.255
192.168.0.71
8600
1
255.255.255.0
192.168.0.1
8.8.8.8
localhost
test
test
pydhcp
option_82_hex:sw_port1:20:22
option_82_hex:sw_port2:16:18
option_82_hex:sw_mac:26:40
3
select ip,mask,router,dns from users where upper(mac)=upper('{option_82_AgentRemoteId_hex}') and upper(port)=upper('{option_82_AgentCircuitId_port_hex}')
select ip,mask,router,dns from users where upper(mac)=upper('{sw_mac}') and upper(port)=upper('{sw_port2}')
select ip,mask,router,dns from users where upper(mac)=upper('{ClientMacAddress}')
insert into history (id,dt,mac,ip,comment) values (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')Tani pak më në detaje rreth etiketave:
Seksioni dhcpserver përshkruan konfigurimet kryesore për të nisur serverin, dmth:
- host â cilin adresĂ« ip po e dĂ«gjon serveri nĂ« portin 67
- broadcast â cila ip Ă«shtĂ« bllokimi pĂ«r DHCPOFFER dhe DHCPACK
- DHCPServer â cila ip Ă«shtĂ« e serverit DHCP
- LeaseTime koha e qerasë së adresës ip të dhënë
- ThreadLimit â sa fije mund tĂ« pĂ«rpunohen njĂ«kohĂ«sisht pĂ«r paketat UDP nĂ« portin 67. Supozohet se do tĂ« ndihmojĂ« nĂ« projekte me ngarkesĂ« tĂ« lartĂ« đ
- defaultMask,defaultRouter,defaultDNS â ato qĂ« ofrohen abonentit siç Ă«shtĂ« paracaktuar, nĂ«se IP Ă«shtĂ« gjetur nĂ« bazĂ«n e tĂ« dhĂ«nave, por parametrat shtesĂ« pĂ«r tĂ« nuk janĂ« caktuar
Seksioni mysql:
host,username,password,basename â gjithçka flet pĂ«r veten. Struktura e pĂ«rafĂ«rt e bazĂ«s sĂ« tĂ« dhĂ«nave Ă«shtĂ« publikuar nĂ«
Seksioni query: këtu përshkruhen kërkesat për të marrë OFFER/ACK:
- offer_count â numri i rreshtave me kĂ«rkesa qĂ« kthejnĂ« rezultat tĂ« tillĂ« si ip,mask,router,dns
- offer_n â rreshti i kĂ«rkesĂ«s. NĂ«se kthesa Ă«shtĂ« e zbrazĂ«t, ai ekzekuton kĂ«rkesĂ«n tjetĂ«r offer
- history_sql â kĂ«rkesa qĂ« shkruan, pĂ«r shembull, nĂ« "historinĂ« e autentifikimit" pĂ«r abonentin
Në kërkesa mund të përfshihen çfarëdo variablash nga seksioni options ose opsionet nga protokolli DHCP.
Seksioni options. Këtu bëhet më interesante. Këtu mund të krijojmë variabla që mund të përdorim më vonë në seksionin query.
Për shembull:
option_82_hex:sw_port1:20:22, kjo linjë-komandë merr të gjithë linjën që ka ardhur në kërkesën DHCP për opsionin 82, në formatin hex, në intervalin nga 20 deri në 22 byte përfshirë dhe e ruan në një variablë të re sw_port1 (porti i switch-it nga ku erdhi kërkesa)
option_82_hex:sw_mac:26:40, përcaktojmë variablën sw_mac, duke marrë hex nga 26:40
Të gjitha opsionet e mundshme që mund të përdoren në kërkesa mund të shihen duke e nisur serverin me çelësin -d. Do të shohim një log të tillë:
--ka ardhur paketa DHCPINFORM në portin 67, nga 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68)
{'ClientMacAddress': '0025224ad764',
'ClientMacAddressByte': b'x00%"Jxd7d',
'HType': 'Ethernet',
'HostName': b'x91xa5xe0xa3xa5xa9-x8fx8a',
'ReqListDNS': True,
'ReqListDomainName': True,
'ReqListPerfowmRouterDiscover': True,
'ReqListRouter': True,
'ReqListStaticRoute': True,
'ReqListSubnetMask': True,
'ReqListVendorSpecInfo': 43,
'RequestedIpAddress': '0.0.0.0',
'Vendor': b'MSFT 5.0',
'chaddr': '0025224ad764',
'ciaddr': '172.30.128.13',
'flags': b'x00x00',
'giaddr': '172.30.114.25',
'gpoz': 308,
'hlen': 6,
'hops': 1,
'htype': 'MAC',
'magic_cookie': b'cx82Sc',
'op': 'DHCPINFORM',
'option12': 12,
'option53': 53,
'option55': 55,
'option60': 60,
'option61': 61,
'option82': 82,
'option_82_byte': b'x12x01x06x00x04x00x01x00x06x02x08x00'
b'x06x00x1eXx9exb2xad',
'option_82_hex': '12010600040001000602080006001e589eb2ad',
'option_82_len': 18,
'option_82_str': "b'x12x01x06x00x04x00x01x00x06x02x08x00x06x00x1eXx9exb2xad'",
'result': False,
'secs': 768,
'siaddr': '0.0.0.0',
'sw_mac': '001e589eb2ad',
'sw_port1': '06',
'xidbyte': b'<x89}x8c',
'xidhex': '3c897d8c',
'yiaddr': '0.0.0.0'}Prandaj, mund të mbështjellim çdo variabël me {} dhe ajo do të përdoret në kërkesën SQL.
Le të regjistrojmë për historinë, se çfarë IP adrese mori klienti:


Nisja e serverit
./pydhcpdb.py -d -c config.xml
â d rejimi i daljes nĂ« konsolĂ« DEBUG
â c skedari konfiguruese
Analiza e fluturimeve
Dhe tani pak më në detaje rreth implementimit të serverit në Python. Kjo është e vështirë. Python është studiuar "në flutur". Shumë momente janë realizuar në stilin: "uh, si e bëra këtë që funksionon". Aspak e optimizuar, dhe janë lënë në këtë formë kryesisht për shkak të mungesës së përvojës në zhvillim në python. Do të ndalem në momentet më interesante të implementimit të serverit në "kod".
Parseri i skedarit të konfigurimit XML
Përdor modul standard Python xml.dom. Duket e thjeshtë, por gjatë implementimit e kam pasur ndjeshëm mungesën e dokumentacionit të mirë dhe shembujve në internet që përdorin këtë modul.
tree = minidom.parse(gconfig["config_file"])
mconfig=tree.getElementsByTagName("mysql")
for elem in mconfig:
gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firstChild.data
gconfig["mysql_username"]=elem.getElementsByTagName("username")[0].firstChild.data
gconfig["mysql_password"]=elem.getElementsByTagName("password")[0].firstChild.data
gconfig["mysql_basename"]=elem.getElementsByTagName("basename")[0].firstChild.data
dconfig=tree.getElementsByTagName("dhcpserver")
for elem in dconfig:
gconfig["broadcast"]=elem.getElementsByTagName("broadcast")[0].firstChild.data
gconfig["dhcp_host"]=elem.getElementsByTagName("host")[0].firstChild.data
gconfig["dhcp_LeaseTime"]=elem.getElementsByTagName("LeaseTime")[0].firstChild.data
gconfig["dhcp_ThreadLimit"]=int(elem.getElementsByTagName("ThreadLimit")[0].firstChild.data)
gconfig["dhcp_Server"]=elem.getElementsByTagName("DHCPServer")[0].firstChild.data
gconfig["dhcp_defaultMask"]=elem.getElementsByTagName("defaultMask")[0].firstChild.data
gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data
gconfig["dhcp_defaultDNS"]=elem.getElementsByTagName("defaultDNS")[0].firstChild.data
qconfig=tree.getElementsByTagName("query")
for elem in qconfig:
gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild.data
for num in range(int(gconfig["offer_count"])):
gconfig["offer_"+str(num+1)]=elem.getElementsByTagName("offer_"+str(num+1))[0].firstChild.data
gconfig["history_sql"]=elem.getElementsByTagName("history_sql")[0].firstChild.data
options=tree.getElementsByTagName("options")
for elem in options:
node=elem.getElementsByTagName("option")
for options in node:
optionsMod.append(options.firstChild.data)Multithreading
ĂuditĂ«risht, shumĂ«procesorĂ«sia nĂ« Python Ă«shtĂ« realizuar nĂ« mĂ«nyrĂ« tĂ« qartĂ« dhe tĂ« thjeshtĂ«.
def PacketWork(data,addr):
...
# realizimi i analizës së paketës së ardhur dhe përgjigjes së saj
...
while True:
data, addr = udp_socket.recvfrom(1024) # presim një paketë UDP
thread = threading.Thread(target=PacketWork, args=(data,addr,)).start() # sapo erdhi - nis në sfond funksionin e përcaktuar më parë PacketWork me parametra
while threading.active_count() > gconfig["dhcp_ThreadLimit"]:
time.sleep(1) # nëse numri i proceseve të nisur është më i madh se në konfigurim, presim derisa të bëhet më i vogëlPranimi/dërgimi i paketës DHCP
Për të kapur paketat UDP që kalojnë përmes kartës së rrjetit, duhet të "ngremë" soketin:
udp_socket = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,socket.IPPROTO_UDP) udp_socket.bind((gconfig["dhcp_host"],67))
, ku flagjet:
- AF_INET - do të thotë se formati i adresës do të jetë IP: port. Mund të jetë gjithashtu AF_UNIX - ku adresa përcaktohet nga emri i skedarit.
- SOCK_DGRAM - do të thotë se ne pranojmë jo "paketë të papërpunuar", por një që ka kaluar përmes firewall-it, dhe me një paketë të pjesërisht e prishur. Kështu, marrim vetëm paketën UDP pa "pjesën fizike" të mbështjelljes së paketës UDP. Nëse përdoret flagu SOCK_RAW, duhet gjithashtu të analizojmë dhe këtë "mbështjellje".
Dërgimi i një pakete mund të jetë si një bërthamë:
udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) # kalojmë soketin në modin e dërgimit të bërthamave
rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68)), por gjithashtu në adresën "ku erdhi paketa":
udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # kalojmë soketin në modin "shumë dëgjues"
rz=udp_socket.sendto(packetack, addr), ku SOL_SOCKET do të thotë "nivel protokolli" për aktivizimin e opsioneve,
, SO_BROADCAST është opsioni që paketa dërgohet "si bërthamë"
 , SO_REUSEADDR është opsioni që kalon soketin në modin "shumë dëgjues". Në parim, nuk është e nevojshme në këtë rast, por në një nga serverët FreeBSD, ku e testova, pa këtë opsion kodi nuk funksionoi.
Analiza e paketës DHCP
Këtu vërtet më pëlqeu Python. Doli se nga "dizajni" ai lejon të punosh mjaft lirshëm me kodin e bajtave. Duke lejuar që ai të kthehet shumë thjeshtë në vlera dixhitale, vargje dhe hex - pra ato që na duhen për të kuptuar strukturën e paketës. Për shembull, është e mundur të marrësh një gamë bajtash në HEX dhe në bajtat e thjeshtë:
res["xidhex"]=data[4:8].hex()
res["xidbyte"]=data[4:8], për të paketuar bajtët në një strukturë:
res["flags"]=pack('BB',data[10],data[11])Për të marrë IP-në nga struktura:
res["ciaddr"]=socket.inet_ntoa(pack('BBBB',data[12],data[13],data[14],data[15]));Dhe anasjelltas:
res=res+socket.inet_pton(socket.AF_INET, gconfig["dhcp_Server"])
KĂ«tu Ă«shtĂ« gjithçka đ
Burimi: habr.com
