Serveri DHCP+Mysql në Python

Serveri DHCP+Mysql në Python

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 DB2DHCP (forku im), origjinali kĂ«tu, 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 "të luajnë me të".

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ë:

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Serveri DHCP+Mysql në Python

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ë:

Serveri DHCP+Mysql në Python

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Ă« GitHub

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:

Serveri DHCP+Mysql në Python

Serveri DHCP+Mysql në Python

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ël

Pranimi/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

Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS đŸ”„ Bleni hostim tĂ« besueshĂ«m pĂ«r faqe me mbrojtje nga DDoS, serverĂ« VPS VDS | ProHoster