DHCP+Mysql serveris Python

DHCP+Mysql serveris Python

Šī projekta mērķis bija:

  • MācÄ«Å”anās par DHCP IPv4 tÄ«klā
  • Python apgÅ«Å”ana (nedaudz vairāk nekā no nulles šŸ˜‰)
  • servera nomaiņa DB2DHCP (mana dakÅ”a), oriÄ£ināls Å”eit, kuru jaunajai OS samontēt kļūst arvien grÅ«tāk. Un man nepatÄ«k, ka tas ir binārs, ko nevar ā€œÅ”obrÄ«d mainÄ«tā€
  • strādājoÅ”a DHCP servera iegÅ«Å”ana ar iespēju izvēlēties abonenta IP adresi, izmantojot abonenta mac vai slēdža mac+porta kombināciju (82. iespēja)
  • cita velosipēda rakstÄ«Å”ana (Ak, Ŕī ir mana mīļākā nodarbe)
  • saņemt komentārus par jÅ«su izturÄ“Å”anos pret klubu vietnē Habrahabr (vai vēl labāk, uzaicinājumu) šŸ˜‰

Rezultāts: tas darbojas šŸ˜‰ PārbaudÄ«ts uz FreeBSD un Ubuntu OS. Teorētiski kodam var lÅ«gt darboties jebkurā OS, jo Å Ä·iet, ka kodā nav Ä«paÅ”u saiÅ”u.
UzmanÄ«gi! Ir vēl daudz kas priekŔā.

Saite uz amatieru repozitoriju "pieskarieties dzīvam".

InstalÄ“Å”anas, konfigurÄ“Å”anas un ā€œaparatÅ«ras izpētesā€ rezultāta izmantoÅ”anas process ir daudz zemāks, un tad nedaudz teorijas par DHCP protokolu. PriekÅ” manis. Un vēsturei šŸ˜‰

Nedaudz teorijas

Kas ir DHCP

Å is ir tÄ«kla protokols, kas ļauj ierÄ«cei uzzināt savu IP adresi (un citus parametrus, piemēram, vārteju, DNS utt.) no DHCP servera. PakeÅ”u apmaiņa notiek, izmantojot UDP protokolu. IerÄ«ces vispārējais darbÄ«bas princips, pieprasot tÄ«kla parametrus, ir Ŕāds:

  1. IerÄ«ce (klients) nosÅ«ta UDP apraides pieprasÄ«jumu (DHCPDISCOVER) visā tÄ«klā ar pieprasÄ«jumu "kāds, dodiet man IP adresi". Turklāt parasti (bet ne vienmēr) pieprasÄ«jums tiek saņemts no 68. porta (avota), un galamērÄ·is ir 67. ports (galamērÄ·is). Dažas ierÄ«ces arÄ« sÅ«ta paketes no 67. porta. Klienta ierÄ«ces MAC adrese ir iekļauta DHCPDISCOVER pakotnē.
  2. Visi tÄ«klā esoÅ”ie DHCP serveri (un tie var bÅ«t vairāki) veido DHCPOFFER piedāvājumu ar tÄ«kla iestatÄ«jumiem ierÄ«cei, kas nosÅ«tÄ«ja DHCPDISCOVER, un arÄ« pārraida to tÄ«klā. Identifikācija, kam Ŕī pakete ir paredzēta, ir balstÄ«ta uz klienta MAC adresi, kas norādÄ«ta iepriekÅ” DHCPDISCOVER pieprasÄ«jumā.
  3. Klients pieņem paketes ar priekÅ”likumiem tÄ«kla iestatÄ«jumiem, izvēlas pievilcÄ«gāko (kritēriji var atŔķirties, piemēram, pakeÅ”u piegādes laiks, starpceļu skaits) un veic ā€œoficiālu pieprasÄ«jumuā€ DHCPREQUEST ar tÄ«kla iestatÄ«jumiem. no DHCP servera, kas tai patÄ«k. Å ajā gadÄ«jumā pakete tiek nosÅ«tÄ«ta uz noteiktu DHCP serveri.
  4. Serveris, kurÅ” saņēma DHCPREQUEST, nosÅ«ta DHCPACK formāta paketi, kurā vēlreiz uzskaita Å”im klientam paredzētos tÄ«kla iestatÄ«jumus.

DHCP+Mysql serveris Python

Turklāt ir DHCPINFORM paketes, kas nāk no klienta un kuru mērÄ·is ir informēt DHCP serveri, ka ā€œklients ir dzÄ«vsā€ un izmanto izsniegtos tÄ«kla iestatÄ«jumus. Å Ä« servera ievieÅ”anā Ŕīs paketes tiek ignorētas.

Pakas formāts

Kopumā Ethernet pakeÅ”u rāmis izskatās apmēram Ŕādi:

DHCP+Mysql serveris Python

MÅ«su gadÄ«jumā mēs ņemsim vērā tikai datus tieÅ”i no UDP paketes satura bez OSI slāņa protokola galvenēm, proti, DHCP struktÅ«ras:

DHCPDISCOVER

Tātad ierÄ«ces IP adreses iegÅ«Å”anas process sākas ar to, ka DHCP klients nosÅ«ta apraides pieprasÄ«jumu no 68. porta uz 255.255.255.255:67. Å ajā pakotnē klients iekļauj savu MAC adresi, kā arÄ« to, ko tieÅ”i tas vēlas saņemt no DHCP servera. Iepakojuma struktÅ«ra ir aprakstÄ«ta tabulā zemāk.

DHCPDISCOVER pakeŔu struktūras tabula

Pozīcija iepakojumā
Vērtības nosaukums
Piemērs
Ievads
Baits
NoskaidroŔana

1
SāknÄ“Å”anas pieprasÄ«jums
1
Hex
1
Ziņojuma veids. 1 - pieprasījums no klienta uz serveri, 2 - atbilde no servera uz klientu

2
Aparatūras veids
1
Hex
1
Aparatūras adreses veids, Ŕajā protokolā 1 - MAC

3
Aparatūras adreses garums
6
Hex
1
Ierīces MAC adreses garums

4
Apiņi
1
Hex
1
StarpmarŔrutu skaits

5
Darījuma ID
23:cf:de:1d
Hex
4
Unikāls darījuma identifikators. To ģenerē klients pieprasījuma darbības sākumā

7
Otrais pagājis
0
Hex
4
Laiks sekundēs no adreses iegÅ«Å”anas procesa sākuma

9
Zābaku karodziņi
0
Hex
2
AtseviŔķi karodziņi, kurus var iestatÄ«t, lai norādÄ«tu protokola parametrus

11
Klienta IP adrese
0.0.0.0
String
4
Klienta IP adrese (ja tāda ir)

15
JÅ«su klienta IP adrese
0.0.0.0
String
4
Servera piedāvātā IP adrese (ja pieejama)

19
Nākamā servera IP adrese
0.0.0.0
String
4
Servera IP adrese (ja zināma)

23
Releja aģenta IP adrese
172.16.114.41
String
4
Releja aģenta (piemēram, slēdža) IP adrese

27
Klienta MAC adrese
14:d6:4d:a7:c9:55
Hex
6
PakeŔu sūtītāja (klienta) MAC adrese

31
Klienta aparatūras adreses aizpildīŔana
 
Hex
10
Rezervēta vieta. Parasti aizpilda ar nullēm

41
Servera saimniekdatora nosaukums
 
String
64
DHCP servera nosaukums. Parasti netiek pārraidīts

105
SāknÄ“Å”anas faila nosaukums
 
String
128
Faila nosaukums serverÄ«, ko sāknÄ“Å”anas laikā izmanto bezdiska stacijas

235
Burvju cepumi
63: 82: 53: 63
Hex
4
ā€œMaÄ£iskaisā€ numurs, saskaņā ar kuru, t.sk. varat noteikt, ka Ŕī pakete pieder DHCP protokolam

DHCP opcijas. Var iet jebkurā secībā

236
Opcijas numurs
53
Decembris
1
Opcija 53, kas norāda DHCP paketes veidu

1 ā€” DHCPDISCOVER
3 - DHCPREQUEST
2 ā€” DHCPPIEDĀVĀJUMS
5 - DHCPACK
8 - DHCPINFORM

 
Opcijas garums
1
Decembris
1

 
Opcijas vērtība
1
Decembris
1

 
Opcijas numurs
50
Decembris
1
Kādu IP adresi klients vēlas saņemt?

 
Opcijas garums
4
Decembris
1

 
Opcijas vērtība
172.16.134.61
String
4

 
Opcijas numurs
55
 
1
Klienta pieprasītie tīkla parametri. Sastāvs var atŔķirties

01 ā€” tÄ«kla maska
03 ā€” vārteja
06 - DNS
oc ā€” resursdatora nosaukums
0f - tīkla domēna nosaukums
1c ā€” apraides pieprasÄ«juma adrese (apraide)
42 ā€” TFTP servera nosaukums
79 - Statiskais marÅ”ruts bez klasēm

 
Opcijas garums
8
 
1

 
Opcijas vērtība
01:03:06:0c:0f:1c:42:79
 
8

 
Opcijas numurs
82
Decembris
 
82. iespēja, kas pārraida atkārtotāja ierÄ«ces MAC adresi un dažas papildu vērtÄ«bas.

Visbiežāk tas ir slēdža ports, uz kura darbojas gala DHCP klients.Å Ä« opcija satur papildu parametrus.Pirmais baits ir ā€œapakÅ”opcijasā€ numurs, otrais ir tā garums, tad tā vērtÄ«ba.

Å ajā gadÄ«jumā 82. opcijā apakÅ”opcijas ir ligzdotas:
Aģenta shēmas ID = 00:04:00:01:00:04, kur pēdējie divi baiti ir DHCP klienta ports, no kura tika saņemts pieprasījums

AÄ£enta attālais ID = 00:06:c8:be:19:93:11:48 ā€” DHCP atkārtotāja ierÄ«ces MAC adrese

 
Opcijas garums
18
Decembris
 

 
Opcijas vērtība
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Pakas beigas
255
Decembris
1
255 simbolizē paciņas beigas

DHCPPIEDĀVĀJUMS

TiklÄ«dz serveris saņem DHCPDISCOVER paketi un redz, ka var piedāvāt klientam kaut ko no pieprasÄ«tās, tad Ä£enerē tai atbildi - DHCPDISCOVER. Atbilde tiek nosÅ«tÄ«ta uz ostu ā€œno kurienes tā nācaā€, ar apraidi, jo uz doto brÄ«di klientam vēl nav IP adreses, tāpēc tas var pieņemt paketi tikai tad, ja tā tiek nosÅ«tÄ«ta ar apraidi. Klients atpazÄ«st, ka Ŕī ir viņam paredzēta pakotne, pēc viņa MAC adreses paketē, kā arÄ« darÄ«juma numura, ko viņŔ Ä£enerē pirmās pakotnes izveides laikā.

DHCPOFFER pakeŔu struktūras tabula

Pozīcija iepakojumā
Vērtības nosaukums (parasti)
Piemērs
Ievads
Baits
NoskaidroŔana

1
SāknÄ“Å”anas pieprasÄ«jums
1
Hex
1
Ziņojuma veids. 1 - pieprasījums no klienta uz serveri, 2 - atbilde no servera uz klientu

2
Aparatūras veids
1
Hex
1
Aparatūras adreses veids, Ŕajā protokolā 1 - MAC

3
Aparatūras adreses garums
6
Hex
1
Ierīces MAC adreses garums

4
Apiņi
1
Hex
1
StarpmarŔrutu skaits

5
Darījuma ID
23:cf:de:1d
Hex
4
Unikāls darījuma identifikators. To ģenerē klients pieprasījuma darbības sākumā

7
Otrais pagājis
0
Hex
4
Laiks sekundēs no adreses iegÅ«Å”anas procesa sākuma

9
Zābaku karodziņi
0
Hex
2
AtseviŔķi karodziņi, kurus var iestatÄ«t, lai norādÄ«tu protokola parametrus. Å ajā gadÄ«jumā 0 nozÄ«mē Unicast pieprasÄ«juma veidu

11
Klienta IP adrese
0.0.0.0
String
4
Klienta IP adrese (ja tāda ir)

15
JÅ«su klienta IP adrese
172.16.134.61
String
4
Servera piedāvātā IP adrese (ja pieejama)

19
Nākamā servera IP adrese
0.0.0.0
String
4
Servera IP adrese (ja zināma)

23
Releja aģenta IP adrese
172.16.114.41
String
4
Releja aģenta (piemēram, slēdža) IP adrese

27
Klienta MAC adrese
14:d6:4d:a7:c9:55
Hex
6
PakeŔu sūtītāja (klienta) MAC adrese

31
Klienta aparatūras adreses aizpildīŔana
 
Hex
10
Rezervēta vieta. Parasti aizpilda ar nullēm

41
Servera saimniekdatora nosaukums
 
String
64
DHCP servera nosaukums. Parasti netiek pārraidīts

105
SāknÄ“Å”anas faila nosaukums
 
String
128
Faila nosaukums serverÄ«, ko sāknÄ“Å”anas laikā izmanto bezdiska stacijas

235
Burvju cepumi
63: 82: 53: 63
Hex
4
ā€œMaÄ£iskaisā€ numurs, saskaņā ar kuru, t.sk. varat noteikt, ka Ŕī pakete pieder DHCP protokolam

DHCP opcijas. Var iet jebkurā secībā

236
Opcijas numurs
53
Decembris
1
53. opcija, kas nosaka DHCP 2 pakeÅ”u veidu - DHCPOFFER

 
Opcijas garums
1
Decembris
1

 
Opcijas vērtība
2
Decembris
1

 
Opcijas numurs
1
Decembris
1
Iespēja piedāvāt DHCP klientam tīkla masku

 
Opcijas garums
4
Decembris
1

 
Opcijas vērtība
255.255.224.0
String
4

 
Opcijas numurs
3
Decembris
1
Iespēja piedāvāt DHCP klientam noklusējuma vārteju

 
Opcijas garums
4
Decembris
1

 
Opcijas vērtība
172.16.12.1
String
4

 
Opcijas numurs
6
Decembris
1
Iespēja piedāvāt DHCP DNS klientam

 
Opcijas garums
4
Decembris
1

 
Opcijas vērtība
8.8.8.8
String
4

 
Opcijas numurs
51
Decembris
1
Izdoto tÄ«kla parametru kalpoÅ”anas laiks sekundēs, pēc kura DHCP klientam tie jāpieprasa vēlreiz

 
Opcijas garums
4
Decembris
1

 
Opcijas vērtība
86400
Decembris
4

 
Opcijas numurs
82
Decembris
1
82. iespēja, atkārto to, kas bija programmā DHCPDISCOVER

 
Opcijas garums
18
Decembris
1

 
Opcijas vērtība
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Decembris
18

 
Pakas beigas
255
Decembris
1
255 simbolizē paciņas beigas

DHCPREQUEST

Pēc tam, kad klients ir saņēmis DHCPOFFER, viņŔ veido paketi, pieprasot tÄ«kla parametrus nevis visiem tÄ«klā esoÅ”ajiem DHCP serveriem, bet tikai vienam konkrētam, kura DHCPOFFER piedāvājums viņam ā€œpatikaā€ visvairāk. "PatÄ«k" kritēriji var bÅ«t dažādi un atkarÄ«gi no klienta DHCP ievieÅ”anas. PieprasÄ«juma adresāts tiek norādÄ«ts, izmantojot DHCP servera MAC adresi. Tāpat klients var nosÅ«tÄ«t DHCPREQUEST paketi, iepriekÅ” neÄ£enerējot DHCPDISCOVER, ja servera IP adrese jau ir iegÅ«ta iepriekÅ”.

DHCPREQUEST pakeŔu struktūras tabula

Pozīcija iepakojumā
Vērtības nosaukums (parasti)
Piemērs
Ievads
Baits
NoskaidroŔana

1
SāknÄ“Å”anas pieprasÄ«jums
1
Hex
1
Ziņojuma veids. 1 - pieprasījums no klienta uz serveri, 2 - atbilde no servera uz klientu

2
Aparatūras veids
1
Hex
1
Aparatūras adreses veids, Ŕajā protokolā 1 - MAC

3
Aparatūras adreses garums
6
Hex
1
Ierīces MAC adreses garums

4
Apiņi
1
Hex
1
StarpmarŔrutu skaits

5
Darījuma ID
23:cf:de:1d
Hex
4
Unikāls darījuma identifikators. To ģenerē klients pieprasījuma darbības sākumā

7
Otrais pagājis
0
Hex
4
Laiks sekundēs no adreses iegÅ«Å”anas procesa sākuma

9
Zābaku karodziņi
8000
Hex
2
AtseviŔķi karodziņi, kurus var iestatÄ«t, lai norādÄ«tu protokola parametrus. Å ajā gadÄ«jumā ir iestatÄ«ta ā€œapraideā€.

11
Klienta IP adrese
0.0.0.0
String
4
Klienta IP adrese (ja tāda ir)

15
JÅ«su klienta IP adrese
172.16.134.61
String
4
Servera piedāvātā IP adrese (ja pieejama)

19
Nākamā servera IP adrese
0.0.0.0
String
4
Servera IP adrese (ja zināma)

23
Releja aģenta IP adrese
172.16.114.41
String
4
Releja aģenta (piemēram, slēdža) IP adrese

27
Klienta MAC adrese
14:d6:4d:a7:c9:55
Hex
6
PakeŔu sūtītāja (klienta) MAC adrese

31
Klienta aparatūras adreses aizpildīŔana
 
Hex
10
Rezervēta vieta. Parasti aizpilda ar nullēm

41
Servera saimniekdatora nosaukums
 
String
64
DHCP servera nosaukums. Parasti netiek pārraidīts

105
SāknÄ“Å”anas faila nosaukums
 
String
128
Faila nosaukums serverÄ«, ko sāknÄ“Å”anas laikā izmanto bezdiska stacijas

235
Burvju cepumi
63: 82: 53: 63
Hex
4
ā€œMaÄ£iskaisā€ numurs, saskaņā ar kuru, t.sk. varat noteikt, ka Ŕī pakete pieder DHCP protokolam

DHCP opcijas. Var iet jebkurā secībā

236
Opcijas numurs
53
Decembris
3
53. opcija, kas definē DHCP pakeÅ”u tipu 3 ā€” DHCPREQUEST

 
Opcijas garums
1
Decembris
1

 
Opcijas vērtība
3
Decembris
1

 
Opcijas numurs
61
Decembris
1
Klienta ID: 01 (Ehernet) + klienta MAC adrese

 
Opcijas garums
7
Decembris
1

 
Opcijas vērtība
01:2c:ab:25:ff:72:a6
Hex
7

 
Opcijas numurs
60
Decembris
 
"Pārdevēja klases identifikators". Manā gadījumā tas ziņo par DHCP klienta versiju. Varbūt citas ierīces atgriež kaut ko citu. Piemēram, Windows ziņo par MSFT 5.0

 
Opcijas garums
11
Decembris
 

 
Opcijas vērtība
udhcp 0.9.8
String
 

 
Opcijas numurs
55
 
1
Klienta pieprasītie tīkla parametri. Sastāvs var atŔķirties

01 ā€” tÄ«kla maska
03 ā€” vārteja
06 - DNS
oc ā€” resursdatora nosaukums
0f - tīkla domēna nosaukums
1c ā€” apraides pieprasÄ«juma adrese (apraide)
42 ā€” TFTP servera nosaukums
79 - Statiskais marÅ”ruts bez klasēm

 
Opcijas garums
8
 
1

 
Opcijas vērtība
01:03:06:0c:0f:1c:42:79
 
8

 
Opcijas numurs
82
Decembris
1
82. iespēja, atkārto to, kas bija programmā DHCPDISCOVER

 
Opcijas garums
18
Decembris
1

 
Opcijas vērtība
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Decembris
18

 
Pakas beigas
255
Decembris
1
255 simbolizē paciņas beigas

DHCPACK

Kā apstiprinājumu, ka ā€œjā, tā ir, Ŕī ir jÅ«su IP adrese, un es to nevienam citam neizdoÅ”uā€ no DHCP servera, tiek apkalpota pakete DHCPACK formātā no servera uz klientu. To pārraida tāpat kā citas paketes. Lai gan tālāk esoÅ”ajā kodā Python ieviestajam DHCP serverim katram gadÄ«jumam es dublēju jebkuru apraides pieprasÄ«jumu, nosÅ«tot paketi uz konkrētu klienta IP, ja tas jau ir zināms. Turklāt DHCP serverim ir pilnÄ«gi vienalga, vai DHCPACK pakete ir sasniegusi klientu. Ja klients nesaņem DHCPACK, tad pēc kāda laika tas vienkārÅ”i atkārto DHCPREQUEST

DHCPACK pakeŔu struktūras tabula

Pozīcija iepakojumā
Vērtības nosaukums (parasti)
Piemērs
Ievads
Baits
NoskaidroŔana

1
SāknÄ“Å”anas pieprasÄ«jums
2
Hex
1
Ziņojuma veids. 1 - pieprasījums no klienta uz serveri, 2 - atbilde no servera uz klientu

2
Aparatūras veids
1
Hex
1
Aparatūras adreses veids, Ŕajā protokolā 1 - MAC

3
Aparatūras adreses garums
6
Hex
1
Ierīces MAC adreses garums

4
Apiņi
1
Hex
1
StarpmarŔrutu skaits

5
Darījuma ID
23:cf:de:1d
Hex
4
Unikāls darījuma identifikators. To ģenerē klients pieprasījuma darbības sākumā

7
Otrais pagājis
0
Hex
4
Laiks sekundēs no adreses iegÅ«Å”anas procesa sākuma

9
Zābaku karodziņi
8000
Hex
2
AtseviŔķi karodziņi, kurus var iestatÄ«t, lai norādÄ«tu protokola parametrus. Å ajā gadÄ«jumā ir iestatÄ«ta ā€œapraideā€.

11
Klienta IP adrese
0.0.0.0
String
4
Klienta IP adrese (ja tāda ir)

15
JÅ«su klienta IP adrese
172.16.134.61
String
4
Servera piedāvātā IP adrese (ja pieejama)

19
Nākamā servera IP adrese
0.0.0.0
String
4
Servera IP adrese (ja zināma)

23
Releja aģenta IP adrese
172.16.114.41
String
4
Releja aģenta (piemēram, slēdža) IP adrese

27
Klienta MAC adrese
14:d6:4d:a7:c9:55
Hex
6
PakeŔu sūtītāja (klienta) MAC adrese

31
Klienta aparatūras adreses aizpildīŔana
 
Hex
10
Rezervēta vieta. Parasti aizpilda ar nullēm

41
Servera saimniekdatora nosaukums
 
String
64
DHCP servera nosaukums. Parasti netiek pārraidīts

105
SāknÄ“Å”anas faila nosaukums
 
String
128
Faila nosaukums serverÄ«, ko sāknÄ“Å”anas laikā izmanto bezdiska stacijas

235
Burvju cepumi
63: 82: 53: 63
Hex
4
ā€œMaÄ£iskaisā€ numurs, saskaņā ar kuru, t.sk. varat noteikt, ka Ŕī pakete pieder DHCP protokolam

DHCP opcijas. Var iet jebkurā secībā

236
Opcijas numurs
53
Decembris
3
53. opcija, kas nosaka DHCP pakeÅ”u veidu 5 ā€” DHCPACK

 
Opcijas garums
1
Decembris
1

 
Opcijas vērtība
5
Decembris
1

 
Opcijas numurs
1
Decembris
1
Iespēja piedāvāt DHCP klientam tīkla masku

 
Opcijas garums
4
Decembris
1

 
Opcijas vērtība
255.255.224.0
String
4

 
Opcijas numurs
3
Decembris
1
Iespēja piedāvāt DHCP klientam noklusējuma vārteju

 
Opcijas garums
4
Decembris
1

 
Opcijas vērtība
172.16.12.1
String
4

 
Opcijas numurs
6
Decembris
1
Iespēja piedāvāt DHCP DNS klientam

 
Opcijas garums
4
Decembris
1

 
Opcijas vērtība
8.8.8.8
String
4

 
Opcijas numurs
51
Decembris
1
Izdoto tÄ«kla parametru kalpoÅ”anas laiks sekundēs, pēc kura DHCP klientam tie jāpieprasa vēlreiz

 
Opcijas garums
4
Decembris
1

 
Opcijas vērtība
86400
Decembris
4

 
Opcijas numurs
82
Decembris
1
82. iespēja, atkārto to, kas bija programmā DHCPDISCOVER

 
Opcijas garums
18
Decembris
1

 
Opcijas vērtība
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Decembris
18

 
Pakas beigas
255
Decembris
1
255 simbolizē paciņas beigas

UzstādīŔana

Instalācija faktiski sastāv no darbam nepiecieÅ”amo python moduļu uzstādÄ«Å”anas. Tiek pieņemts, ka MySQL jau ir instalēts un konfigurēts.

FreeBSD

pkg instalēt python3 python3 -m securepip pip3 instalēt mysql savienotāju

Ubuntu

sudo apt-get instalēt python3 sudo apt-get instalēt pip3 sudo pip3 instalēt mysql-connector

Mēs izveidojam MySQL datu bāzi, augÅ”upielādējam tajā pydhcp.sql dump un konfigurējam konfigurācijas failu.

Konfigurācija

Visi servera iestatījumi ir xml failā. Atsauces fails:

1.0 0.0.0.0 255.255.255.255 192.168.0.71 8600 1 255.255.255.0 192.168.0.1 vietējais saimnieks pārbaude pārbaude pydhcp option_8.8.8.8_hex:sw_port82:1:20 option_22_hex:sw_port82:2:16 option_18_hex:sw_mac:82:26 40 atlasiet ip,mask,router,dns no lietotājiem, kur augŔējais(mac)=augŔējais('{option_3_AgentRemoteId_hex}') un augŔējais(ports)=upper('{option_1_AgentCircuitId_port_hex}') atlasiet ip,mask,router,dns no lietotājiem, kur augŔējais(mac)=augŔējais('{sw_mac}') un augŔējais(ports)=augŔējais('{sw_port82}') atlasiet ip,mask,router,dns no lietotājiem, kur augŔējais(mac)=upper('{ClientMacAddress}') ievietot vēsturē (id,dt,mac,ip,comment) vērtÄ«bas (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Tagad sīkāk par tagiem:

Sadaļā dhcpserver ir aprakstīti pamata iestatījumi servera palaiŔanai, proti:

  • resursdators ā€” kādu IP adresi serveris klausās 67. portā
  • apraide ā€” kura IP ir pārraide DHCPOFFER un DHCPACK
  • DHCPServer - kāds ir DHCP servera IP
  • Izsniegtās IP adreses LeaseTime nomas laiks
  • ThreadLimit ā€” cik pavedienu vienlaikus darbojas, lai apstrādātu ienākoŔās UDP paketes portā 67. Tam vajadzētu palÄ«dzēt lielas slodzes projektos šŸ˜‰
  • defaultMask,defaultRouter,defaultDNS - kas pēc noklusējuma tiek piedāvāts abonentam, ja datu bāzē tiek atrasts IP, bet tam nav norādÄ«ti papildu parametri

mysql sadaļa:

resursdators, lietotājvārds, parole, bāzes nosaukums - viss runā pats par sevi. Aptuvenā datu bāzes struktūra ir publicēta GitHub

Vaicājumu sadaļa: pieprasÄ«jumi PIEDĀVĀJUMA/ATKRIEÅ ANAS saņemÅ”anai ir aprakstÄ«ti Å”eit:

  • offer_count ā€” rindu skaits ar pieprasÄ«jumiem, kas atgriež rezultātu, piemēram, ip, mask, router, dns
  • offer_n ā€” vaicājuma virkne. Ja atgrieÅ”ana ir tukÅ”a, izpilda Ŕādu piedāvājuma pieprasÄ«jumu
  • history_sql - vaicājums, kas raksta, piemēram, abonenta ā€œautorizācijas vēsturēā€

Pieprasījumos var iekļaut jebkurus mainīgos lielumus no opciju sadaļas vai opcijas no DHCP protokola.

Opciju sadaļa. Šeit tas kļūst interesantāk. Šeit mēs varam izveidot mainīgos, ko varam izmantot vēlāk vaicājumu sadaļā.

Piemēram:

option_82_hex:sw_port1:20:22

, Ŕī komandrinda aizņem visu rindu, kas tika iekļauta DHCP pieprasÄ«juma opcijā 82, heksadecimālā formātā diapazonā no 20 lÄ«dz 22 baitiem (ieskaitot), un ievieto to jaunajā mainÄ«gajā sw_port1 (slēgt portu, no kurienes tika saņemts pieprasÄ«jums)

option_82_hex:sw_mac:26:40

, definējiet sw_mac mainīgo, ņemot hex no diapazona 26:40

JÅ«s varat redzēt visas iespējamās opcijas, kuras var izmantot vaicājumos, startējot serveri ar slēdzi -d. Mēs redzēsim kaut ko lÄ«dzÄ«gu Å”im žurnālam:

-- DHCPINFORM pakete ieradās 67. portā no 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress'B,0025224'764CAddress'00t,7'91 ': b'x5 0%"Jxd3d" , ' HType': 'Ethernet', 'HostName': b'x5xa9xe8xa8xa43xa0.0.0.0-x5.0fx0025224a', 'ReqListDNS': True, 'ReqListDomainName': True, 'ReqListPerfowmRouter': TrustL:Discover''Req ReqListStaticRoute': patiess, 'ReqListSubnetM ask': True, 'ReqListVendorSpecInfo': 764, 'RequestedIpAddress': '172.30.128.13', 'Vendor': b'MSFT 00', 'chaddr': '00ad172.30.114.25'dr'308', 6. , 'flags': b'x1x82', 'giaddr': '12', 'gpoz': 12, 'hlen': 53, 'hops': 53, 'htype': 'MAC', 'magic_cookie': b'cx55Sc ', 'op': 'DHCPINFORM', 'opcija 55': 60, 'opcija 60': 61, 'opcija 61': 82, 'opcija 82': 82, 'opcija 12': 01, 'opcija06': 00 option_04_byte': b'x00x01x00x06x02x08x00x06x00x1x9x2' b'x82x12010600040001000602080006001x589eXx2exb82xad', 'opcija_18_hex': '82 'option_12_len': 01 06, 'option_00_str': "b'x04x00x01x00x06x02x08x00x06x00x1x9x2x768x0.0.0.0eXx001exb589xad'", "rezultāts": false,', '2cs 'siaddr': '1', 'sw_mac': '06e89eb8ad', 'sw_port3': '897', 'xidbyte': b'

Attiecīgi mēs varam ietīt jebkuru mainīgo {}, un tas tiks izmantots SQL vaicājumā.

Reģistrēsim vēsturei, ka klients saņēma IP adresi:

DHCP+Mysql serveris Python

DHCP+Mysql serveris Python

Servera palaiŔana

./pydhcpdb.py -d -c config.xml

ā€” d konsoles izvades režīms DEBUG
- c <faila nosaukums> konfigurācijas fails

Pārskats

Un tagad sÄ«kāka informācija par servera ievieÅ”anu Python. Tās ir sāpes. Python tika apgÅ«ts lidojumā. Daudzi mirkļi ir veidoti stilā "wow, man kaut kā izdevās." Nemaz nav optimizēts un atstāts Ŕādā formā galvenokārt tāpēc, ka ir maz pieredzes Python izstrādē. Es pakavÄ“Å”os pie interesantākajiem servera ievieÅ”anas aspektiem ā€œkodāā€.

XML konfigurācijas failu parsētājs

Tiek izmantots standarta Python modulis xml.dom. Å Ä·iet vienkārÅ”i, taču ievieÅ”anas laikā bija manāms skaidras dokumentācijas un piemēru trÅ«kums tÄ«klā, izmantojot Å”o moduli.

    koks = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") elementam mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("host")Child.dartast[0]. gconfig["mysql_username"]=elem.getElementsByTagName("lietotājvārds")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("parole")[0].first"g =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") elementam dconfig: gconfig["broadcast"]=elem.getElementsByTagcast.") firstChild.data gconfig["dhcp_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["dhcp_LeaseTime"]=elem.getElementsByTagName("LeaseTime")gstcon[0]. dhcp_threadlimit "] = int (elem.getElementsByTagName (" threadlimit ") [0] .firstchild.data) gconfig [" dhcp_server "] = elem.getElementsByTagname (" dhcpServer ") =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig " defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("vaicājums") elementam qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild in. range(int(gconfig["piedāvājuma_skaits"])): gconfig["piedāvājums_"+str(num+0)]=elem.getElementsByTagName("piedāvājums"+str(num+0))[1].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[1].firstChild.data options=tree.getElementsByTagName("options") elementam opcijās: node=elem.getElementsByTagName("option") opcijām node : opcijasMod.append(options.firstChild.data)

Daudzpavedienu veidoŔana

Savādi, bet vairāku pavedienu veidoŔana Python ir ieviesta ļoti skaidri un vienkārŔi.

def PacketWork(data,addr): ... # ienākoŔās paketes parsÄ“Å”anas un atbildes uz to ievieÅ”ana ... while True: data, addr = udp_socket.recvfrom(1024) # gaida UDP paketes pavedienu = threading.Thread( target=PacketWork , args=(data,addr,)).start() # kā tas bija - palaižam fonā iepriekÅ” definēto PacketWork funkciju ar parametriem, kamēr threading.active_count() >gconfig["dhcp_ThreadLimit"]: laiks. miega(1) # ja numurs Jau darbojas vairāk pavedienu nekā iestatÄ«jumos, mēs gaidām, kamēr to bÅ«s mazāk

Saņemt/nosūtīt DHCP paketi

Lai pārtvertu UDP paketes, kas nāk caur tīkla karti, jums ir "jāpaceļ" ligzda:

udp_socket = ligzda.ligzda(ligzda.AF_INET,ligzda.SOCK_DGRAM,ligzda.IPPROTO_UDP) udp_socket.bind((gconfig["dhcp_host"],67))

, kur karogi ir:

  • AF_INET - nozÄ«mē, ka adreses formāts bÅ«s IP: ports. Var bÅ«t arÄ« AF_UNIX ā€” kur adrese tiek norādÄ«ta ar faila nosaukumu.
  • SOCK_DGRAM - nozÄ«mē, ka mēs nepieņemam ā€œneapstrādātu paketiā€, bet gan tādu, kas jau ir izgājusi cauri ugunsmÅ«rim un ar daļēji apgrieztu paketi. Tie. mēs saņemam tikai UDP paketi bez UDP pakeÅ”u iesaiņojuma ā€œfiziskāā€ komponenta. Ja izmantojat karodziņu SOCK_RAW, jums bÅ«s arÄ« jāparsē Å”is ā€œiesaiņojumsā€.

PakeŔu nosūtīŔana var būt kā apraide:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #pārslēdziet ligzdu apraides režīmā rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

un uz adresi ā€œno kurienes nāca pakaā€:

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # pārslēdziet ligzdu uz vairāku klausītāju režīmu rz=udp_socket.sendto(packetack, addr)

, kur SOL_SOCKET nozÄ«mē ā€œprotokola lÄ«meniā€ opciju iestatÄ«Å”anai,

, SO_BROADCAST opciju, ka Ä·iveres pakete ir ā€œpārraideā€

  Opcija ,SO_REUSEADDR pārslēdz ligzdu uz ā€œdaudzu klausÄ«tājuā€ režīmu. Teorētiski Å”ajā gadÄ«jumā tas ir lieki, taču vienā no FreeBSD serveriem, kurā testēju, kods bez Ŕīs opcijas nedarbojās.

DHCP paketes parsēŔana

Å eit man ļoti patika Python. Izrādās, ka no kastes tas ļauj bÅ«t diezgan elastÄ«gam ar baitkodu. Ä»aujot to ļoti viegli pārtulkot decimālvērtÄ«bās, virknēs un hex - t.i. tas ir tas, kas mums patiesÄ«bā ir nepiecieÅ”ams, lai saprastu paketes struktÅ«ru. Piemēram, jÅ«s varat iegÅ«t virkni baitu HEX un tikai baitus:

    res["xidhex"]=dati[4:8].hex() res["xidbyte"]=dati[4:8]

, iesaiņojiet baitus struktūrā:

res["flags"]=pack('BB',data[10],data[11])

Iegūstiet IP no struktūras:

res["ciaddr"]=socket.inet_ntoa(pack('BBBB',data[12],data[13],data[14],dati[15]));

Un otrādi:

res=res+socket.inet_pton(ligzda.AF_INET, gconfig["dhcp_Server"])

Pagaidām tas arÄ« viss šŸ˜‰

Avots: www.habr.com

Pievieno komentāru