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.
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.
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.
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.
Seva iliyopokea DHCPREQUEST hutuma pakiti ya umbizo la DHCPACK, ambamo inaorodhesha tena mipangilio ya mtandao iliyokusudiwa kwa mteja huyu.
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:
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
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.
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:
Ipasavyo, tunaweza kufunga tofauti yoyote katika {} na itatumika katika hoja ya SQL.
Wacha turekodi kwa historia kwamba mteja alipokea anwani ya IP:
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:
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: