I-DHCP+Mysql iseva kwiPython

I-DHCP+Mysql iseva kwiPython

Injongo yale projekthi yayikuku:

  • Ukufunda nge-DHCP kwinethiwekhi ye-IPv4
  • Ukufunda iPython (ngaphezulu kancinci kunokuqala 😉)
  • indawo yomncedisi DB2DHCP (ifolokhwe yam), yoqobo apha, esiba nzima ngakumbi nangakumbi ukuhlanganisela i-OS entsha. Kwaye andithandi ukuba yinto yokubini ukuba akukho ndlela "yokutshintsha ngoku"
  • ukufumana iseva ye-DHCP esebenzayo ngokukwazi ukukhetha idilesi ye-IP yomrhumeli usebenzisa i-mac yombhalisi okanye utshintshe i-mac + port ukudibanisa (Ukhetho 82)
  • ukubhala enye ibhayisekile (Oh! lo ngumsebenzi endiwuthandayo)
  • ukufumana izimvo malunga nokubamba kwakho iklabhu kuHabrahabr (okanye ngcono, isimemo) 😉

Isiphumo:  iyasebenza 😉 Ivavanywe kwiFreeBSD kunye no-Ubuntu OS. Ngokwethiyori, ikhowudi inokucelwa ukuba isebenze phantsi kwayo nayiphi na i-OS, kuba Kubonakala ngathi akukho zibophelelo ezithile kwikhowudi.
Ngononophelo! Kuninzi okusezayo.

Ikhonkco kwindawo yokugcina abantu abangafundanga "chukumisa uphila".

Inkqubo yokufaka, ukuqwalasela kunye nokusebenzisa umphumo "wokufunda i-hardware" iphantsi kakhulu, kwaye ke ithiyori encinci malunga neprotocol yeDHCP. Ngokwam. Kwaye kwimbali 😉

Ithiyori encinci

Yintoni iDHCP

Le yinkqubo yenethiwekhi evumela isixhobo ukuba sifumane idilesi ye-IP (kunye nezinye iiparameters ezifana nesango, i-DNS, njl.) kwiseva ye-DHCP. Iipakethi zitshintshwa kusetyenziswa iprotocol ye-UDP. Umgaqo jikelele wokusebenza kwesixhobo xa ucela iiparamitha zenethiwekhi ngolu hlobo lulandelayo:

  1. Isixhobo (umxhasi) sithumela isicelo sosasazo lwe-UDP (DHCPDISCOVER) kuyo yonke inethiwekhi ngesicelo "kaloku, umntu undinike idilesi ye-IP." Ngaphezu koko, ngokuqhelekileyo (kodwa akusoloko) isicelo senzeka kwi-port 68 (umthombo), kwaye indawo ekuyiwa kuyo yi-port 67 (indawo yokuya kuyo). Ezinye izixhobo zikwathumela iipakethi ukusuka kwizibuko 67. Idilesi ye-MAC yesixhobo somthengi ibandakanyiwe ngaphakathi kwipakethi ye-DHCPDISCOVER.
  2. Zonke iiseva ze-DHCP ezikuthungelwano (kwaye zisenokuba zininzi kuzo) zenza umnikelo we-DHCPOFFER ngoseto lwenethiwekhi yesixhobo esithumele i-DHCPDISCOVER, kwaye sisasaze kwinethiwekhi. Ukuchongwa ukuba le pakethi ilungiselelwe ukuba bani kusekelwe kwidilesi ye-MAC yomthengi enikwe ngaphambili kwisicelo se-DHCPDISCOVER.
  3. Umxhasi wamkela iipakethi kunye neziphakamiso zezicwangciso zenethiwekhi, ukhetha eyona nto inomdla kakhulu (imilinganiselo ingahluka, umzekelo, ixesha lokuhanjiswa kwepakethi, inani leendlela eziphakathi), kwaye yenza "isicelo esisemthethweni" i-DHCPREQUEST kunye nezicwangciso zenethiwekhi. ukusuka kwiseva yeDHCP ithanda. Kule meko, ipakethi iya kwiseva ethile yeDHCP.
  4. Umncedisi ofumene i DHCPREQUEST ithumela i DHCPACK ifomathi yepakethe, apho iphinda idwelise izicwangciso zenethiwekhi ezijoliswe kulo mxhasi.

I-DHCP+Mysql iseva kwiPython

Ukongezelela, kukho iipakethi ze-DHCPINFORM ezivela kumxhasi, kunye nenjongo yokwazisa umncedisi we-DHCP ukuba "umxhasi uyaphila" kwaye usebenzisa izicwangciso zenethiwekhi ezikhutshiweyo. Ekuphunyezweni komncedisi, ezi pakethi azihoywa.

Ubume bepakethi

Ngokubanzi, isakhelo sepakethe ye-Ethernet ijongeka ngolu hlobo:

I-DHCP+Mysql iseva kwiPython

Kwimeko yethu, siya kuqwalasela kuphela idatha ngokuthe ngqo kwimixholo yepakethe ye-UDP, ngaphandle kweentloko zeprotocol ze-OSI, ezizezi: isakhiwo seDHCP:

I-DHCPDISCOVER

Ngoko, inkqubo yokufumana idilesi ye-IP yesixhobo iqala ngomthengi we-DHCP ukuthumela isicelo sokusasazwa kwi-port 68 ukuya kwi-255.255.255.255:67. Kule phakheji, umxhasi uquka idilesi yakhe ye-MAC, kunye nokuba yintoni kanye afuna ukuyifumana kwiseva ye-DHCP. Ulwakhiwo lwephakheji luchazwe kwitheyibhile engezantsi.

Itheyibhile yeSakhiwo sePakethe yeDHCPDISCOVER

Isikhundla kwiphakheji
Igama lexabiso
Umzekelo:
Intshayelelo
Byte
Inkcazo

1
Isicelo sokuQalisa
1
hex
1
Uhlobo lomyalezo. I-1 - isicelo esivela kumxhasi ukuya kumncedisi, i-2 - impendulo evela kumncedisi ukuya kumxhasi

2
Uhlobo lwe-Hardware
1
hex
1
Uhlobo lwedilesi ye-hardware, kule protocol 1 - MAC

3
Ubude beedilesi zehardware
6
hex
1
Ubude bedilesi ye-MAC yesixhobo

4
Hops
1
hex
1
Inani leendlela eziphakathi

5
Intengiselwano ID
23:cf:de:1d
hex
4
Isichongi sentengiselwano esisodwa. Iveliswe ngumxhasi ekuqaleni komsebenzi wesicelo

7
Okwesibini kuphelile
0
hex
4
Ixesha kwimizuzwana ukusuka ekuqaleni kwenkqubo yokufumana idilesi

9
Iiflegi zeBoot
0
hex
2
Iiflegi ezithile ezinokusetwa ukubonisa iiparamitha zeprotocol

11
Idilesi ye-IP yomxhasi
0.0.0.0
Umgca
4
Idilesi ye-IP yomxhasi (ukuba ikhona)

15
Idilesi ye-IP yomxhasi wakho
0.0.0.0
Umgca
4
Idilesi ye-IP enikezelwa ngumncedisi (ukuba ikhona)

19
Idilesi ye-IP elandelayo yeseva
0.0.0.0
Umgca
4
Idilesi ye-IP yomncedisi (ukuba iyaziwa)

23
Idilesi ye-IP yearhente yokudlulisa
172.16.114.41
Umgca
4
Idilesi ye-IP ye-arhente yokudlulisela (umzekelo, iswitshi)

27
Idilesi yeMAC yomthengi
14:d6:4d:a7:c9:55
hex
6
Idilesi ye-MAC yomthumeli wepakethi (umxhasi)

31
Idilesi yezixhobo zentsimbi yomxhasi
 
hex
10
Isihlalo esigciniweyo. Ngokuqhelekileyo izaliswe ngo-zero

41
Igama lomncedisi
 
Umgca
64
Igama leseva yeDHCP. Ngokuqhelekileyo ayidluliselwa

105
Qalisa igama lefayile
 
Umgca
128
Igama lefayile kumncedisi osetyenziswa zizitishi ezingenadiski xa uqala

235
Ikhukhi zomlingo
63: 82: 53: 63
hex
4
"Umlingo" inombolo, njengoko, kubandakanywa. ungamisela ukuba le pakethi yeyeprotocol yeDHCP

Iinketho zeDHCP. Ingaya ngayo nayiphi na iodolo

236
Inombolo yokhetho
53
Dec
1
Inketho ye-53, echaza uhlobo lwepakethe yeDHCP

1 - I-DHCPDISCOVER
3 - DHCPREQUEST
2 - DHCPOFFER
5 - I-DHCPACK
8 - DHCPINFORM

 
Ubude bokukhetha
1
Dec
1

 
Ixabiso lokukhetha
1
Dec
1

 
Inombolo yokhetho
50
Dec
1
Yeyiphi idilesi ye-IP umxhasi afuna ukuyifumana?

 
Ubude bokukhetha
4
Dec
1

 
Ixabiso lokukhetha
172.16.134.61
Umgca
4

 
Inombolo yokhetho
55
 
1
Iiparamitha zothungelwano ezicelwe ngumxhasi. Ukuqamba kunokwahluka

01 — Imaski yenethiwekhi
03 - Isango
06-DNS
oc - Igama lomamkeli
0f - igama lesizinda senethiwekhi
1c - idilesi yesicelo sosasazo (usasazo)
42 - Igama leseva ye-TFTP
79 - Indlela engatshintshiyo yeClassless

 
Ubude bokukhetha
8
 
1

 
Ixabiso lokukhetha
01:03:06:0c:0f:1c:42:79
 
8

 
Inombolo yokhetho
82
Dec
 
Inketho ye-82, ehambisa idilesi ye-MAC yesixhobo esiphindayo kunye namanye amaxabiso ongezelelweyo.

Ngokuqhelekileyo, eli lizibuko lokutshintsha apho isiphelo se-DHCP client sisebenza.Olu khetho luqulethe iiparamitha ezongezelelweyo.I-byte yokuqala linani le "suboption", okwesibini ubude bayo, ngoko ixabiso layo.

Kule meko, kukhetho lwama-82, ukhetho olusezantsi lubekwe:
I-Agent Circuit ID = 00:04:00:01:00:04, apho iibytes ezimbini zokugqibela ziyi-DHCP client port apho isicelo savela khona.

I-Agent Remote ID = 00:06:c8:be:19:93:11:48 - Idilesi ye-MAC yesixhobo sokuphinda i-DHCP

 
Ubude bokukhetha
18
Dec
 

 
Ixabiso lokukhetha
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
hex
 

 
Ukuphela kwephakheji
255
Dec
1
I-255 ibonisa ukuphela kwepakethi

I-DHCPOFFER

Ngokukhawuleza ukuba umncedisi ufumana ipakethi ye-DHCPDISCOVER kwaye ukuba ibona ukuba inokunika umxhasi into ethile ukusuka kulowo uceliweyo, ngoko ivelisa impendulo kuyo - i-DHCPDISCOVER. Impendulo ithunyelwa kwi-port "ukusuka apho ivela khona", ngokusasazwa, kuba ngalo mzuzu, umxhasi akakabi nayo idilesi ye-IP, ngoko ke unokwamkela ipakethi kuphela ukuba ithunyelwe ngosasazo. Umxhasi uyaqonda ukuba le yiphakheji yakhe ngedilesi yakhe ye-MAC ngaphakathi kwiphakheji, kunye nenombolo yentengiselwano ayivelisayo ngexesha lokudalwa kwephakheji yokuqala.

Itheyibhile yeSakhiwo sePakethe yeDHCPOFFER

Isikhundla kwiphakheji
Igama lexabiso (eliqhelekileyo)
Umzekelo:
Intshayelelo
Byte
Inkcazo

1
Isicelo sokuQalisa
1
hex
1
Uhlobo lomyalezo. I-1 - isicelo esivela kumxhasi ukuya kumncedisi, i-2 - impendulo evela kumncedisi ukuya kumxhasi

2
Uhlobo lwe-Hardware
1
hex
1
Uhlobo lwedilesi ye-hardware, kule protocol 1 - MAC

3
Ubude beedilesi zehardware
6
hex
1
Ubude bedilesi ye-MAC yesixhobo

4
Hops
1
hex
1
Inani leendlela eziphakathi

5
Intengiselwano ID
23:cf:de:1d
hex
4
Isichongi sentengiselwano esisodwa. Iveliswe ngumxhasi ekuqaleni komsebenzi wesicelo

7
Okwesibini kuphelile
0
hex
4
Ixesha kwimizuzwana ukusuka ekuqaleni kwenkqubo yokufumana idilesi

9
Iiflegi zeBoot
0
hex
2
Iiflegi ezithile ezinokusetwa ukubonisa iiparamitha zeprotocol. Kule meko, u-0 uthetha uhlobo lwesicelo se-Unicast

11
Idilesi ye-IP yomxhasi
0.0.0.0
Umgca
4
Idilesi ye-IP yomxhasi (ukuba ikhona)

15
Idilesi ye-IP yomxhasi wakho
172.16.134.61
Umgca
4
Idilesi ye-IP enikezelwa ngumncedisi (ukuba ikhona)

19
Idilesi ye-IP elandelayo yeseva
0.0.0.0
Umgca
4
Idilesi ye-IP yomncedisi (ukuba iyaziwa)

23
Idilesi ye-IP yearhente yokudlulisa
172.16.114.41
Umgca
4
Idilesi ye-IP ye-arhente yokudlulisela (umzekelo, iswitshi)

27
Idilesi yeMAC yomthengi
14:d6:4d:a7:c9:55
hex
6
Idilesi ye-MAC yomthumeli wepakethi (umxhasi)

31
Idilesi yezixhobo zentsimbi yomxhasi
 
hex
10
Isihlalo esigciniweyo. Ngokuqhelekileyo izaliswe ngo-zero

41
Igama lomncedisi
 
Umgca
64
Igama leseva yeDHCP. Ngokuqhelekileyo ayidluliselwa

105
Qalisa igama lefayile
 
Umgca
128
Igama lefayile kumncedisi osetyenziswa zizitishi ezingenadiski xa uqala

235
Ikhukhi zomlingo
63: 82: 53: 63
hex
4
"Umlingo" inombolo, njengoko, kubandakanywa. ungamisela ukuba le pakethi yeyeprotocol yeDHCP

Iinketho zeDHCP. Ingaya ngayo nayiphi na iodolo

236
Inombolo yokhetho
53
Dec
1
Inketho ye-53, echaza uhlobo lwepakethe ye-DHCP 2 - DHCPOFFER

 
Ubude bokukhetha
1
Dec
1

 
Ixabiso lokukhetha
2
Dec
1

 
Inombolo yokhetho
1
Dec
1
Inketho yokubonelela umxhasi weDHCP imaski yenethiwekhi

 
Ubude bokukhetha
4
Dec
1

 
Ixabiso lokukhetha
255.255.224.0
Umgca
4

 
Inombolo yokhetho
3
Dec
1
Ukhetho lokubonelela umxhasi weDHCP isango elimiselweyo

 
Ubude bokukhetha
4
Dec
1

 
Ixabiso lokukhetha
172.16.12.1
Umgca
4

 
Inombolo yokhetho
6
Dec
1
Inketho yokunikezela nge-DHCP kumthengi we-DNS

 
Ubude bokukhetha
4
Dec
1

 
Ixabiso lokukhetha
8.8.8.8
Umgca
4

 
Inombolo yokhetho
51
Dec
1
Ubomi beeparamitha zenethiwekhi ezikhutshiweyo ngemizuzwana, emva koko umthengi weDHCP kufuneka azicele kwakhona

 
Ubude bokukhetha
4
Dec
1

 
Ixabiso lokukhetha
86400
Dec
4

 
Inombolo yokhetho
82
Dec
1
UKhetho lwama-82, luphinda okuze ku-DHCPDISCOVER

 
Ubude bokukhetha
18
Dec
1

 
Ixabiso lokukhetha
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d: mz
Dec
18

 
Ukuphela kwephakheji
255
Dec
1
I-255 ibonisa ukuphela kwepakethi

ISICELO

Emva kokuba umxhasi efumene i-DHCPOFFER, wenza ipakethi ecela iiparameters zenethiwekhi kungekhona kuzo zonke iiseva ze-DHCP kwinethiwekhi, kodwa kuphela kwenye enye, i-DHCPOFFER yakhe inikezela "ithande" kakhulu. Iikhrayitheriya "ezifanayo" zinokwahluka kwaye zixhomekeke ekuphunyezweni kwe-DHCP yomxhasi. Umamkeli wesicelo uchazwe kusetyenziswa idilesi ye-MAC yomncedisi we-DHCP. Kwakhona, ipakethe ye-DHCPREQUEST ingathunyelwa ngumxhasi ngaphandle kokuqala ukuvelisa i-DHCPDISCOVER, ukuba idilesi ye-IP yomncedisi sele ifunyenwe ngaphambili.

Itheyibhile yeSakhiwo sePakethe yeDHCPREQUEST

Isikhundla kwiphakheji
Igama lexabiso (eliqhelekileyo)
Umzekelo:
Intshayelelo
Byte
Inkcazo

1
Isicelo sokuQalisa
1
hex
1
Uhlobo lomyalezo. I-1 - isicelo esivela kumxhasi ukuya kumncedisi, i-2 - impendulo evela kumncedisi ukuya kumxhasi

2
Uhlobo lwe-Hardware
1
hex
1
Uhlobo lwedilesi ye-hardware, kule protocol 1 - MAC

3
Ubude beedilesi zehardware
6
hex
1
Ubude bedilesi ye-MAC yesixhobo

4
Hops
1
hex
1
Inani leendlela eziphakathi

5
Intengiselwano ID
23:cf:de:1d
hex
4
Isichongi sentengiselwano esisodwa. Iveliswe ngumxhasi ekuqaleni komsebenzi wesicelo

7
Okwesibini kuphelile
0
hex
4
Ixesha kwimizuzwana ukusuka ekuqaleni kwenkqubo yokufumana idilesi

9
Iiflegi zeBoot
8000
hex
2
Iiflegi ezithile ezinokusetwa ukubonisa iiparamitha zeprotocol. Kule meko, "usasazo" lusetiwe

11
Idilesi ye-IP yomxhasi
0.0.0.0
Umgca
4
Idilesi ye-IP yomxhasi (ukuba ikhona)

15
Idilesi ye-IP yomxhasi wakho
172.16.134.61
Umgca
4
Idilesi ye-IP enikezelwa ngumncedisi (ukuba ikhona)

19
Idilesi ye-IP elandelayo yeseva
0.0.0.0
Umgca
4
Idilesi ye-IP yomncedisi (ukuba iyaziwa)

23
Idilesi ye-IP yearhente yokudlulisa
172.16.114.41
Umgca
4
Idilesi ye-IP ye-arhente yokudlulisela (umzekelo, iswitshi)

27
Idilesi yeMAC yomthengi
14:d6:4d:a7:c9:55
hex
6
Idilesi ye-MAC yomthumeli wepakethi (umxhasi)

31
Idilesi yezixhobo zentsimbi yomxhasi
 
hex
10
Isihlalo esigciniweyo. Ngokuqhelekileyo izaliswe ngo-zero

41
Igama lomncedisi
 
Umgca
64
Igama leseva yeDHCP. Ngokuqhelekileyo ayidluliselwa

105
Qalisa igama lefayile
 
Umgca
128
Igama lefayile kumncedisi osetyenziswa zizitishi ezingenadiski xa uqala

235
Ikhukhi zomlingo
63: 82: 53: 63
hex
4
"Umlingo" inombolo, njengoko, kubandakanywa. ungamisela ukuba le pakethi yeyeprotocol yeDHCP

Iinketho zeDHCP. Ingaya ngayo nayiphi na iodolo

236
Inombolo yokhetho
53
Dec
3
Inketho ye-53, echaza uhlobo lwepakethe ye-DHCP 3 - DHCPREQUEST

 
Ubude bokukhetha
1
Dec
1

 
Ixabiso lokukhetha
3
Dec
1

 
Inombolo yokhetho
61
Dec
1
I-ID yoMthengi: 01 (ye-Ehernet) + idilesi yomxhasi we-MAC

 
Ubude bokukhetha
7
Dec
1

 
Ixabiso lokukhetha
01:2c:ab:25:ff:72:a6
hex
7

 
Inombolo yokhetho
60
Dec
 
"Isichongi seklasi yomthengisi". Kwimeko yam, ibika i-DHCP client version. Mhlawumbi ezinye izixhobo zibuyisela into eyahlukileyo. IiWindows umzekelo ingxelo MSFT 5.0

 
Ubude bokukhetha
11
Dec
 

 
Ixabiso lokukhetha
udhcp 0.9.8
Umgca
 

 
Inombolo yokhetho
55
 
1
Iiparamitha zothungelwano ezicelwe ngumxhasi. Ukuqamba kunokwahluka

01 — Imaski yenethiwekhi
03 - Isango
06-DNS
oc - Igama lomamkeli
0f - igama lesizinda senethiwekhi
1c - idilesi yesicelo sosasazo (usasazo)
42 - Igama leseva ye-TFTP
79 - Indlela engatshintshiyo yeClassless

 
Ubude bokukhetha
8
 
1

 
Ixabiso lokukhetha
01:03:06:0c:0f:1c:42:79
 
8

 
Inombolo yokhetho
82
Dec
1
UKhetho lwama-82, luphinda okuze ku-DHCPDISCOVER

 
Ubude bokukhetha
18
Dec
1

 
Ixabiso lokukhetha
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d: mz
Dec
18

 
Ukuphela kwephakheji
255
Dec
1
I-255 ibonisa ukuphela kwepakethi

I-DHCPACK

Njengobungqina bokuba "ewe, kunjalo, le yidilesi yakho ye-IP, kwaye andiyi kunika nabani na ongomnye" kwiseva ye-DHCP, ipakethe kwifomathi ye-DHCPACK esuka kumncedisi ukuya kumxhasi okhonzayo. Ithunyelwa kusasazo njengezinye iipakethi. Nangona, kwikhowudi engezantsi yomncedisi we-DHCP ophunyezwe kwi-Python, nje ukuba, ndiphinda ndiphindaphinda nayiphi na isicelo sokusasazwa ngokuthumela ipakethe kwi-IP yomxhasi othile, ukuba sele iyaziwa. Ngaphezu koko, umncedisi we-DHCP akakhathali konke konke ukuba ipakethi yeDHCPACK ifikelele kumxhasi. Ukuba umxhasi akayifumani i-DHCPACK, emva kwexesha iphinda i-DHCPREQUEST

Itheyibhile yeSakhiwo sePakethe yeDHCPACK

Isikhundla kwiphakheji
Igama lexabiso (eliqhelekileyo)
Umzekelo:
Intshayelelo
Byte
Inkcazo

1
Isicelo sokuQalisa
2
hex
1
Uhlobo lomyalezo. I-1 - isicelo esivela kumxhasi ukuya kumncedisi, i-2 - impendulo evela kumncedisi ukuya kumxhasi

2
Uhlobo lwe-Hardware
1
hex
1
Uhlobo lwedilesi ye-hardware, kule protocol 1 - MAC

3
Ubude beedilesi zehardware
6
hex
1
Ubude bedilesi ye-MAC yesixhobo

4
Hops
1
hex
1
Inani leendlela eziphakathi

5
Intengiselwano ID
23:cf:de:1d
hex
4
Isichongi sentengiselwano esisodwa. Iveliswe ngumxhasi ekuqaleni komsebenzi wesicelo

7
Okwesibini kuphelile
0
hex
4
Ixesha kwimizuzwana ukusuka ekuqaleni kwenkqubo yokufumana idilesi

9
Iiflegi zeBoot
8000
hex
2
Iiflegi ezithile ezinokusetwa ukubonisa iiparamitha zeprotocol. Kule meko, "usasazo" lusetiwe

11
Idilesi ye-IP yomxhasi
0.0.0.0
Umgca
4
Idilesi ye-IP yomxhasi (ukuba ikhona)

15
Idilesi ye-IP yomxhasi wakho
172.16.134.61
Umgca
4
Idilesi ye-IP enikezelwa ngumncedisi (ukuba ikhona)

19
Idilesi ye-IP elandelayo yeseva
0.0.0.0
Umgca
4
Idilesi ye-IP yomncedisi (ukuba iyaziwa)

23
Idilesi ye-IP yearhente yokudlulisa
172.16.114.41
Umgca
4
Idilesi ye-IP ye-arhente yokudlulisela (umzekelo, iswitshi)

27
Idilesi yeMAC yomthengi
14:d6:4d:a7:c9:55
hex
6
Idilesi ye-MAC yomthumeli wepakethi (umxhasi)

31
Idilesi yezixhobo zentsimbi yomxhasi
 
hex
10
Isihlalo esigciniweyo. Ngokuqhelekileyo izaliswe ngo-zero

41
Igama lomncedisi
 
Umgca
64
Igama leseva yeDHCP. Ngokuqhelekileyo ayidluliselwa

105
Qalisa igama lefayile
 
Umgca
128
Igama lefayile kumncedisi osetyenziswa zizitishi ezingenadiski xa uqala

235
Ikhukhi zomlingo
63: 82: 53: 63
hex
4
"Umlingo" inombolo, njengoko, kubandakanywa. ungamisela ukuba le pakethi yeyeprotocol yeDHCP

Iinketho zeDHCP. Ingaya ngayo nayiphi na iodolo

236
Inombolo yokhetho
53
Dec
3
Inketho ye-53, echaza uhlobo lwepakethe ye-DHCP 5 - DHCPACK

 
Ubude bokukhetha
1
Dec
1

 
Ixabiso lokukhetha
5
Dec
1

 
Inombolo yokhetho
1
Dec
1
Inketho yokubonelela umxhasi weDHCP imaski yenethiwekhi

 
Ubude bokukhetha
4
Dec
1

 
Ixabiso lokukhetha
255.255.224.0
Umgca
4

 
Inombolo yokhetho
3
Dec
1
Ukhetho lokubonelela umxhasi weDHCP isango elimiselweyo

 
Ubude bokukhetha
4
Dec
1

 
Ixabiso lokukhetha
172.16.12.1
Umgca
4

 
Inombolo yokhetho
6
Dec
1
Inketho yokunikezela nge-DHCP kumthengi we-DNS

 
Ubude bokukhetha
4
Dec
1

 
Ixabiso lokukhetha
8.8.8.8
Umgca
4

 
Inombolo yokhetho
51
Dec
1
Ubomi beeparamitha zenethiwekhi ezikhutshiweyo ngemizuzwana, emva koko umthengi weDHCP kufuneka azicele kwakhona

 
Ubude bokukhetha
4
Dec
1

 
Ixabiso lokukhetha
86400
Dec
4

 
Inombolo yokhetho
82
Dec
1
UKhetho lwama-82, luphinda okuze ku-DHCPDISCOVER

 
Ubude bokukhetha
18
Dec
1

 
Ixabiso lokukhetha
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d: mz
Dec
18

 
Ukuphela kwephakheji
255
Dec
1
I-255 ibonisa ukuphela kwepakethi

isicwangciso

Ufakelo lubandakanya ukufaka iimodyuli zepython eziyimfuneko emsebenzini. Kucingelwa ukuba i-MySQL sele ifakiwe kwaye iqwalaselwe.

FreeBSD

pkg faka ipython3
python3 -m surepip
pip3 faka i-mysql-connector

Ubuntu

sudo apt-fumana ukufaka ipython3
sudo apt-fumana ukufaka ipip3
sudo pip3 faka i-mysql-isidibanisi

Senza i-database ye-MySQL, layisha i-pydhcp.sql yokulahla kuyo, kwaye ulungise ifayile yokucwangcisa.

Isimo

Zonke iisetingi zeseva zikwifayile ye-xml. Ifayile yeReferensi:


    
1.0
        0.0.0.0
        255.255.255.255
192.168.0.71
8600
        1
        255.255.255.0
        192.168.0.1
    
    
        yasekhaya
uvavanyo
test
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
khetha ip,mask,router,dns kubasebenzisi apho upper(mac)=upper('{option_3_AgentRemoteId_hex}') kunye upper(port)=upper('{option_1_AgentCircuitId_port_hex}')
        khetha ip,imask,router,dns kubasebenzisi apho upper(mac)=upper('{sw_mac}') kunye upper(port)=upper('{sw_port82}')
        khetha ip,mask,router,dns kubasebenzisi apho upper(mac)=upper('{ClientMacAddress}')
faka kwimbali (id,dt,mac,ip,comment) amaxabiso (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')
    

Ngoku kwiinkcukacha ezithe vetshe kwiithegi:

Icandelo le-dhcpserver lichaza izicwangciso ezisisiseko zokuqalisa umncedisi, ezizezi:

  • umamkeli - yeyiphi idilesi ye-IP umncedisi ayimameleyo kwizibuko 67
  • usasazo - apho i-ip lusasazo lwe-DHCPOFFER kunye ne-DHCPACK
  • Iseva ye-DHCPS - yintoni i-ip yomncedisi we-DHCP
  • Ixesha lokuqeshwa kwe-LeaseTime ledilesi ye-IP ekhutshiweyo
  • I-ThreadLimit - zingaphi iintambo ezisebenza ngaxeshanye ukucubungula iipakethi ze-UDP ezingenayo kwi-port 67. Ifanele ukunceda kwiiprojekthi zomthwalo ophezulu 😉
  • defaultMask,defaultRouter,defaultDNS - yintoni enikezelwa kubabhalisi ngokungagqibekanga ukuba iIP ifunyenwe kwisiseko sedatha, kodwa iiparameters ezongezelelweyo azikhankanywanga kuyo.

icandelo le-mysql:

umamkeli, igama lomsebenzisi, igama lokugqitha, igama lesiseko - yonke into iyathetha ngokwayo. Ulwakhiwo oluqikelelweyo lwesiseko sedatha lufakwe kwi GitHub

Icandelo lombuzo: izicelo zokufumana i-OFFER/ACK zichazwe apha:

  • offer_count - inani lemigca enezicelo ezibuyisela iziphumo njenge ip,mask,router,dns
  • offer_n - umtya wombuzo. Ukuba imbuyekezo ayinanto, yenza esi sicelo silandelayo
  • history_sql - umbuzo obhalayo, umzekelo, "kwimbali yogunyaziso" kumbhalisi

Izicelo zinokubandakanya naziphi na izinto eziguquguqukayo ezivela kwicandelo lokukhetha okanye ukhetho oluvela kwiprotocol yeDHCP.

icandelo leenketho. Apha kulapho ifumana umdla ngakumbi. Apha singenza izinto eziguquguqukayo esinokuzisebenzisa kamva kwicandelo lombuzo.

Umzekelo:

option_82_hex:sw_port1:20:22

, lo mgca womyalelo uthatha umgca opheleleyo oze kwisicelo se-DHCP ukhetho 82, kwifomathi ye-hex, kuluhlu olusuka kwi-20 ukuya kwi-22 bytes equkiweyo kwaye ibeka kwi-sw_port1 entsha (tshintsha izibuko ukusuka apho isicelo sivela khona)

option_82_hex:sw_mac:26:40

, chaza i-sw_mac variable, ithatha i-hex kuluhlu lwe-26:40

Ungabona zonke iinketho ezinokuthi zisetyenziswe kwimibuzo ngokuqala umncedisi nge- -d switch. Siza kubona into efana nale log:

--ipakethi ye-DHCPINFORM ifike kwi-port 67, ukusuka ku-0025224ad764, b'x91xa5xe0xa3xa5xa9-x8fx8a', ('172.30.114.25', 68)
{'ClientMacAddress': '0025224ad764',
 'ClientMacAddressByte': b'x00%"Jxd7d',
 'Uhlobo': 'Ethernet',
 'Igama Lomamkeli': b'x91xa5xe0xa3xa5xa9-x8fx8a',
 'ReqListDNS': Yinyani,
 'ReqListDomainName': Yinyani,
 'ReqListPerfowmRouterDiscover': Yinyani,
 'ReqListRouter': Yinyani,
 'ReqListStaticRoute': Yinyani,
 'ReqListSubnetMask': Yinyani,
 'ReqListVendorSpecInfo': 43,
 'Idilesi ye-Ip eceliweyo': '0.0.0.0',
 'Umthengisi': b'MSFT 5.0',
 'chaddr': '0025224ad764',
 'ciaddr': '172.30.128.13',
 'iiflegi': b'x00x00',
 'giaddr': '172.30.114.25',
 'gpoz': 308,
 'ntle': 6,
 'ihops': 1,
 'htype': 'MAC',
 'icookie_yomlingo': b'cx82Sc',
 'op': 'DHCPINFORM',
 'Ukhetho12': 12,
 'Ukhetho53': 53,
 'Ukhetho55': 55,
 'Ukhetho60': 60,
 'Ukhetho61': 61,
 'Ukhetho82': 82,
 'option_82_byte': b'x12x01x06x00x04x00x01x00x06x02x08x00'
                   b'x06x00x1eXx9exb2xad',
 'option_82_hex': '12010600040001000602080006001e589eb2ad',
 'option_82_len': 18,
 'option_82_str': "b'x12x01x06x00x04x00x01x00x06x02x08x00x06x00x1eXx9exb2xad'",
 'isiphumo': Bubuxoki,
 'imizuzwana': 768,
 'siaddr': '0.0.0.0',
 'sw_mac': '001e589eb2ad',
 'sw_port1': '06',
 'xidbyte': b'<x89}x8c',
 'xidhex': '3c897d8c',
 'yiaddr': '0.0.0.0'}

Ngokufanelekileyo, sinokusonga nayiphi na into eguquguqukayo kwi- {} kwaye iya kusetyenziswa kumbuzo we-SQL.

Masirekhode kwimbali ukuba umxhasi ufumene idilesi ye-IP:

I-DHCP+Mysql iseva kwiPython

I-DHCP+Mysql iseva kwiPython

Ukuqala kweseva

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

— d console imo yokuphuma DEBUG
- c ifayile yoqwalaselo

Ukuxubusha

Kwaye ngoku iinkcukacha ezingakumbi malunga nokuphumeza iseva kwiPython. Yintlungu. I-Python yafundwa kwimpukane. Amaxesha amaninzi enziwa ngendlela ethi "wow, ngandlela thile ndiyenze yasebenza." Ayilungiswanga kwaphela, kwaye ishiywe kule fomu ikakhulu ngenxa yamava amancinci kuphuhliso lwepython. Ndiya kuhlala kwimiba enomdla kakhulu yokuphunyezwa komncedisi kwi "code".

XML isahluli sefayile yoqwalaselo

Imodyuli eqhelekileyo yePython xml.dom iyasetyenziswa. Kubonakala kulula, kodwa ngexesha lokuphunyezwa bekukho ukunqongophala okucacileyo kwamaxwebhu acacileyo kunye nemizekelo kuthungelwano usebenzisa le modyuli.

    umthi = minidom.parse(gconfig["config_file"])
    mconfig=tree.getElementsByTagName("mysql")
    yeelem kwi-mconfig:
        gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firstChild.data
        gconfig["mysql_igama lomsebenzisi"]=elem.getElementsByTagName("igama lomsebenzisi")[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")
    yeelem kwi-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")
    yeelem kwi qconfig:
        gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild.data
        ngenani kuluhlu (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("iinketho")
    yeelem kwiinketho:
        node=elem.getElementsByTagName("ukhetho")
        kwiinketho kwinowudi:
            iinkethoMod.append(options.firstChild.data)

Multithreading

Okungaqhelekanga ngokwaneleyo, ukuphindaphinda okuninzi kwiPython kuphunyezwa ngokucacileyo kwaye ngokulula.

def PacketWork(data,addr):
...
# ukuphunyezwa kokwahlulahlula ipakethi engenayo kunye nokuphendula kuyo
...


ngelixa Yinyani:
    data, addr = udp_socket.recvfrom(1024) # elinde ipakethi ye-UDP
    umsonto = ukuthunga.Umsonto(thagethi=PacketWork, args=(data,addr,)).start() # njengoko yavelayo - siqalisa umsebenzi wePacketWork ochazwe ngaphambili ngeeparamitha ngasemva.
    ngelixa uthungela.active_count() >gconfig["dhcp_ThreadLimit"]:
       ixesha.yolala(1) # ukuba inani lemisonto esele libaleka likhulu kuneseto, linda de zibe mbalwa.

Fumana / thumela ipakethe yeDHCP

Ukuze uthintele iipakethi ze-UDP eziza ngekhadi lenethiwekhi, kufuneka "unyuse" isokhethi:

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

, apho zikhoyo iiflegi:

  • AF_INET - ithetha ukuba ifomathi yedilesi iya kuba yi-IP: port. Kusenokubakho AF_UNIX - apho idilesi inikwe igama lefayile.
  • I-SOCK_DGRAM - ithetha ukuba asamkeli "ipakethi eluhlaza", kodwa esele idlulile kwi-firewall, kunye nepakethi elungiswe kancinci. Ezo. sifumana kuphela ipakethe ye-UDP ngaphandle kwecandelo "lomzimba" le-UDP wrapper yepakethi. Ukuba usebenzisa i-SOCK_RAW iflegi, kuya kufuneka kwakhona ucazulule le "wrapper".

Ukuthumela ipakethi kunokufana nosasazo:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #tshintsha isiseko kwimowudi yosasazo
                    rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

, nakwidilesi “apho iphakheji ivela khona”:

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # tshintshela kwimowudi "abaphulaphuli abaninzi"
                        rz=udp_socket.sendto(packetack, addr)

, apho iSOL_SOCKET ithetha “inqanaba leprotocol” yokuseta iinketho,

, SO_BROADCAST inketho yokuba iphakheji yesigcina-ntloko "isasazwe"

  ,SO_REUSEADDR inketho itshintshela kwimowudi "abaphulaphuli abaninzi". Ngokwethiyori, akuyomfuneko kule meko, kodwa kwenye yeeseva zeFreeBSD endivavanye kuyo, ikhowudi ayizange isebenze ngaphandle kolu khetho.

Ukuhlaziya ipakethi yeDHCP

Kulapho ndandiyithanda kakhulu iPython. Kuyavela ukuba ngaphandle kwebhokisi kukuvumela ukuba ube bhetyebhetye kunye ne-bytecode. Ukuvumela ukuba iguqulelwe ngokulula kakhulu kumaxabiso edesimali, imitya kunye nehex - i.e. le yeyona nto siyidinga ngokwenene ukuqonda ubume bephakheji. Ke, umzekelo, ungafumana uluhlu lwee-bytes kwi-HEX kunye nee-bytes nje:

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

, pakisha ii-bytes kwisakhiwo:

res["iiflegi"]=ipack('BB',data[10],data[11])

Fumana i-IP kwisakhiwo:

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

Kwaye ngokuchaseneyo:

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

Kuphelele apho ngoku 😉

umthombo: www.habr.com

Yongeza izimvo