DHCP+Mysql þjónn í Python

DHCP+Mysql þjónn í Python

Tilgangur þessa verkefnis var:

  • Að læra um DHCP á IPv4 neti
  • Að læra Python (aðeins meira en frá grunni 😉)
  • skipti á netþjóni DB2DHCP (gaflinn minn), frumlegur hér, sem verður sífellt erfiðara að setja saman fyrir nýja stýrikerfið. Og mér líkar ekki að það sé tvískipt að það sé engin leið að „breyta núna“
  • að fá virkan DHCP netþjón með getu til að velja IP tölu áskrifanda með því að nota mac áskrifandans eða skipta um mac+port samsetningu (valkostur 82)
  • skrifa annað hjól (Ó! þetta er uppáhalds athöfnin mín)
  • að fá athugasemdir um klúbbhöndina þína á Habrahabr (eða betra, boð) 😉

Niðurstaða: það virkar 😉 Prófað á FreeBSD og Ubuntu OS. Fræðilega séð er hægt að biðja kóðann um að virka undir hvaða stýrikerfi sem er, vegna þess að Það virðast engar sérstakar bindingar í kóðanum.
Varlega! Það er margt fleira sem kemur til.

Tengill á geymslu fyrir áhugamenn "snerta lifandi".

Ferlið við að setja upp, stilla og nota niðurstöðuna „að rannsaka vélbúnaðinn“ er miklu lægra, og svo smá kenning um DHCP samskiptareglur. Fyrir mig. Og til sögunnar 😉

Smá kenning

Hvað er DHCP

Þetta er netsamskiptareglur sem gerir tæki kleift að finna IP tölu þess (og aðrar breytur eins og gátt, DNS osfrv.) frá DHCP netþjóni. Skipt er á pakka með UDP samskiptareglum. Almenn regla um notkun tækisins þegar beðið er um netbreytur er sem hér segir:

  1. Tækið (viðskiptavinur) sendir UDP útsendingarbeiðni (DHCPDISCOVER) um netið með beiðninni „jæja, einhver gefur mér IP tölu. Þar að auki, venjulega (en ekki alltaf) kemur beiðnin frá höfn 68 (uppspretta), og áfangastaðurinn er höfn 67 (áfangastaður). Sum tæki senda líka pakka frá port 67. MAC vistfang viðskiptavinartækisins er innifalið í DHCPDISCOVER pakkanum.
  2. Allir DHCP netþjónar sem staðsettir eru á netinu (og þeir geta verið nokkrir) mynda DHCPOFFER tilboð með netstillingum fyrir tækið sem sendi DHCPDISCOVER, og senda það einnig út um netið. Auðkenning á hverjum þessi pakki er ætlaður byggist á MAC vistfangi viðskiptavinarins sem gefið var upp fyrr í DHCPDISCOVER beiðninni.
  3. Viðskiptavinurinn tekur við pökkum með tillögum um netstillingar, velur þá aðlaðandi (viðmiðin geta verið önnur, t.d. tími pakkaafhendingar, fjöldi millileiða) og gerir „opinbera beiðni“ DHCPREQUEST með netstillingunum frá DHCP þjóninum sem honum líkar við. Í þessu tilviki fer pakkinn á ákveðinn DHCP netþjón.
  4. Miðlarinn sem fékk DHCPREQUEST sendir DHCPACK snið pakka, þar sem hann skráir aftur netstillingar sem ætlaðar eru fyrir þennan biðlara

DHCP+Mysql þjónn í Python

Að auki eru DHCPINFORM pakkar sem koma frá viðskiptavininum og tilgangur þeirra er að tilkynna DHCP þjóninum að „viðskiptavinurinn sé á lífi“ og noti útgefnar netstillingar. Í útfærslu þessa netþjóns eru þessir pakkar hunsaðir.

Pakkasnið

Almennt séð lítur Ethernet pakkarammi eitthvað svona út:

DHCP+Mysql þjónn í Python

Í okkar tilviki munum við aðeins íhuga gögnin beint úr innihaldi UDP pakkans, án OSI lags siðareglurhausa, nefnilega DHCP uppbyggingu:

DHCP UPPLÝSTU

Þannig að ferlið við að fá IP tölu fyrir tæki byrjar með því að DHCP biðlarinn sendir útsendingarbeiðni frá höfn 68 til 255.255.255.255:67. Í þessum pakka inniheldur viðskiptavinurinn MAC vistfangið sitt, sem og það sem hann vill fá frá DHCP þjóninum. Uppbygging pakka er lýst í töflunni hér að neðan.

DHCPDISCOVER pakkauppbyggingstafla

Staða í pakkanum
Gildisheiti
Dæmi
Inngangur
Byte
skýringar

1
Ræsibeiðni
1
Hex
1
Tegund skilaboða. 1 - beiðni frá biðlara til netþjóns, 2 - svar frá netþjóni til viðskiptavinar

2
Gerð vélbúnaðar
1
Hex
1
Tegund vélbúnaðar vistfang, í þessari samskiptareglu 1 - MAC

3
Lengd vélbúnaðar vistföng
6
Hex
1
Lengd MAC vistfangs tækis

4
Hops
1
Hex
1
Fjöldi millileiða

5
Auðkenni viðskipta
23:cf:de:1d
Hex
4
Einstakt færsluauðkenni. Myndað af viðskiptavininum í upphafi beiðniaðgerðar

7
Annað liðið
0
Hex
4
Tími í sekúndum frá upphafi ferlis við að fá heimilisfang

9
Stígvélafánar
0
Hex
2
Ákveðnir fánar sem hægt er að stilla til að gefa til kynna samskiptabreytur

11
IP tölu viðskiptavinar
0.0.0.0
Lína
4
IP tölu viðskiptavinar (ef einhver er)

15
IP tölu viðskiptavinarins
0.0.0.0
Lína
4
IP-tala sem þjónninn býður upp á (ef það er til staðar)

19
Næsta netþjóns IP vistfang
0.0.0.0
Lína
4
IP tölu netþjóns (ef þekkt)

23
IP tölu gengisfulltrúa
172.16.114.41
Lína
4
IP tölu gengismiðlarans (til dæmis rofi)

27
MAC vistfang viðskiptavinar
14:d6:4d:a7:c9:55
Hex
6
MAC vistfang sendanda pakka (viðskiptavinur)

31
Vélbúnaðaraðfangafylling viðskiptavinar
 
Hex
10
Frátekið sæti. Venjulega fyllt með núllum

41
Hýsingarheiti þjóns
 
Lína
64
Nafn DHCP miðlara. Yfirleitt ekki send

105
Nafn ræsiskráar
 
Lína
128
Skráarnafn á þjóninum sem disklausar stöðvar nota við ræsingu

235
Töfrakökur
63: 82: 53: 63
Hex
4
„Magic“ númer, samkvæmt því, þ.m.t. þú getur ákveðið að þessi pakki tilheyri DHCP samskiptareglunum

DHCP valkostir. Getur farið í hvaða röð sem er

236
Valkostanúmer
53
Desember
1
Valkostur 53, sem tilgreinir DHCP pakkagerðina

1 - DHCP DISCOVER
3 - DHCPREQUEST
2 - DHCP TILBOÐ
5 - DHCPACK
8 - DHCPINFORM

 
Valkostur lengd
1
Desember
1

 
Valkostur gildi
1
Desember
1

 
Valkostanúmer
50
Desember
1
Hvaða IP tölu vill viðskiptavinurinn fá?

 
Valkostur lengd
4
Desember
1

 
Valkostur gildi
172.16.134.61
Lína
4

 
Valkostanúmer
55
 
1
Netfæribreytur sem biðlarinn biður um. Samsetning getur verið mismunandi

01 - Netmaski
03 - Hlið
06 - DNS
oc — Hostnafn
0f - netlén
1c - heimilisfang útsendingarbeiðni (útsending)
42 - Nafn TFTP miðlara
79 - Classless Static Route

 
Valkostur lengd
8
 
1

 
Valkostur gildi
01:03:06:0c:0f:1c:42:79
 
8

 
Valkostanúmer
82
Desember
 
Valkostur 82, sem sendir MAC vistfang endurvarpstækisins og nokkur viðbótargildi.

Oftast er þetta höfn rofans sem endinn DHCP viðskiptavinur keyrir á. Þessi valkostur inniheldur viðbótarfæribreytur. Fyrsta bætið er númer „undirvalkostsins“, annað er lengd hans, síðan gildi hans.

Í þessu tilviki, í valkosti 82, eru undirvalkostirnir hreiðraðir:
Agent Circuit ID = 00:04:00:01:00:04, þar sem síðustu tvö bætin eru DHCP biðlaratengið sem beiðnin kom frá

Fjarauðkenni umboðsmanns = 00:06:c8:be:19:93:11:48 - MAC vistfang DHCP endurvarpstækisins

 
Valkostur lengd
18
Desember
 

 
Valkostur gildi
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Lok pakka
255
Desember
1
255 táknar lok pakkans

DHCP TILBOÐ

Um leið og þjónninn fær DHCPDISCOVER pakkann og ef hann sér að hann getur boðið viðskiptavininum eitthvað frá þeim sem beðið er um, þá býr hann til svar fyrir hann - DHCPDISCOVER. Svarið er sent til hafnarinnar „þaðan sem það kom“, með útsendingu, vegna þess Í augnablikinu hefur viðskiptavinurinn ekki IP-tölu ennþá, þess vegna getur hann aðeins samþykkt pakkann ef hann er sendur með útsendingu. Viðskiptavinurinn viðurkennir að þetta sé pakki fyrir hann með MAC-tölu hans inni í pakkanum, sem og færslunúmerinu sem hann býr til á þeim tíma sem fyrsti pakkinn er búinn til.

DHCPOFFER pakkauppbyggingartafla

Staða í pakkanum
Heiti gildis (algengt)
Dæmi
Inngangur
Byte
skýringar

1
Ræsibeiðni
1
Hex
1
Tegund skilaboða. 1 - beiðni frá biðlara til netþjóns, 2 - svar frá netþjóni til viðskiptavinar

2
Gerð vélbúnaðar
1
Hex
1
Tegund vélbúnaðar vistfang, í þessari samskiptareglu 1 - MAC

3
Lengd vélbúnaðar vistföng
6
Hex
1
Lengd MAC vistfangs tækis

4
Hops
1
Hex
1
Fjöldi millileiða

5
Auðkenni viðskipta
23:cf:de:1d
Hex
4
Einstakt færsluauðkenni. Myndað af viðskiptavininum í upphafi beiðniaðgerðar

7
Annað liðið
0
Hex
4
Tími í sekúndum frá upphafi ferlis við að fá heimilisfang

9
Stígvélafánar
0
Hex
2
Ákveðnir fánar sem hægt er að stilla til að gefa til kynna samskiptabreytur. Í þessu tilviki þýðir 0 tegund Unicast beiðni

11
IP tölu viðskiptavinar
0.0.0.0
Lína
4
IP tölu viðskiptavinar (ef einhver er)

15
IP tölu viðskiptavinarins
172.16.134.61
Lína
4
IP-tala sem þjónninn býður upp á (ef það er til staðar)

19
Næsta netþjóns IP vistfang
0.0.0.0
Lína
4
IP tölu netþjóns (ef þekkt)

23
IP tölu gengisfulltrúa
172.16.114.41
Lína
4
IP tölu gengismiðlarans (til dæmis rofi)

27
MAC vistfang viðskiptavinar
14:d6:4d:a7:c9:55
Hex
6
MAC vistfang sendanda pakka (viðskiptavinur)

31
Vélbúnaðaraðfangafylling viðskiptavinar
 
Hex
10
Frátekið sæti. Venjulega fyllt með núllum

41
Hýsingarheiti þjóns
 
Lína
64
Nafn DHCP miðlara. Yfirleitt ekki send

105
Nafn ræsiskráar
 
Lína
128
Skráarnafn á þjóninum sem disklausar stöðvar nota við ræsingu

235
Töfrakökur
63: 82: 53: 63
Hex
4
„Magic“ númer, samkvæmt því, þ.m.t. þú getur ákveðið að þessi pakki tilheyri DHCP samskiptareglunum

DHCP valkostir. Getur farið í hvaða röð sem er

236
Valkostanúmer
53
Desember
1
Valkostur 53, sem skilgreinir DHCP 2 pakkategundina - DHCPOFFER

 
Valkostur lengd
1
Desember
1

 
Valkostur gildi
2
Desember
1

 
Valkostanúmer
1
Desember
1
Valkostur til að bjóða DHCP biðlaranum netgrímu

 
Valkostur lengd
4
Desember
1

 
Valkostur gildi
255.255.224.0
Lína
4

 
Valkostanúmer
3
Desember
1
Valkostur til að bjóða DHCP biðlaranum sjálfgefna gátt

 
Valkostur lengd
4
Desember
1

 
Valkostur gildi
172.16.12.1
Lína
4

 
Valkostanúmer
6
Desember
1
Valkostur til að bjóða upp á DHCP til DNS viðskiptavini

 
Valkostur lengd
4
Desember
1

 
Valkostur gildi
8.8.8.8
Lína
4

 
Valkostanúmer
51
Desember
1
Líftími útgefna netbreytu í sekúndum, eftir það verður DHCP biðlarinn að biðja um þær aftur

 
Valkostur lengd
4
Desember
1

 
Valkostur gildi
86400
Desember
4

 
Valkostanúmer
82
Desember
1
Valkostur 82, endurtekur það sem kom í DHCPDISCOVER

 
Valkostur lengd
18
Desember
1

 
Valkostur gildi
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Desember
18

 
Lok pakka
255
Desember
1
255 táknar lok pakkans

DHCPREQUEST

Eftir að viðskiptavinurinn hefur fengið DHCPOFFER myndar hann pakka sem biður um netbreytur fyrir alla DHCP netþjóna á netinu, heldur aðeins til eins tiltekins, hvers DHCPOFFER tilboði honum „líkaði“ mest við. „Eins“ viðmiðin geta verið mismunandi og fer eftir DHCP-útfærslu viðskiptavinarins. Viðtakandi beiðninnar er tilgreindur með MAC vistfangi DHCP netþjónsins. Einnig er hægt að senda DHCPREQUEST pakka af viðskiptavininum án þess að búa til DHCPDISCOVER fyrst, ef IP tölu netþjónsins hefur þegar verið fengin áður.

DHCPREQUEST pakkauppbyggingstafla

Staða í pakkanum
Heiti gildis (algengt)
Dæmi
Inngangur
Byte
skýringar

1
Ræsibeiðni
1
Hex
1
Tegund skilaboða. 1 - beiðni frá biðlara til netþjóns, 2 - svar frá netþjóni til viðskiptavinar

2
Gerð vélbúnaðar
1
Hex
1
Tegund vélbúnaðar vistfang, í þessari samskiptareglu 1 - MAC

3
Lengd vélbúnaðar vistföng
6
Hex
1
Lengd MAC vistfangs tækis

4
Hops
1
Hex
1
Fjöldi millileiða

5
Auðkenni viðskipta
23:cf:de:1d
Hex
4
Einstakt færsluauðkenni. Myndað af viðskiptavininum í upphafi beiðniaðgerðar

7
Annað liðið
0
Hex
4
Tími í sekúndum frá upphafi ferlis við að fá heimilisfang

9
Stígvélafánar
8000
Hex
2
Ákveðnir fánar sem hægt er að stilla til að gefa til kynna samskiptabreytur. Í þessu tilviki er „útsending“ stillt

11
IP tölu viðskiptavinar
0.0.0.0
Lína
4
IP tölu viðskiptavinar (ef einhver er)

15
IP tölu viðskiptavinarins
172.16.134.61
Lína
4
IP-tala sem þjónninn býður upp á (ef það er til staðar)

19
Næsta netþjóns IP vistfang
0.0.0.0
Lína
4
IP tölu netþjóns (ef þekkt)

23
IP tölu gengisfulltrúa
172.16.114.41
Lína
4
IP tölu gengismiðlarans (til dæmis rofi)

27
MAC vistfang viðskiptavinar
14:d6:4d:a7:c9:55
Hex
6
MAC vistfang sendanda pakka (viðskiptavinur)

31
Vélbúnaðaraðfangafylling viðskiptavinar
 
Hex
10
Frátekið sæti. Venjulega fyllt með núllum

41
Hýsingarheiti þjóns
 
Lína
64
Nafn DHCP miðlara. Yfirleitt ekki send

105
Nafn ræsiskráar
 
Lína
128
Skráarnafn á þjóninum sem disklausar stöðvar nota við ræsingu

235
Töfrakökur
63: 82: 53: 63
Hex
4
„Magic“ númer, samkvæmt því, þ.m.t. þú getur ákveðið að þessi pakki tilheyri DHCP samskiptareglunum

DHCP valkostir. Getur farið í hvaða röð sem er

236
Valkostanúmer
53
Desember
3
Valkostur 53, sem skilgreinir DHCP pakkategund 3 - DHCPREQUEST

 
Valkostur lengd
1
Desember
1

 
Valkostur gildi
3
Desember
1

 
Valkostanúmer
61
Desember
1
Auðkenni viðskiptavinar: 01 (fyrir Ehernet) + MAC vistfang viðskiptavinar

 
Valkostur lengd
7
Desember
1

 
Valkostur gildi
01:2c:ab:25:ff:72:a6
Hex
7

 
Valkostanúmer
60
Desember
 
„Auðkenni söluaðilaflokks“. Í mínu tilviki greinir það frá útgáfu DHCP biðlara. Kannski skila önnur tæki eitthvað öðruvísi. Windows tilkynnir til dæmis MSFT 5.0

 
Valkostur lengd
11
Desember
 

 
Valkostur gildi
udhcp 0.9.8
Lína
 

 
Valkostanúmer
55
 
1
Netfæribreytur sem biðlarinn biður um. Samsetning getur verið mismunandi

01 - Netmaski
03 - Hlið
06 - DNS
oc — Hostnafn
0f - netlén
1c - heimilisfang útsendingarbeiðni (útsending)
42 - Nafn TFTP miðlara
79 - Classless Static Route

 
Valkostur lengd
8
 
1

 
Valkostur gildi
01:03:06:0c:0f:1c:42:79
 
8

 
Valkostanúmer
82
Desember
1
Valkostur 82, endurtekur það sem kom í DHCPDISCOVER

 
Valkostur lengd
18
Desember
1

 
Valkostur gildi
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Desember
18

 
Lok pakka
255
Desember
1
255 táknar lok pakkans

DHCPACK

Til staðfestingar á því að „já, það er rétt, þetta er IP-talan þín, og ég mun ekki gefa það út til neins annars“ frá DHCP-þjóninum, þá þjónar pakki á DHCPACK-sniði frá þjóninum til viðskiptavinarins. Það er sent útvarpað eins og aðrir pakkar. Þrátt fyrir að í kóðanum hér að neðan fyrir DHCP netþjón sem er útfærður í Python, fyrir tilfelli, afriti ég hvaða útsendingarbeiðni sem er með því að senda pakka á tiltekið IP viðskiptavinar, ef það er þegar þekkt. Þar að auki er DHCP þjóninum alveg sama hvort DHCPACK pakkinn hafi náð til viðskiptavinarins. Ef viðskiptavinurinn fær ekki DHCPACK, þá endurtekur hann einfaldlega DHCPREQUEST eftir smá stund

DHCPACK Packet Structure Tafla

Staða í pakkanum
Heiti gildis (algengt)
Dæmi
Inngangur
Byte
skýringar

1
Ræsibeiðni
2
Hex
1
Tegund skilaboða. 1 - beiðni frá biðlara til netþjóns, 2 - svar frá netþjóni til viðskiptavinar

2
Gerð vélbúnaðar
1
Hex
1
Tegund vélbúnaðar vistfang, í þessari samskiptareglu 1 - MAC

3
Lengd vélbúnaðar vistföng
6
Hex
1
Lengd MAC vistfangs tækis

4
Hops
1
Hex
1
Fjöldi millileiða

5
Auðkenni viðskipta
23:cf:de:1d
Hex
4
Einstakt færsluauðkenni. Myndað af viðskiptavininum í upphafi beiðniaðgerðar

7
Annað liðið
0
Hex
4
Tími í sekúndum frá upphafi ferlis við að fá heimilisfang

9
Stígvélafánar
8000
Hex
2
Ákveðnir fánar sem hægt er að stilla til að gefa til kynna samskiptabreytur. Í þessu tilviki er „útsending“ stillt

11
IP tölu viðskiptavinar
0.0.0.0
Lína
4
IP tölu viðskiptavinar (ef einhver er)

15
IP tölu viðskiptavinarins
172.16.134.61
Lína
4
IP-tala sem þjónninn býður upp á (ef það er til staðar)

19
Næsta netþjóns IP vistfang
0.0.0.0
Lína
4
IP tölu netþjóns (ef þekkt)

23
IP tölu gengisfulltrúa
172.16.114.41
Lína
4
IP tölu gengismiðlarans (til dæmis rofi)

27
MAC vistfang viðskiptavinar
14:d6:4d:a7:c9:55
Hex
6
MAC vistfang sendanda pakka (viðskiptavinur)

31
Vélbúnaðaraðfangafylling viðskiptavinar
 
Hex
10
Frátekið sæti. Venjulega fyllt með núllum

41
Hýsingarheiti þjóns
 
Lína
64
Nafn DHCP miðlara. Yfirleitt ekki send

105
Nafn ræsiskráar
 
Lína
128
Skráarnafn á þjóninum sem disklausar stöðvar nota við ræsingu

235
Töfrakökur
63: 82: 53: 63
Hex
4
„Magic“ númer, samkvæmt því, þ.m.t. þú getur ákveðið að þessi pakki tilheyri DHCP samskiptareglunum

DHCP valkostir. Getur farið í hvaða röð sem er

236
Valkostanúmer
53
Desember
3
Valkostur 53, sem skilgreinir DHCP pakkategund 5 - DHCPACK

 
Valkostur lengd
1
Desember
1

 
Valkostur gildi
5
Desember
1

 
Valkostanúmer
1
Desember
1
Valkostur til að bjóða DHCP biðlaranum netgrímu

 
Valkostur lengd
4
Desember
1

 
Valkostur gildi
255.255.224.0
Lína
4

 
Valkostanúmer
3
Desember
1
Valkostur til að bjóða DHCP biðlaranum sjálfgefna gátt

 
Valkostur lengd
4
Desember
1

 
Valkostur gildi
172.16.12.1
Lína
4

 
Valkostanúmer
6
Desember
1
Valkostur til að bjóða upp á DHCP til DNS viðskiptavini

 
Valkostur lengd
4
Desember
1

 
Valkostur gildi
8.8.8.8
Lína
4

 
Valkostanúmer
51
Desember
1
Líftími útgefna netbreytu í sekúndum, eftir það verður DHCP biðlarinn að biðja um þær aftur

 
Valkostur lengd
4
Desember
1

 
Valkostur gildi
86400
Desember
4

 
Valkostanúmer
82
Desember
1
Valkostur 82, endurtekur það sem kom í DHCPDISCOVER

 
Valkostur lengd
18
Desember
1

 
Valkostur gildi
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Desember
18

 
Lok pakka
255
Desember
1
255 táknar lok pakkans

Uppsetning

Uppsetningin felst í raun í því að setja upp python einingarnar sem nauðsynlegar eru fyrir vinnu. Gert er ráð fyrir að MySQL sé þegar uppsett og stillt.

FreeBSD

pkg settu upp python3 python3 -m surepip pip3 settu upp mysql-tengi

ubuntu

sudo apt-get install python3 sudo apt-get install pip3 sudo pip3 setja upp mysql-tengi

Við búum til MySQL gagnagrunn, hleðum upp pydhcp.sql dumpinu inn í hann og stillum stillingarskrána.

Stillingar

Allar netþjónsstillingar eru í xml skrá. Tilvísunarskrá:

1.0 0.0.0.0 255.255.255.255 192.168.0.71 8600 1 255.255.255.0 192.168.0.1 staðbundinn gestgjafi próf próf 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 veldu ip,mask,router,dns frá notendum þar sem upper(mac)=upper('{option_3_AgentRemoteId_hex}') og upper(port)=upper('{option_1_AgentCircuitId_port_hex}') veldu ip,mask, router,dns frá notendum þar sem upper(mac)=upper('{sw_mac}') og upper(port)=upper('{sw_port82}') veldu ip,mask, router,dns frá notendum þar sem upper(mac)=upper('{ClientMacAddress}') setja inn í sögu (id,dt,mac,ip,comment) gildi (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Nú nánar um merkin:

dhcpserver hlutinn lýsir grunnstillingum til að ræsa netþjóninn, þ.e.

  • gestgjafi - hvaða IP tölu þjónninn hlustar á á port 67
  • broadcast - hvaða ip er útsending fyrir DHCPOFFER og DHCPACK
  • DHCPServer - hvað er ip DHCP þjóninum
  • LeaseTime leigutími útgefinna IP tölu
  • ThreadLimit - hversu margir þræðir eru í gangi samtímis til að vinna úr innkomnum UDP pakka á höfn 67. Það á að hjálpa til við mikið álagsverkefni 😉
  • defaultMask,defaultRouter,defaultDNS - það sem áskrifanda er sjálfgefið í boði ef IP finnst í gagnagrunninum en viðbótarfæribreytur eru ekki tilgreindar fyrir það

mysql hluti:

gestgjafi, notendanafn, lykilorð, grunnnafn - allt talar sínu máli. Áætlað gagnagrunnsuppbygging er birt á GitHub

Fyrirspurnarhluti: beiðnum um að fá TILBOÐ/ACK er lýst hér:

  • offer_count — fjöldi lína með beiðnum sem skila niðurstöðu eins og ip,mask, router,dns
  • tilboð_n — fyrirspurnarstrengur. Ef skila er tóm, þá framkvæmir eftirfarandi tilboðsbeiðni
  • history_sql - fyrirspurn sem skrifar til dæmis í „heimildarsögu“ fyrir áskrifanda

Beiðnir geta innihaldið hvaða breytur sem er úr valkostahlutanum eða valkostir úr DHCP samskiptareglunum.

Valmöguleikahluti. Þetta er þar sem það verður meira áhugavert. Hér getum við búið til breytur sem við getum notað síðar í fyrirspurnarhlutanum.

Til dæmis:

option_82_hex:sw_port1:20:22

, þessi skipanalína tekur alla línuna sem kom í DHCP beiðni valmöguleika 82, á hex sniði, á bilinu frá 20 til 22 bæti að meðtöldum og setur hana í nýju breytuna sw_port1 (skipta um tengi þaðan sem beiðnin kom)

option_82_hex:sw_mac:26:40

, skilgreindu sw_mac breytuna, taktu hex frá bilinu 26:40

Þú getur séð alla mögulega valkosti sem hægt er að nota í fyrirspurnum með því að ræsa þjóninn með -d rofanum. Við munum sjá eitthvað eins og þennan log:

--a DHCPINFORM pakki barst á höfn 67, frá 0025224ad764, b'x91xa5xe0xa3xa5xa9-x8fx8a', ('172.30.114.25', 68) {'ClientMacAddress': 'Baddress': 'Baddress': '0025224Mac': '764 00 7%"Jxd91d' , 'Htype': 'ethernet', 'hostname': b'x5xa0xe3xa5xa9xa8-x8fx43a ',' reqListdns ': satt,' reqListDonainName ': satt,' reqListperfowmRouterDiscover ': satt,' reqlistrouter ': satt,' reqlistscover ': satt,' reqlistrouter ': satt,' reqlistststate ': satt,' reqlistrouter ': satt,' reqlistststate ‘ 'ReqListSubnetM ask ': True, 'ReqListVendorSpecInfo': 0.0.0.0, 'RequestedIpAddress': '5.0', 'Vendor': b'MSFT 0025224', 'chaddr': '764ad172.30.128.13', 'ciaddr'.00'00'.172.30.114.25'308'. , 'flags ': b'x6x1', 'giaddr': '82', 'gpoz': 12, 'hlen': 12, 'hops': 53, 'htype': 'MAC', 'magic_cookie': b'cx53Sc ', 'op': 'DHCPINFORM', 'option55': 55, 'option60': 60, 'option61': 61, 'option82': 82, 'option82': 12, 'option01': 06, ' option_00_byte': b'x04x00x01x00x06x02x08x00x06x00x1x9' b'x2x82x12010600040001000602080006001eXx589exb2xad', 'option_82_hex': '18e _82_len': 12 01, 'option_06_str': "b'x00x04x00x01x00x06x02x08x00x06x00x1x9x2x768eXx0.0.0.0exb001xad'", 'niðurstaða': Ósatt, 'sekúndur': 589 'siaddr': '2', 'sw_mac': '1e06eb89ad', 'sw_port8': '3', 'xidbyte': b'

Í samræmi við það getum við sett hvaða breytu sem er í {} og hún verður notuð í SQL fyrirspurninni.

Leyfðu okkur að skrá fyrir sögu að viðskiptavinurinn fékk IP töluna:

DHCP+Mysql þjónn í Python

DHCP+Mysql þjónn í Python

Server ræst

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

— d stjórnborðsúttakshamur BUG
- c <skráarnafn> stillingarskrá

Samantekt

Og nú frekari upplýsingar um útfærslu netþjónsins í Python. Það er sársauki. Python lærðist á flugu. Mörg augnablik eru gerð í stílnum „vá, einhvern veginn lét ég það virka“. Alls ekki bjartsýni og skilin eftir í þessu formi aðallega vegna lítillar reynslu í Python þróun. Ég mun dvelja við áhugaverðustu þættina við útfærslu netþjónsins í „kóða“.

XML stillingarskráarþáttur

Hefðbundin Python eining xml.dom er notuð. Það virðist einfalt, en við innleiðingu var áberandi skortur á skýrum skjölum og dæmum á netinu sem notar þessa einingu.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") fyrir elem í mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firstChild. gconfig["mysql_username"]=elem.getElementsByTagName("notandanafn")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("lykilorð")[0].firstChild.data gconfig_basenamesq]l =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") fyrir elem í dconfig: gconfig["broadcast"]=elem.getElementsByTagName("útsending")[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"]["Macskp_default =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDgetTagName"]=eBlemyTagName defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") fyrir elem í qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild.data fyrir num í 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") fyrir elem í valkosti: node=elem.getElementsByTagName("valkostur") fyrir valkosti í hnút : optionsMod.append(options.firstChild.data)

Fjölþráður

Merkilegt nokk er fjölþráður í Python útfærður mjög skýrt og einfaldlega.

def PacketWork(gögn,addr): ... # útfærsla á því að þátta pakkann sem berast og svara honum ... á meðan True: data, addr = udp_socket.recvfrom(1024) # bíða eftir UDP pakkaþræðinum = threading.Thread( target=PacketWork , args=(data,addr,)).start() # eins og það kom - við ræsum áður skilgreinda PacketWork aðgerð í bakgrunni með breytum á meðan threading.active_count() >gconfig["dhcp_ThreadLimit"]: tími. sofa(1) # ef númerið Það eru fleiri þræðir þegar í gangi en í stillingunum, við bíðum þar til þeir eru færri

Fá/senda DHCP pakka

Til þess að stöðva UDP pakka sem koma í gegnum netkortið þarftu að „hækka“ innstunguna:

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

, þar sem fánarnir eru:

  • AF_INET - þýðir að heimilisfangssniðið verður IP: port. Það getur líka verið AF_UNIX - þar sem heimilisfangið er gefið upp af skráarnafninu.
  • SOCK_DGRAM - þýðir að við samþykkjum ekki „hráan pakka“, heldur þann sem hefur þegar farið í gegnum eldvegginn og með að hluta klipptan pakka. Þeir. við fáum aðeins UDP pakka án „líkamlega“ hluta UDP pakkaumbúðarinnar. Ef þú notar SOCK_RAW fánann, þá þarftu líka að flokka þennan „umbúðir“.

Að senda pakka getur verið eins og útsending:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #skipta um fals í útsendingarham rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

, og á heimilisfangið „hvaðan pakkinn kom“:

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # skipta um fals í fjölhlustunarham rz=udp_socket.sendto(packetack, addr)

, þar sem SOL_SOCKET þýðir „samskiptareglur“ fyrir stillingarmöguleika,

, SO_BROADCAST valkostur að hjálmpakkinn sé „útvarpaður“

  ,SO_REUSEADDR valmöguleikinn skiptir innstungunni í „margir hlustendur“ ham. Fræðilega séð er það óþarfi í þessu tilfelli, en á einum af FreeBSD netþjónunum sem ég prófaði á virkaði kóðinn ekki án þessa valkosts.

Að þátta DHCP pakka

Þetta er þar sem mér líkaði mjög við Python. Það kemur í ljós að úr kassanum gerir það þér kleift að vera nokkuð sveigjanlegur með bætikóðanum. Leyfa að það sé mjög auðvelt að þýða það yfir í aukastaf, strengi og hex - þ.e. þetta er það sem við þurfum í raun og veru til að skilja uppbyggingu pakkans. Svo, til dæmis, þú getur fengið úrval af bætum í HEX og bara bæti:

    res["xidhex"]=gögn[4:8].hex() res["xidbyte"]=gögn[4:8]

, pakka bætum inn í uppbyggingu:

res["flags"]=pakki('BB',gögn[10],gögn[11])

Fáðu IP frá uppbyggingu:

res["ciaddr"]=socket.inet_ntoa(pakki('BBBB',gögn[12],gögn[13],gögn[14],gögn[15]));

Og öfugt:

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

Það er allt í bili 😉

Heimild: www.habr.com

Bæta við athugasemd