Seva ya DHCP+Mysql katika Python

Seva ya DHCP+Mysql katika Python

Madhumuni ya mradi huu yalikuwa:

  • Kujifunza kuhusu DHCP kwenye mtandao wa IPv4
  • Kujifunza Python (zaidi kidogo kuliko kutoka mwanzo 😉)
  • uingizwaji wa seva DB2DHCP (uma yangu), asili hapa, ambayo inazidi kuwa ngumu zaidi kukusanyika kwa OS mpya. Na sipendi kuwa ni binary kwamba hakuna njia ya "kubadilika hivi sasa"
  • kupata seva ya DHCP inayofanya kazi yenye uwezo wa kuchagua anwani ya IP ya mteja kwa kutumia mac ya mteja au kubadili mchanganyiko wa mlango wa mac+ (Chaguo 82)
  • kuandika baiskeli nyingine (Lo! hii ndiyo shughuli ninayopenda zaidi)
  • kupokea maoni kuhusu kukabidhiwa kwa klabu kwenye Habrahabr (au bora zaidi, mwaliko) 😉

Matokeo: inafanya kazi 😉 Ilijaribiwa kwenye FreeBSD na Ubuntu OS. Kinadharia, msimbo unaweza kuulizwa kufanya kazi chini ya OS yoyote, kwa sababu Inaonekana hakuna vifungo maalum katika nambari.
Kwa uangalifu! Kuna mengi zaidi yajayo.

Unganisha kwa hazina kwa wastaafu "gusa hai".

Mchakato wa kufunga, kusanidi na kutumia matokeo ya "kusoma vifaa" ni chini sana, na kisha nadharia kidogo kuhusu itifaki ya DHCP. Kwa ajili yangu mwenyewe. Na kwa historia 😉

Nadharia kidogo

DHCP ni nini

Hii ni itifaki ya mtandao inayoruhusu kifaa kujua anwani yake ya IP (na vigezo vingine kama vile lango, DNS, n.k.) kutoka kwa seva ya DHCP. Pakiti zinabadilishwa kwa kutumia itifaki ya UDP. Kanuni ya jumla ya uendeshaji wa kifaa wakati wa kuomba vigezo vya mtandao ni kama ifuatavyo.

  1. Kifaa (mteja) hutuma ombi la utangazaji la UDP (DHCPDISCOVER) katika mtandao wote na ombi "sawa, mtu anipe anwani ya IP." Aidha, kwa kawaida (lakini si mara zote) ombi hutokea kutoka bandari 68 (chanzo), na marudio ni bandari 67 (marudio). Baadhi ya vifaa pia hutuma pakiti kutoka bandari 67. Anwani ya MAC ya kifaa cha mteja imejumuishwa ndani ya kifurushi cha DHCPDISCOVER.
  2. Seva zote za DHCP ziko kwenye mtandao (na kunaweza kuwa na kadhaa kati yao) huunda toleo la DHCPOFFER na mipangilio ya mtandao ya kifaa kilichotuma DHCPDISCOVER, na pia kuitangaza kwenye mtandao. Utambulisho wa nani kifurushi hiki kimekusudiwa unatokana na anwani ya MAC ya mteja iliyotolewa mapema katika ombi la DHCPDISCOVER.
  3. Mteja anakubali pakiti na mapendekezo ya mipangilio ya mtandao, anachagua moja ya kuvutia zaidi (vigezo vinaweza kuwa tofauti, kwa mfano, wakati wa utoaji wa pakiti, idadi ya njia za kati), na hufanya "ombi rasmi" DHCPREQUEST na mipangilio ya mtandao. kutoka kwa seva ya DHCP inapenda. Katika kesi hii, pakiti huenda kwa seva maalum ya DHCP.
  4. Seva iliyopokea DHCPREQUEST hutuma pakiti ya umbizo la DHCPACK, ambamo inaorodhesha tena mipangilio ya mtandao iliyokusudiwa kwa mteja huyu.

Seva ya DHCP+Mysql katika Python

Kwa kuongeza, kuna pakiti za DHCPINFORM zinazotoka kwa mteja, na madhumuni yake ni kufahamisha seva ya DHCP kwamba "mteja yuko hai" na anatumia mipangilio ya mtandao iliyotolewa. Katika utekelezaji wa seva hii, pakiti hizi hazizingatiwi.

Umbizo la kifurushi

Kwa ujumla, sura ya pakiti ya Ethernet inaonekana kitu kama hiki:

Seva ya DHCP+Mysql katika Python

Kwa upande wetu, tutazingatia tu data moja kwa moja kutoka kwa yaliyomo kwenye pakiti ya UDP, bila vichwa vya itifaki vya safu ya OSI, ambayo ni muundo wa DHCP:

DHCPGUNDUA

Kwa hivyo, mchakato wa kupata anwani ya IP kwa kifaa huanza na mteja wa DHCP kutuma ombi la utangazaji kutoka bandari 68 hadi 255.255.255.255:67. Katika kifurushi hiki, mteja ni pamoja na anwani yake ya MAC, na vile vile anataka kupokea kutoka kwa seva ya DHCP. Muundo wa kifurushi umeelezewa kwenye jedwali hapa chini.

Jedwali la Muundo wa Pakiti ya DHCPDISCOVER

Nafasi kwenye kifurushi
Jina la thamani
Mfano
Utangulizi
Byte
ufafanuzi

1
Ombi la Boot
1
Hex
1
Aina ya ujumbe. 1 - ombi kutoka kwa mteja hadi seva, 2 - jibu kutoka kwa seva hadi kwa mteja

2
Aina ya vifaa
1
Hex
1
Aina ya anwani ya vifaa, katika itifaki hii 1 - MAC

3
Urefu wa anwani za maunzi
6
Hex
1
Urefu wa anwani ya MAC ya kifaa

4
Humle
1
Hex
1
Idadi ya njia za kati

5
Kitambulisho cha shughuli
23:cf:de:1d
Hex
4
Kitambulishi cha kipekee cha muamala. Imetolewa na mteja mwanzoni mwa operesheni ya ombi

7
Ya pili ilipita
0
Hex
4
Muda katika sekunde tangu mwanzo wa mchakato wa kupata anwani

9
Bendera za buti
0
Hex
2
Bendera fulani ambazo zinaweza kuwekwa ili kuonyesha vigezo vya itifaki

11
Anwani ya IP ya mteja
0.0.0.0
Kamba
4
Anwani ya IP ya Mteja (ikiwa ipo)

15
Anwani ya IP ya mteja wako
0.0.0.0
Kamba
4
Anwani ya IP inayotolewa na seva (ikiwa inapatikana)

19
Anwani ya IP ya seva inayofuata
0.0.0.0
Kamba
4
Anwani ya IP ya seva (ikiwa inajulikana)

23
Anwani ya IP ya wakala wa relay
172.16.114.41
Kamba
4
Anwani ya IP ya wakala wa relay (kwa mfano, swichi)

27
Anwani ya MAC ya mteja
14:d6:4d:a7:c9:55
Hex
6
Anwani ya MAC ya mtumaji wa pakiti (mteja)

31
Uwekaji wa anwani ya maunzi ya mteja
 
Hex
10
Kiti kilichohifadhiwa. Kawaida kujazwa na sifuri

41
Jina la mwenyeji wa seva
 
Kamba
64
Jina la seva ya DHCP. Kawaida haisambazwi

105
Boot jina la faili
 
Kamba
128
Jina la faili kwenye seva inayotumiwa na vituo visivyo na diski wakati wa kuwasha

235
Vidakuzi vya uchawi
63: 82: 53: 63
Hex
4
Nambari ya "Uchawi", kulingana na ambayo, incl. unaweza kubaini kuwa pakiti hii ni ya itifaki ya DHCP

Chaguzi za DHCP. Inaweza kwenda kwa mpangilio wowote

236
Nambari ya chaguo
53
Desemba
1
Chaguo 53, ambalo linabainisha aina ya pakiti ya DHCP

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

 
Urefu wa chaguo
1
Desemba
1

 
Thamani ya chaguo
1
Desemba
1

 
Nambari ya chaguo
50
Desemba
1
Je, mteja anataka kupokea anwani gani ya IP?

 
Urefu wa chaguo
4
Desemba
1

 
Thamani ya chaguo
172.16.134.61
Kamba
4

 
Nambari ya chaguo
55
 
1
Vigezo vya mtandao vilivyoombwa na mteja. Utunzi unaweza kutofautiana

01 - Mask ya mtandao
03 - Lango
06 - DNS
oc - Jina la mwenyeji
0f - jina la kikoa cha mtandao
1c - anwani ya ombi la utangazaji (matangazo)
42 - jina la seva ya TFTP
79 - Njia Tuli Isiyo na Darasa

 
Urefu wa chaguo
8
 
1

 
Thamani ya chaguo
01:03:06:0c:0f:1c:42:79
 
8

 
Nambari ya chaguo
82
Desemba
 
Chaguo 82, ambayo hutuma anwani ya MAC ya kifaa cha kurudia na maadili mengine ya ziada.

Mara nyingi, hii ni bandari ya kubadili ambayo mteja wa mwisho wa DHCP anaendesha. Chaguo hili lina vigezo vya ziada. Byte ya kwanza ni nambari ya "suboption", pili ni urefu wake, kisha thamani yake.

Katika kesi hii, katika chaguo 82, chaguzi ndogo huwekwa:
Agent Circuit ID = 00:04:00:01:00:04, ambapo baiti mbili za mwisho ni mlango wa mteja wa DHCP ambapo ombi lilitoka

Kitambulisho cha Mbali cha Wakala = 00:06:c8:be:19:93:11:48 - Anwani ya MAC ya kifaa cha kurudia DHCP

 
Urefu wa chaguo
18
Desemba
 

 
Thamani ya chaguo
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Mwisho wa kifurushi
255
Desemba
1
255 inaashiria mwisho wa pakiti

DHCPOFFER

Mara tu seva inapopokea kifurushi cha DHCPDISCOVER na ikiona kwamba inaweza kumpa mteja kitu kutoka kwa ile iliyoombwa, basi hutokeza jibu kwa hilo - DHCPDISCOVER. Jibu linatumwa kwenye bandari "kutoka wapi", kwa matangazo, kwa sababu kwa wakati huu, mteja bado hana anwani ya IP, kwa hivyo inaweza tu kukubali pakiti ikiwa inatumwa na matangazo. Mteja anatambua kuwa hii ni kifurushi chake kwa anwani yake ya MAC ndani ya kifurushi, na pia nambari ya muamala ambayo hutoa wakati kifurushi cha kwanza kinaundwa.

Jedwali la Muundo wa Pakiti ya DHCPOFFER

Nafasi kwenye kifurushi
Jina la thamani (kawaida)
Mfano
Utangulizi
Byte
ufafanuzi

1
Ombi la Boot
1
Hex
1
Aina ya ujumbe. 1 - ombi kutoka kwa mteja hadi seva, 2 - jibu kutoka kwa seva hadi kwa mteja

2
Aina ya vifaa
1
Hex
1
Aina ya anwani ya vifaa, katika itifaki hii 1 - MAC

3
Urefu wa anwani za maunzi
6
Hex
1
Urefu wa anwani ya MAC ya kifaa

4
Humle
1
Hex
1
Idadi ya njia za kati

5
Kitambulisho cha shughuli
23:cf:de:1d
Hex
4
Kitambulishi cha kipekee cha muamala. Imetolewa na mteja mwanzoni mwa operesheni ya ombi

7
Ya pili ilipita
0
Hex
4
Muda katika sekunde tangu mwanzo wa mchakato wa kupata anwani

9
Bendera za buti
0
Hex
2
Bendera fulani ambazo zinaweza kuwekwa ili kuonyesha vigezo vya itifaki. Katika kesi hii, 0 inamaanisha aina ya ombi la Unicast

11
Anwani ya IP ya mteja
0.0.0.0
Kamba
4
Anwani ya IP ya Mteja (ikiwa ipo)

15
Anwani ya IP ya mteja wako
172.16.134.61
Kamba
4
Anwani ya IP inayotolewa na seva (ikiwa inapatikana)

19
Anwani ya IP ya seva inayofuata
0.0.0.0
Kamba
4
Anwani ya IP ya seva (ikiwa inajulikana)

23
Anwani ya IP ya wakala wa relay
172.16.114.41
Kamba
4
Anwani ya IP ya wakala wa relay (kwa mfano, swichi)

27
Anwani ya MAC ya mteja
14:d6:4d:a7:c9:55
Hex
6
Anwani ya MAC ya mtumaji wa pakiti (mteja)

31
Uwekaji wa anwani ya maunzi ya mteja
 
Hex
10
Kiti kilichohifadhiwa. Kawaida kujazwa na sifuri

41
Jina la mwenyeji wa seva
 
Kamba
64
Jina la seva ya DHCP. Kawaida haisambazwi

105
Boot jina la faili
 
Kamba
128
Jina la faili kwenye seva inayotumiwa na vituo visivyo na diski wakati wa kuwasha

235
Vidakuzi vya uchawi
63: 82: 53: 63
Hex
4
Nambari ya "Uchawi", kulingana na ambayo, incl. unaweza kubaini kuwa pakiti hii ni ya itifaki ya DHCP

Chaguzi za DHCP. Inaweza kwenda kwa mpangilio wowote

236
Nambari ya chaguo
53
Desemba
1
Chaguo 53, ambayo inafafanua aina ya pakiti ya DHCP 2 - DHCPOFFER

 
Urefu wa chaguo
1
Desemba
1

 
Thamani ya chaguo
2
Desemba
1

 
Nambari ya chaguo
1
Desemba
1
Chaguo la kumpa mteja wa DHCP kinyago cha mtandao

 
Urefu wa chaguo
4
Desemba
1

 
Thamani ya chaguo
255.255.224.0
Kamba
4

 
Nambari ya chaguo
3
Desemba
1
Chaguo la kumpa mteja wa DHCP lango chaguo-msingi

 
Urefu wa chaguo
4
Desemba
1

 
Thamani ya chaguo
172.16.12.1
Kamba
4

 
Nambari ya chaguo
6
Desemba
1
Chaguo la kutoa DHCP kwa mteja wa DNS

 
Urefu wa chaguo
4
Desemba
1

 
Thamani ya chaguo
8.8.8.8
Kamba
4

 
Nambari ya chaguo
51
Desemba
1
Muda wa maisha ya vigezo vya mtandao vilivyotolewa kwa sekunde, baada ya hapo mteja wa DHCP lazima aombe tena

 
Urefu wa chaguo
4
Desemba
1

 
Thamani ya chaguo
86400
Desemba
4

 
Nambari ya chaguo
82
Desemba
1
Chaguo 82, hurudia kile kilichokuja katika DHCPDISCOVER

 
Urefu wa chaguo
18
Desemba
1

 
Thamani ya chaguo
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d: k
Desemba
18

 
Mwisho wa kifurushi
255
Desemba
1
255 inaashiria mwisho wa pakiti

OMBI LA DHC

Baada ya mteja kupokea DHCPOFFER, huunda pakiti inayoomba vigezo vya mtandao si kwa seva zote za DHCP kwenye mtandao, lakini kwa moja tu maalum, ambayo DHCPOFFER inatoa "alipenda" zaidi. Vigezo vya "kama" vinaweza kuwa tofauti na hutegemea utekelezaji wa DHCP wa mteja. Mpokeaji wa ombi amebainishwa kwa kutumia anwani ya MAC ya seva ya DHCP. Pia, pakiti ya DHCPREQUEST inaweza kutumwa na mteja bila kwanza kuzalisha DHCPDISCOVER, ikiwa anwani ya IP ya seva tayari imepatikana hapo awali.

Jedwali la Muundo wa Pakiti ya DHCPREQUEST

Nafasi kwenye kifurushi
Jina la thamani (kawaida)
Mfano
Utangulizi
Byte
ufafanuzi

1
Ombi la Boot
1
Hex
1
Aina ya ujumbe. 1 - ombi kutoka kwa mteja hadi seva, 2 - jibu kutoka kwa seva hadi kwa mteja

2
Aina ya vifaa
1
Hex
1
Aina ya anwani ya vifaa, katika itifaki hii 1 - MAC

3
Urefu wa anwani za maunzi
6
Hex
1
Urefu wa anwani ya MAC ya kifaa

4
Humle
1
Hex
1
Idadi ya njia za kati

5
Kitambulisho cha shughuli
23:cf:de:1d
Hex
4
Kitambulishi cha kipekee cha muamala. Imetolewa na mteja mwanzoni mwa operesheni ya ombi

7
Ya pili ilipita
0
Hex
4
Muda katika sekunde tangu mwanzo wa mchakato wa kupata anwani

9
Bendera za buti
8000
Hex
2
Bendera fulani ambazo zinaweza kuwekwa ili kuonyesha vigezo vya itifaki. Katika kesi hii, "matangazo" yamewekwa

11
Anwani ya IP ya mteja
0.0.0.0
Kamba
4
Anwani ya IP ya Mteja (ikiwa ipo)

15
Anwani ya IP ya mteja wako
172.16.134.61
Kamba
4
Anwani ya IP inayotolewa na seva (ikiwa inapatikana)

19
Anwani ya IP ya seva inayofuata
0.0.0.0
Kamba
4
Anwani ya IP ya seva (ikiwa inajulikana)

23
Anwani ya IP ya wakala wa relay
172.16.114.41
Kamba
4
Anwani ya IP ya wakala wa relay (kwa mfano, swichi)

27
Anwani ya MAC ya mteja
14:d6:4d:a7:c9:55
Hex
6
Anwani ya MAC ya mtumaji wa pakiti (mteja)

31
Uwekaji wa anwani ya maunzi ya mteja
 
Hex
10
Kiti kilichohifadhiwa. Kawaida kujazwa na sifuri

41
Jina la mwenyeji wa seva
 
Kamba
64
Jina la seva ya DHCP. Kawaida haisambazwi

105
Boot jina la faili
 
Kamba
128
Jina la faili kwenye seva inayotumiwa na vituo visivyo na diski wakati wa kuwasha

235
Vidakuzi vya uchawi
63: 82: 53: 63
Hex
4
Nambari ya "Uchawi", kulingana na ambayo, incl. unaweza kubaini kuwa pakiti hii ni ya itifaki ya DHCP

Chaguzi za DHCP. Inaweza kwenda kwa mpangilio wowote

236
Nambari ya chaguo
53
Desemba
3
Chaguo 53, ambayo inafafanua pakiti ya DHCP aina 3 - DHCPREQUEST

 
Urefu wa chaguo
1
Desemba
1

 
Thamani ya chaguo
3
Desemba
1

 
Nambari ya chaguo
61
Desemba
1
Kitambulisho cha Mteja: 01 (ya Ehernet) + anwani ya MAC ya mteja

 
Urefu wa chaguo
7
Desemba
1

 
Thamani ya chaguo
01:2c:ab:25:ff:72:a6
Hex
7

 
Nambari ya chaguo
60
Desemba
 
"Kitambulisho cha darasa la muuzaji". Kwa upande wangu, inaripoti toleo la mteja wa DHCP. Labda vifaa vingine vinarudisha kitu tofauti. Windows kwa mfano inaripoti MSFT 5.0

 
Urefu wa chaguo
11
Desemba
 

 
Thamani ya chaguo
udhcp 0.9.8
Kamba
 

 
Nambari ya chaguo
55
 
1
Vigezo vya mtandao vilivyoombwa na mteja. Utunzi unaweza kutofautiana

01 - Mask ya mtandao
03 - Lango
06 - DNS
oc - Jina la mwenyeji
0f - jina la kikoa cha mtandao
1c - anwani ya ombi la utangazaji (matangazo)
42 - jina la seva ya TFTP
79 - Njia Tuli Isiyo na Darasa

 
Urefu wa chaguo
8
 
1

 
Thamani ya chaguo
01:03:06:0c:0f:1c:42:79
 
8

 
Nambari ya chaguo
82
Desemba
1
Chaguo 82, hurudia kile kilichokuja katika DHCPDISCOVER

 
Urefu wa chaguo
18
Desemba
1

 
Thamani ya chaguo
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d: k
Desemba
18

 
Mwisho wa kifurushi
255
Desemba
1
255 inaashiria mwisho wa pakiti

DHCPACK

Kama uthibitisho kwamba "ndiyo, hiyo ni kweli, hii ni anwani yako ya IP, na sitaitoa kwa mtu mwingine yeyote" kutoka kwa seva ya DHCP, pakiti katika umbizo la DHCPACK kutoka kwa seva hadi kwa mteja hutumika. Inatumwa matangazo kama pakiti zingine. Ingawa, katika nambari iliyo hapa chini ya seva ya DHCP iliyotekelezwa katika Python, ikiwa tu, ninarudia ombi lolote la utangazaji kwa kutuma pakiti kwa IP ya mteja maalum, ikiwa tayari inajulikana. Zaidi ya hayo, seva ya DHCP haijali hata kidogo ikiwa pakiti ya DHCPACK imemfikia mteja. Ikiwa mteja hajapokea DHCPACK, basi baada ya muda inarudia tu DHCPREQUEST

Jedwali la Muundo wa Pakiti ya DHCPACK

Nafasi kwenye kifurushi
Jina la thamani (kawaida)
Mfano
Utangulizi
Byte
ufafanuzi

1
Ombi la Boot
2
Hex
1
Aina ya ujumbe. 1 - ombi kutoka kwa mteja hadi seva, 2 - jibu kutoka kwa seva hadi kwa mteja

2
Aina ya vifaa
1
Hex
1
Aina ya anwani ya vifaa, katika itifaki hii 1 - MAC

3
Urefu wa anwani za maunzi
6
Hex
1
Urefu wa anwani ya MAC ya kifaa

4
Humle
1
Hex
1
Idadi ya njia za kati

5
Kitambulisho cha shughuli
23:cf:de:1d
Hex
4
Kitambulishi cha kipekee cha muamala. Imetolewa na mteja mwanzoni mwa operesheni ya ombi

7
Ya pili ilipita
0
Hex
4
Muda katika sekunde tangu mwanzo wa mchakato wa kupata anwani

9
Bendera za buti
8000
Hex
2
Bendera fulani ambazo zinaweza kuwekwa ili kuonyesha vigezo vya itifaki. Katika kesi hii, "matangazo" yamewekwa

11
Anwani ya IP ya mteja
0.0.0.0
Kamba
4
Anwani ya IP ya Mteja (ikiwa ipo)

15
Anwani ya IP ya mteja wako
172.16.134.61
Kamba
4
Anwani ya IP inayotolewa na seva (ikiwa inapatikana)

19
Anwani ya IP ya seva inayofuata
0.0.0.0
Kamba
4
Anwani ya IP ya seva (ikiwa inajulikana)

23
Anwani ya IP ya wakala wa relay
172.16.114.41
Kamba
4
Anwani ya IP ya wakala wa relay (kwa mfano, swichi)

27
Anwani ya MAC ya mteja
14:d6:4d:a7:c9:55
Hex
6
Anwani ya MAC ya mtumaji wa pakiti (mteja)

31
Uwekaji wa anwani ya maunzi ya mteja
 
Hex
10
Kiti kilichohifadhiwa. Kawaida kujazwa na sifuri

41
Jina la mwenyeji wa seva
 
Kamba
64
Jina la seva ya DHCP. Kawaida haisambazwi

105
Boot jina la faili
 
Kamba
128
Jina la faili kwenye seva inayotumiwa na vituo visivyo na diski wakati wa kuwasha

235
Vidakuzi vya uchawi
63: 82: 53: 63
Hex
4
Nambari ya "Uchawi", kulingana na ambayo, incl. unaweza kubaini kuwa pakiti hii ni ya itifaki ya DHCP

Chaguzi za DHCP. Inaweza kwenda kwa mpangilio wowote

236
Nambari ya chaguo
53
Desemba
3
Chaguo la 53, ambalo linafafanua aina ya pakiti ya DHCP 5 - DHCPACK

 
Urefu wa chaguo
1
Desemba
1

 
Thamani ya chaguo
5
Desemba
1

 
Nambari ya chaguo
1
Desemba
1
Chaguo la kumpa mteja wa DHCP kinyago cha mtandao

 
Urefu wa chaguo
4
Desemba
1

 
Thamani ya chaguo
255.255.224.0
Kamba
4

 
Nambari ya chaguo
3
Desemba
1
Chaguo la kumpa mteja wa DHCP lango chaguo-msingi

 
Urefu wa chaguo
4
Desemba
1

 
Thamani ya chaguo
172.16.12.1
Kamba
4

 
Nambari ya chaguo
6
Desemba
1
Chaguo la kutoa DHCP kwa mteja wa DNS

 
Urefu wa chaguo
4
Desemba
1

 
Thamani ya chaguo
8.8.8.8
Kamba
4

 
Nambari ya chaguo
51
Desemba
1
Muda wa maisha ya vigezo vya mtandao vilivyotolewa kwa sekunde, baada ya hapo mteja wa DHCP lazima aombe tena

 
Urefu wa chaguo
4
Desemba
1

 
Thamani ya chaguo
86400
Desemba
4

 
Nambari ya chaguo
82
Desemba
1
Chaguo 82, hurudia kile kilichokuja katika DHCPDISCOVER

 
Urefu wa chaguo
18
Desemba
1

 
Thamani ya chaguo
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d: k
Desemba
18

 
Mwisho wa kifurushi
255
Desemba
1
255 inaashiria mwisho wa pakiti

Ufungaji

Usanikishaji kweli una kusanidi moduli za python muhimu kwa kazi. Inachukuliwa kuwa MySQL tayari imesakinishwa na kusanidiwa.

FreeBSD

pkg kufunga python3 python3 -m kuhakikishapip pip3 kusakinisha mysql-kontakt

Ubuntu

sudo apt-get install python3 sudo apt-get install pip3 sudo pip3 install mysql-connector

Tunaunda hifadhidata ya MySQL, kupakia utupaji wa pydhcp.sql ndani yake, na kusanidi faili ya usanidi.

Usanidi

Mipangilio yote ya seva iko kwenye faili ya xml. Faili ya marejeleo:

1.0 0.0.0.0 255.255.255.255 192.168.0.71 8600 1 255.255.255.0 192.168.0.1 mwenyeji mtihani mtihani 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 chagua ip,mask,router,dns kutoka kwa watumiaji ambapo upper(mac)=upper('{option_3_AgentRemoteId_hex}') na upper(port)=upper('{option_1_AgentCircuitId_port_hex}') chagua ip,mask,router,dns kutoka kwa watumiaji ambapo upper(mac)=upper('{sw_mac}') na upper(port)=upper('{sw_port82}') chagua ip,mask,router,dns kutoka kwa watumiaji ambapo upper(mac)=upper('{ClientMacAddress}') weka kwenye historia (id,dt,mac,ip,comment) thamani (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Sasa kwa undani zaidi juu ya vitambulisho:

Sehemu ya dhcpserver inaelezea mipangilio ya msingi ya kuanzisha seva, ambayo ni:

  • mwenyeji - seva inasikiliza anwani gani ya IP kwenye bandari 67
  • matangazo - ambayo ip ni tangazo la DHCPOFFER na DHCPACK
  • DHCPSSeva - ip ya seva ya DHCP ni nini
  • Muda wa kukodisha wa LeaseTime wa anwani ya IP iliyotolewa
  • ThreadLimit - ni nyuzi ngapi zinazoendeshwa kwa wakati mmoja ili kuchakata pakiti zinazoingia za UDP kwenye mlango wa 67. Inastahili kusaidia kwenye miradi yenye mzigo mkubwa 😉
  • defaultMask,defaultRouter,defaultDNS - ni nini kinachotolewa kwa mteja kwa chaguo-msingi ikiwa IP inapatikana kwenye hifadhidata, lakini vigezo vya ziada havijabainishwa kwa ajili yake.

sehemu ya mysql:

mwenyeji, jina la mtumiaji, nenosiri, jina la msingi - kila kitu kinajieleza yenyewe. Muundo wa hifadhidata wa takriban umebandikwa GitHub

Sehemu ya hoja: maombi ya kupokea OFFER/ACK yamefafanuliwa hapa:

  • offer_count - idadi ya mistari iliyo na maombi ambayo hurejesha matokeo kama vile ip, mask, router, dns
  • offer_n - mfuatano wa hoja. Ikiwa return ni tupu, basi tekeleza ombi lifuatalo la ofa
  • history_sql - swala linaloandika, kwa mfano, kwa "historia ya uidhinishaji" kwa msajili

Maombi yanaweza kujumuisha vigezo vyovyote kutoka sehemu ya chaguo au chaguo kutoka kwa itifaki ya DHCP.

Sehemu ya chaguzi. Hapa ndipo inapovutia zaidi. Hapa tunaweza kuunda vigeu ambavyo tunaweza kutumia baadaye katika sehemu ya hoja.

Kwa mfano:

option_82_hex:sw_port1:20:22

, mstari huu wa amri unachukua mstari mzima uliokuja katika chaguo la ombi la DHCP 82, katika umbizo la hex, katika masafa kutoka baiti 20 hadi 22 pamoja na kuiweka katika kibadilishaji kipya cha sw_port1 (kubadili bandari kutoka ambapo ombi lilitoka)

option_82_hex:sw_mac:26:40

, fafanua utofauti wa sw_mac, ukichukua heksi kutoka masafa 26:40

Unaweza kuona chaguzi zote zinazowezekana ambazo zinaweza kutumika katika maswali kwa kuanza seva na swichi ya -d. Tutaona kitu kama logi hii:

--kifurushi cha DHCPINFORM kiliwasili kwenye bandari 67, kutoka 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress': '0025224MacAddress'B%Address'B% 764:' Jxd00d' , ' HType': 'Ethernet', 'HostName': b'x7xa91xe5xa0xa3xa5-x9fx8a', 'ReqListDNS': Kweli, 'ReqListDomainName': Kweli, 'ReqListPerfowmRouterDiscover': Kweli, 'ReqListRouter': TrueStatic, 'ReqListReute': TrueStat, 'ReqListRouter' 'ReqListSubnetM ask ': True, 'ReqListVendorSpecInfo': 8, 'RequestedIpAddress': '43', 'Vendor': b'MSFT 0.0.0.0', 'chaddr': '5.0ad0025224', 'ciaddr.764': 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': '12010600040001000602080006001 tion_589_len': 2 82, 'option_18_str': "b'x82x12x01x06x00x04x00x01x00x06x02x08x00x06x00eXx1exb9xad'", 'matokeo': Siyo kweli, 'sekunde 2,': 'siaddr': '768', 'sw_mac': '0.0.0.0e001eb589ad', 'sw_port2': '1', 'xidbyte': b'

Ipasavyo, tunaweza kufunga tofauti yoyote katika {} na itatumika katika hoja ya SQL.

Wacha turekodi kwa historia kwamba mteja alipokea anwani ya IP:

Seva ya DHCP+Mysql katika Python

Seva ya DHCP+Mysql katika Python

Kuanza kwa seva

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

- d hali ya towe ya kiweko TEUZI
- c <jina la faili> faili ya usanidi

Debriefing

Na sasa maelezo zaidi juu ya kutekeleza seva katika Python. Ni maumivu. Chatu alijifunza kwa kuruka. Nyakati nyingi hufanywa kwa mtindo wa "wow, kwa njia fulani nilifanya ifanye kazi." Haijaboreshwa hata kidogo, na imeachwa katika fomu hii haswa kwa sababu ya uzoefu mdogo katika ukuzaji wa Python. Nitakaa juu ya mambo ya kuvutia zaidi ya utekelezaji wa seva katika "msimbo".

Kichanganuzi cha faili ya usanidi wa XML

Moduli ya kawaida ya Python xml.dom inatumika. Inaonekana ni rahisi, lakini wakati wa utekelezaji kulikuwa na ukosefu unaoonekana wa nyaraka wazi na mifano kwenye mtandao kwa kutumia moduli hii.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") kwa elem katika mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["mysql_username"]=elem.getElementsByTagName("jina la mtumiaji")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("nenosiri")[0].firstChild.data gconfig["mysql_base) =elem.getElementsByTagName("jina la msingi")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") kwa ajili ya elem katika dconfig: gconfig["broadcast"]=elem.getElementsByTagName("matangazo")[0]. firstChild.data gconfig["dhcp_host"]=elem.getElementsByTagName("mwenyeji")[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_dh =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDNS"]=elem. defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") kwa elem katika qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild.data kwa nambari katika 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") kwa kipengele katika chaguzi: node=elem.getElementsByTagName("chaguo") kwa chaguo katika nodi : chaguziMod.append(options.firstChild.data)

Usomaji mwingi

Cha kustaajabisha, usomaji mwingi katika Python unatekelezwa kwa uwazi sana na kwa urahisi.

def PacketWork(data,addr): ... # utekelezaji wa kuchanganua pakiti inayoingia na kuijibu ... wakati Kweli: data, addr = udp_socket.recvfrom(1024) # inasubiri uzi wa pakiti ya UDP = threading.Thread( target=PacketWork , args=(data,addr,)).start() # ilipokuja - tunazindua kitendakazi cha PacketWork kilichofafanuliwa awali chinichini na vigezo huku threading.active_count() >gconfig["dhcp_ThreadLimit"]: time. sleep(1) # ikiwa nambari Kuna nyuzi nyingi tayari zinazoendesha kuliko kwenye mipangilio, tunangojea hadi kuwe na chache kati yao.

Pokea/tuma pakiti ya DHCP

Ili kuzuia pakiti za UDP zinazokuja kupitia kadi ya mtandao, unahitaji "kuinua" tundu:

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

, ambapo bendera ziko:

  • AF_INET - inamaanisha kuwa muundo wa anwani utakuwa IP: bandari. Kunaweza pia kuwa na AF_UNIX - ambapo anwani imetolewa kwa jina la faili.
  • SOCK_DGRAM - inamaanisha kuwa hatukubali "pakiti mbichi", lakini ambayo tayari imepita kwenye ngome, na pakiti iliyopunguzwa kidogo. Wale. tunapokea pakiti ya UDP pekee bila sehemu ya "kimwili" ya kanga ya pakiti ya UDP. Ikiwa unatumia bendera ya SOCK_RAW, basi utahitaji pia kuchanganua "rapper" hii.

Kutuma pakiti kunaweza kuwa kama matangazo:

                    udp_socket.setsockopt(soketi.SOL_SOCKET, soketi.SO_BROADCAST, 1) #badilisha soketi hadi hali ya utangazaji rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

, na kwa anwani "ambapo kifurushi kilitoka":

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # badilisha soketi hadi hali ya wasikilizaji wengi rz=udp_socket.sendto(packetack, addr)

, ambapo SOL_SOCKET inamaanisha "kiwango cha itifaki" cha kuweka chaguzi,

, chaguo la SO_BROADCAST kuwa kifurushi cha kofia ni "kutangaza"

  ,SO_REUSEADDR chaguo hubadilisha soketi hadi hali ya "wasikilizaji wengi". Kwa nadharia, sio lazima katika kesi hii, lakini kwenye moja ya seva za FreeBSD ambazo nilijaribu, msimbo haukufanya kazi bila chaguo hili.

Inachanganua pakiti ya DHCP

Hapa ndipo nilipenda sana Python. Inabadilika kuwa nje ya sanduku hukuruhusu kubadilika kabisa na bytecode. Kuruhusu kwa urahisi sana kutafsiriwa katika maadili decimal, masharti na hex - i.e. hii ndio tunahitaji kuelewa muundo wa kifurushi. Kwa hivyo, kwa mfano, unaweza kupata anuwai ya ka katika HEX na ka tu:

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

, pakiti baiti katika muundo:

res["bendera"]=pakiti('BB',data[10],data[11])

Pata IP kutoka kwa muundo:

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

Na kinyume chake:

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

Ni hayo tu kwa sasa 😉

Chanzo: mapenzi.com

Kuongeza maoni