DHCP + MySQL olupin ni Python

DHCP + MySQL olupin ni Python

Idi ti ise agbese yii ni:

  • Kọ ẹkọ nipa DHCP lori nẹtiwọki IPv4 kan
  • Kọ ẹkọ Python (diẹ diẹ sii ju lati ibere 😉)
  • rirọpo olupin DB2DHCP (mi orita), atilẹba nibi, eyiti o n di pupọ ati siwaju sii nira lati pejọ fun OS tuntun. Ati pe Emi ko fẹran pe o jẹ alakomeji pe ko si ọna lati “yi pada ni bayi”
  • gbigba olupin DHCP ti n ṣiṣẹ pẹlu agbara lati yan adiresi IP ti alabapin nipa lilo mac alabapin tabi yipo mac + ibudo (Aṣayan 82)
  • kikọ keke miiran (Oh! eyi ni iṣẹ ayanfẹ mi)
  • gbigba awọn asọye nipa ọwọ ẹgbẹ rẹ lori Habrahabr (tabi dara julọ sibẹsibẹ, ifiwepe) 😉

Esi: o ṣiṣẹ 😉 Idanwo lori FreeBSD ati Ubuntu OS. Ni imọ-jinlẹ, koodu le beere lọwọ lati ṣiṣẹ labẹ OS eyikeyi, nitori O dabi pe ko si awọn asopọ kan pato ninu koodu naa.
Ni ifarabalẹ! Ọpọlọpọ diẹ sii wa lati wa.

Ọna asopọ si ibi ipamọ fun awọn ope "fọwọkan laaye".

Ilana fifi sori ẹrọ, tunto ati lilo abajade ti “kikọ ohun elo” jẹ kekere pupọ, ati lẹhinna imọ-jinlẹ diẹ nipa ilana DHCP. Fun ara mi. Ati fun itan 😉

Imọran kekere kan

Kini DHCP

Eyi jẹ ilana nẹtiwọọki ti o fun laaye ẹrọ laaye lati wa adiresi IP rẹ (ati awọn aye miiran bii ẹnu-ọna, DNS, ati bẹbẹ lọ) lati olupin DHCP kan. Awọn apo-iwe ti wa ni paarọ nipa lilo ilana UDP. Ilana gbogbogbo ti ẹrọ nigbati o ba beere fun awọn paramita nẹtiwọọki jẹ atẹle yii:

  1. Ẹrọ naa (alabara) firanṣẹ ibeere igbohunsafefe UDP kan (DHCDISCOVER) jakejado nẹtiwọọki pẹlu ibeere “daradara, ẹnikan fun mi ni adiresi IP kan.” Pẹlupẹlu, nigbagbogbo (ṣugbọn kii ṣe nigbagbogbo) ibeere naa waye lati ibudo 68 (orisun), ati opin irin ajo naa jẹ ibudo 67 (ọna). Diẹ ninu awọn ẹrọ tun firanṣẹ awọn apo-iwe lati ibudo 67. Adirẹsi MAC ti ẹrọ onibara wa ninu apo-iwe DHCPDISCOVER.
  2. Gbogbo awọn olupin DHCP ti o wa lori nẹtiwọọki (ati pe ọpọlọpọ wọn le wa) ṣe ipese DHCPOFFER pẹlu awọn eto nẹtiwọọki fun ẹrọ ti o firanṣẹ DHCPDISCOVER, ati tun gbejade lori nẹtiwọọki naa. Idanimọ ẹni ti a pinnu fun apo-iwe yii da lori adirẹsi MAC ti alabara ti a pese ni iṣaaju ninu ibeere DHCPDISCOVER.
  3. Onibara gba awọn apo-iwe pẹlu awọn igbero fun awọn eto nẹtiwọọki, yan eyi ti o wuyi julọ (awọn iyasọtọ le yatọ, fun apẹẹrẹ, akoko ifijiṣẹ apo, nọmba awọn ipa-ọna agbedemeji), ati ṣe “ibeere osise” DHCPREQUEST pẹlu awọn eto nẹtiwọọki. lati olupin DHCP ti o fẹran. Ni idi eyi, apo-iwe naa lọ si olupin DHCP kan pato.
  4. Olupin ti o gba DHCPREQUEST fi iwe kika DHCPACK kan ranṣẹ, ninu eyiti o tun ṣe atokọ awọn eto nẹtiwọọki ti a pinnu fun alabara yii.

DHCP + MySQL olupin ni Python

Ni afikun, awọn apo-iwe DHCPINFORM wa ti o wa lati ọdọ alabara, ati idi rẹ ni lati sọ fun olupin DHCP pe “alabara wa laaye” ati pe o nlo awọn eto nẹtiwọọki ti a fun. Ninu imuse olupin yii, awọn apo-iwe wọnyi ko bikita.

Package kika

Ni gbogbogbo, fireemu soso Ethernet kan dabi nkan bi eyi:

DHCP + MySQL olupin ni Python

Ninu ọran wa, a yoo gbero data nikan taara lati inu awọn akoonu ti apo UDP, laisi awọn akọle Ilana Layer OSI, eyun eto DHCP:

DHCPDISCOVER

Nitorinaa, ilana ti gbigba adiresi IP fun ẹrọ kan bẹrẹ pẹlu alabara DHCP ti o firanṣẹ ibeere igbohunsafefe kan lati ibudo 68 si 255.255.255.255:67. Ninu package yii, alabara pẹlu adiresi MAC rẹ, ati kini gangan ti o fẹ lati gba lati olupin DHCP. Ilana package jẹ apejuwe ninu tabili ni isalẹ.

DHCPDISCOVER Packet Be Table

Ipo ni package
Orukọ iye
Apeere:
Ifihan
Baiti
Alaye lori

1
Boot Ìbéèrè
1
hex
1
Iru ifiranṣẹ. 1 - ibeere lati ọdọ alabara si olupin, 2 - esi lati olupin si alabara

2
Hardware iru
1
hex
1
Iru ti hardware adirẹsi, ni yi bèèrè 1 - MAC

3
Hardware adirẹsi ipari
6
hex
1
Ipari adiresi MAC ẹrọ

4
Hops
1
hex
1
Nọmba awọn ipa-ọna agbedemeji

5
ID Idunadura
23:cf:de:1d
hex
4
Oto idunadura idamo. Ti ipilẹṣẹ nipasẹ alabara ni ibẹrẹ iṣẹ ibeere kan

7
Keji ti kọja
0
hex
4
Akoko ni iṣẹju-aaya lati ibẹrẹ ilana ti gbigba adirẹsi kan

9
Awọn asia bata
0
hex
2
Awọn asia kan ti o le šeto lati tọkasi awọn paramita ilana

11
Adirẹsi IP onibara
0.0.0.0
Laini
4
Adirẹsi IP onibara (ti o ba jẹ)

15
Adirẹsi IP onibara rẹ
0.0.0.0
Laini
4
Adirẹsi IP ti olupin funni (ti o ba wa)

19
Adirẹsi IP olupin atẹle
0.0.0.0
Laini
4
Adirẹsi IP olupin (ti o ba mọ)

23
Aṣoju IP adirẹsi
172.16.114.41
Laini
4
Adirẹsi IP ti oluranlowo yii (fun apẹẹrẹ, iyipada)

27
Adirẹsi MAC alabara
14:d6:4d:a7:c9:55
hex
6
Adirẹsi MAC ti olufiranṣẹ apo-iwe (alabara)

31
Owú adirẹsi hardware onibara
 
hex
10
Ni ipamọ ijoko. Maa kún pẹlu odo

41
Orukọ ogun olupin
 
Laini
64
DHCP orukọ olupin. Nigbagbogbo ko gbejade

105
Boot faili orukọ
 
Laini
128
Orukọ faili lori olupin ti a lo nipasẹ awọn ibudo disiki nigbati o ba n gbe soke

235
Magic cookies
63: 82: 53: 63
hex
4
"Magic" nọmba, gẹgẹ bi eyi ti, pẹlu. o le pinnu pe apo-iwe yii jẹ ti ilana DHCP

DHCP awọn aṣayan. Le lọ ni eyikeyi ibere

236
Nọmba aṣayan
53
Dec
1
Aṣayan 53, eyiti o ṣe pato iru idii DHCP

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

 
Ipari aṣayan
1
Dec
1

 
Iye aṣayan
1
Dec
1

 
Nọmba aṣayan
50
Dec
1
Adirẹsi IP wo ni alabara fẹ lati gba?

 
Ipari aṣayan
4
Dec
1

 
Iye aṣayan
172.16.134.61
Laini
4

 
Nọmba aṣayan
55
 
1
Awọn paramita nẹtiwọki ti o beere nipasẹ alabara. Tiwqn le yatọ

01 - nẹtiwọki boju
03 - Ẹnu-ọna
06 - DNS
oc - Orukọ ogun
0f - orukọ ašẹ nẹtiwọki
1c - adirẹsi ti ibeere igbohunsafefe (igbohunsafefe)
42 - TFTP orukọ olupin
79 - Alailẹgbẹ Aimi Route

 
Ipari aṣayan
8
 
1

 
Iye aṣayan
01:03:06:0c:0f:1c:42:79
 
8

 
Nọmba aṣayan
82
Dec
 
Aṣayan 82, eyiti o ndari adiresi MAC ti ẹrọ atunwi ati diẹ ninu awọn iye afikun.

Ni ọpọlọpọ igba, eyi ni ibudo ti yipada lori eyiti opin DHCP alabara n ṣiṣẹ, aṣayan yii ni awọn aye afikun. Baiti akọkọ jẹ nọmba ti “suboption”, keji jẹ ipari rẹ, lẹhinna iye rẹ.

Ni ọran yii, ni aṣayan 82, awọn aṣayan-ipin ti wa ni itẹ-ẹiyẹ:
Agent Circuit ID = 00:04:00:01:00:04, nibiti awọn baiti meji ti o kẹhin jẹ ibudo alabara DHCP lati eyiti ibeere naa ti wa.

ID Latọna Aṣoju = 00:06:c8:be:19:93:11:48 - adirẹsi MAC ti ẹrọ atunwi DHCP

 
Ipari aṣayan
18
Dec
 

 
Iye aṣayan
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
hex
 

 
Ipari ti package
255
Dec
1
255 ṣe afihan ipari ti apo

DHCPOFFER

Ni kete ti olupin naa ba gba idii DHCPDISCOVER ati pe ti o ba rii pe o le fun alabara ni nkan lati ọdọ ọkan ti o beere, lẹhinna o ṣe agbekalẹ esi fun rẹ - DHCPDISCOVER. Idahun naa ni a fi ranṣẹ si ibudo "lati ibi ti o ti wa", nipasẹ igbohunsafefe, nitori ni akoko yii, alabara ko ti ni adiresi IP kan, nitorinaa o le gba apo-iwe nikan ti o ba firanṣẹ nipasẹ igbohunsafefe. Onibara mọ pe eyi jẹ package fun u nipasẹ adiresi MAC rẹ inu package, ati nọmba idunadura ti o ṣe ni akoko ti a ṣẹda package akọkọ.

DHCPOFFER Packet Be Table

Ipo ni package
Orukọ iye (wọpọ)
Apeere:
Ifihan
Baiti
Alaye lori

1
Boot Ìbéèrè
1
hex
1
Iru ifiranṣẹ. 1 - ibeere lati ọdọ alabara si olupin, 2 - esi lati olupin si alabara

2
Hardware iru
1
hex
1
Iru ti hardware adirẹsi, ni yi bèèrè 1 - MAC

3
Hardware adirẹsi ipari
6
hex
1
Ipari adiresi MAC ẹrọ

4
Hops
1
hex
1
Nọmba awọn ipa-ọna agbedemeji

5
ID Idunadura
23:cf:de:1d
hex
4
Oto idunadura idamo. Ti ipilẹṣẹ nipasẹ alabara ni ibẹrẹ iṣẹ ibeere kan

7
Keji ti kọja
0
hex
4
Akoko ni iṣẹju-aaya lati ibẹrẹ ilana ti gbigba adirẹsi kan

9
Awọn asia bata
0
hex
2
Awọn asia kan ti o le šeto lati tọkasi awọn paramita ilana. Ni idi eyi, 0 tumọ si iru ibeere Unicast

11
Adirẹsi IP onibara
0.0.0.0
Laini
4
Adirẹsi IP onibara (ti o ba jẹ)

15
Adirẹsi IP onibara rẹ
172.16.134.61
Laini
4
Adirẹsi IP ti olupin funni (ti o ba wa)

19
Adirẹsi IP olupin atẹle
0.0.0.0
Laini
4
Adirẹsi IP olupin (ti o ba mọ)

23
Aṣoju IP adirẹsi
172.16.114.41
Laini
4
Adirẹsi IP ti oluranlowo yii (fun apẹẹrẹ, iyipada)

27
Adirẹsi MAC alabara
14:d6:4d:a7:c9:55
hex
6
Adirẹsi MAC ti olufiranṣẹ apo-iwe (alabara)

31
Owú adirẹsi hardware onibara
 
hex
10
Ni ipamọ ijoko. Maa kún pẹlu odo

41
Orukọ ogun olupin
 
Laini
64
DHCP orukọ olupin. Nigbagbogbo ko gbejade

105
Boot faili orukọ
 
Laini
128
Orukọ faili lori olupin ti a lo nipasẹ awọn ibudo disiki nigbati o ba n gbe soke

235
Magic cookies
63: 82: 53: 63
hex
4
"Magic" nọmba, gẹgẹ bi eyi ti, pẹlu. o le pinnu pe apo-iwe yii jẹ ti ilana DHCP

DHCP awọn aṣayan. Le lọ ni eyikeyi ibere

236
Nọmba aṣayan
53
Dec
1
Aṣayan 53, eyiti o ṣalaye iru idii DHCP 2 - DHCPOFFER

 
Ipari aṣayan
1
Dec
1

 
Iye aṣayan
2
Dec
1

 
Nọmba aṣayan
1
Dec
1
Aṣayan lati fun alabara DHCP ni iboju-boju nẹtiwọki kan

 
Ipari aṣayan
4
Dec
1

 
Iye aṣayan
255.255.224.0
Laini
4

 
Nọmba aṣayan
3
Dec
1
Aṣayan lati fun alabara DHCP ni ẹnu-ọna aiyipada

 
Ipari aṣayan
4
Dec
1

 
Iye aṣayan
172.16.12.1
Laini
4

 
Nọmba aṣayan
6
Dec
1
Aṣayan lati pese DHCP si alabara DNS

 
Ipari aṣayan
4
Dec
1

 
Iye aṣayan
8.8.8.8
Laini
4

 
Nọmba aṣayan
51
Dec
1
Igbesi aye ti awọn paramita nẹtiwọọki ti a fun ni iṣẹju-aaya, lẹhin eyi alabara DHCP gbọdọ tun beere wọn lẹẹkansi

 
Ipari aṣayan
4
Dec
1

 
Iye aṣayan
86400
Dec
4

 
Nọmba aṣayan
82
Dec
1
Aṣayan 82, tun ṣe ohun ti o wa ninu DHCPDISCOVER

 
Ipari aṣayan
18
Dec
1

 
Iye aṣayan
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Dec
18

 
Ipari ti package
255
Dec
1
255 ṣe afihan ipari ti apo

DHCPREQUEST

Lẹhin ti alabara gba DHCPOFFER, o ṣe agbekalẹ apo-iwe kan ti n beere awọn paramita nẹtiwọọki kii ṣe si gbogbo awọn olupin DHCP lori nẹtiwọọki, ṣugbọn si ọkan kan pato, eyiti DHCPOFFER nfunni “fẹran” julọ. Awọn ibeere “bii” le yatọ ati dale lori imuse DHCP alabara. Olugba ibeere naa jẹ pato nipa lilo adiresi MAC ti olupin DHCP. Paapaa, idii DHCPREQUEST kan le firanṣẹ nipasẹ alabara laisi ipilẹṣẹ DHCPDISCOVER akọkọ, ti adiresi IP olupin ti ti gba tẹlẹ.

DHCPREQUEST Packet Be Table

Ipo ni package
Orukọ iye (wọpọ)
Apeere:
Ifihan
Baiti
Alaye lori

1
Boot Ìbéèrè
1
hex
1
Iru ifiranṣẹ. 1 - ibeere lati ọdọ alabara si olupin, 2 - esi lati olupin si alabara

2
Hardware iru
1
hex
1
Iru ti hardware adirẹsi, ni yi bèèrè 1 - MAC

3
Hardware adirẹsi ipari
6
hex
1
Ipari adiresi MAC ẹrọ

4
Hops
1
hex
1
Nọmba awọn ipa-ọna agbedemeji

5
ID Idunadura
23:cf:de:1d
hex
4
Oto idunadura idamo. Ti ipilẹṣẹ nipasẹ alabara ni ibẹrẹ iṣẹ ibeere kan

7
Keji ti kọja
0
hex
4
Akoko ni iṣẹju-aaya lati ibẹrẹ ilana ti gbigba adirẹsi kan

9
Awọn asia bata
8000
hex
2
Awọn asia kan ti o le šeto lati tọkasi awọn paramita ilana. Ni idi eyi, “igbohunsafefe” ti ṣeto

11
Adirẹsi IP onibara
0.0.0.0
Laini
4
Adirẹsi IP onibara (ti o ba jẹ)

15
Adirẹsi IP onibara rẹ
172.16.134.61
Laini
4
Adirẹsi IP ti olupin funni (ti o ba wa)

19
Adirẹsi IP olupin atẹle
0.0.0.0
Laini
4
Adirẹsi IP olupin (ti o ba mọ)

23
Aṣoju IP adirẹsi
172.16.114.41
Laini
4
Adirẹsi IP ti oluranlowo yii (fun apẹẹrẹ, iyipada)

27
Adirẹsi MAC alabara
14:d6:4d:a7:c9:55
hex
6
Adirẹsi MAC ti olufiranṣẹ apo-iwe (alabara)

31
Owú adirẹsi hardware onibara
 
hex
10
Ni ipamọ ijoko. Maa kún pẹlu odo

41
Orukọ ogun olupin
 
Laini
64
DHCP orukọ olupin. Nigbagbogbo ko gbejade

105
Boot faili orukọ
 
Laini
128
Orukọ faili lori olupin ti a lo nipasẹ awọn ibudo disiki nigbati o ba n gbe soke

235
Magic cookies
63: 82: 53: 63
hex
4
"Magic" nọmba, gẹgẹ bi eyi ti, pẹlu. o le pinnu pe apo-iwe yii jẹ ti ilana DHCP

DHCP awọn aṣayan. Le lọ ni eyikeyi ibere

236
Nọmba aṣayan
53
Dec
3
Aṣayan 53, eyiti o ṣalaye iru soso DHCP 3 - DHCPREQUEST

 
Ipari aṣayan
1
Dec
1

 
Iye aṣayan
3
Dec
1

 
Nọmba aṣayan
61
Dec
1
ID onibara: 01 (fun Ehernet) + adirẹsi MAC onibara

 
Ipari aṣayan
7
Dec
1

 
Iye aṣayan
01:2c:ab:25:ff:72:a6
hex
7

 
Nọmba aṣayan
60
Dec
 
"Idamo kilasi olùtajà". Ninu ọran mi, o ṣe ijabọ ẹya alabara DHCP. Boya awọn ẹrọ miiran pada nkan ti o yatọ. Windows fun apẹẹrẹ ijabọ MSFT 5.0

 
Ipari aṣayan
11
Dec
 

 
Iye aṣayan
udhcp 0.9.8
Laini
 

 
Nọmba aṣayan
55
 
1
Awọn paramita nẹtiwọki ti o beere nipasẹ alabara. Tiwqn le yatọ

01 - nẹtiwọki boju
03 - Ẹnu-ọna
06 - DNS
oc - Orukọ ogun
0f - orukọ ašẹ nẹtiwọki
1c - adirẹsi ti ibeere igbohunsafefe (igbohunsafefe)
42 - TFTP orukọ olupin
79 - Alailẹgbẹ Aimi Route

 
Ipari aṣayan
8
 
1

 
Iye aṣayan
01:03:06:0c:0f:1c:42:79
 
8

 
Nọmba aṣayan
82
Dec
1
Aṣayan 82, tun ṣe ohun ti o wa ninu DHCPDISCOVER

 
Ipari aṣayan
18
Dec
1

 
Iye aṣayan
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Dec
18

 
Ipari ti package
255
Dec
1
255 ṣe afihan ipari ti apo

DHCPACK

Gẹgẹbi ijẹrisi pe “bẹẹni, iyẹn tọ, eyi ni adiresi IP rẹ, ati pe Emi kii yoo fun ẹnikẹni miiran” lati ọdọ olupin DHCP, apo kan ni ọna kika DHCPACK lati olupin si olupin alabara. O ti firanṣẹ igbohunsafefe gẹgẹ bi awọn apo-iwe miiran. Botilẹjẹpe, ninu koodu ti o wa ni isalẹ fun olupin DHCP ti a ṣe ni Python, ni ọran kan, Mo ṣe pidánpidán eyikeyi ibeere igbohunsafefe nipa fifiranṣẹ soso kan si IP alabara kan pato, ti o ba ti mọ tẹlẹ. Pẹlupẹlu, olupin DHCP ko bikita rara boya idii DHCPACK ti de ọdọ alabara. Ti alabara ko ba gba DHCPACK, lẹhinna lẹhin igba diẹ o kan tun ṣe DHCPREQUEST

DHCPACK Packet Table

Ipo ni package
Orukọ iye (wọpọ)
Apeere:
Ifihan
Baiti
Alaye lori

1
Boot Ìbéèrè
2
hex
1
Iru ifiranṣẹ. 1 - ibeere lati ọdọ alabara si olupin, 2 - esi lati olupin si alabara

2
Hardware iru
1
hex
1
Iru ti hardware adirẹsi, ni yi bèèrè 1 - MAC

3
Hardware adirẹsi ipari
6
hex
1
Ipari adiresi MAC ẹrọ

4
Hops
1
hex
1
Nọmba awọn ipa-ọna agbedemeji

5
ID Idunadura
23:cf:de:1d
hex
4
Oto idunadura idamo. Ti ipilẹṣẹ nipasẹ alabara ni ibẹrẹ iṣẹ ibeere kan

7
Keji ti kọja
0
hex
4
Akoko ni iṣẹju-aaya lati ibẹrẹ ilana ti gbigba adirẹsi kan

9
Awọn asia bata
8000
hex
2
Awọn asia kan ti o le šeto lati tọkasi awọn paramita ilana. Ni idi eyi, “igbohunsafefe” ti ṣeto

11
Adirẹsi IP onibara
0.0.0.0
Laini
4
Adirẹsi IP onibara (ti o ba jẹ)

15
Adirẹsi IP onibara rẹ
172.16.134.61
Laini
4
Adirẹsi IP ti olupin funni (ti o ba wa)

19
Adirẹsi IP olupin atẹle
0.0.0.0
Laini
4
Adirẹsi IP olupin (ti o ba mọ)

23
Aṣoju IP adirẹsi
172.16.114.41
Laini
4
Adirẹsi IP ti oluranlowo yii (fun apẹẹrẹ, iyipada)

27
Adirẹsi MAC alabara
14:d6:4d:a7:c9:55
hex
6
Adirẹsi MAC ti olufiranṣẹ apo-iwe (alabara)

31
Owú adirẹsi hardware onibara
 
hex
10
Ni ipamọ ijoko. Maa kún pẹlu odo

41
Orukọ ogun olupin
 
Laini
64
DHCP orukọ olupin. Nigbagbogbo ko gbejade

105
Boot faili orukọ
 
Laini
128
Orukọ faili lori olupin ti a lo nipasẹ awọn ibudo disiki nigbati o ba n gbe soke

235
Magic cookies
63: 82: 53: 63
hex
4
"Magic" nọmba, gẹgẹ bi eyi ti, pẹlu. o le pinnu pe apo-iwe yii jẹ ti ilana DHCP

DHCP awọn aṣayan. Le lọ ni eyikeyi ibere

236
Nọmba aṣayan
53
Dec
3
Aṣayan 53, eyiti o ṣalaye iru soso DHCP 5 - DHCPACK

 
Ipari aṣayan
1
Dec
1

 
Iye aṣayan
5
Dec
1

 
Nọmba aṣayan
1
Dec
1
Aṣayan lati fun alabara DHCP ni iboju-boju nẹtiwọki kan

 
Ipari aṣayan
4
Dec
1

 
Iye aṣayan
255.255.224.0
Laini
4

 
Nọmba aṣayan
3
Dec
1
Aṣayan lati fun alabara DHCP ni ẹnu-ọna aiyipada

 
Ipari aṣayan
4
Dec
1

 
Iye aṣayan
172.16.12.1
Laini
4

 
Nọmba aṣayan
6
Dec
1
Aṣayan lati pese DHCP si alabara DNS

 
Ipari aṣayan
4
Dec
1

 
Iye aṣayan
8.8.8.8
Laini
4

 
Nọmba aṣayan
51
Dec
1
Igbesi aye ti awọn paramita nẹtiwọọki ti a fun ni iṣẹju-aaya, lẹhin eyi alabara DHCP gbọdọ tun beere wọn lẹẹkansi

 
Ipari aṣayan
4
Dec
1

 
Iye aṣayan
86400
Dec
4

 
Nọmba aṣayan
82
Dec
1
Aṣayan 82, tun ṣe ohun ti o wa ninu DHCPDISCOVER

 
Ipari aṣayan
18
Dec
1

 
Iye aṣayan
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Dec
18

 
Ipari ti package
255
Dec
1
255 ṣe afihan ipari ti apo

eto

Fifi sori ẹrọ gangan ni fifi sori ẹrọ awọn modulu Python pataki fun iṣẹ. O ti ro pe MySQL ti fi sii tẹlẹ ati tunto.

FreeBSD

pkg fi Python3 python3 -m ensurepip pip3 fi sori ẹrọ mysql-asopo

Ubuntu

sudo apt-gba fi sori ẹrọ python3 sudo apt-gba fi sori ẹrọ pip3 sudo pip3 fi sori ẹrọ mysql-asopo

A ṣẹda data MySQL kan, gbejade pydhcp.sql idalenu sinu rẹ, ati tunto faili iṣeto ni.

Iṣeto ni

Gbogbo eto olupin wa ninu faili xml kan. Faili itọkasi:

1.0 0.0.0.0 255.255.255.255 192.168.0.71 8600 1 255.255.255.0 192.168.0.1 localhost idanwo idanwo pydhcp aṣayan_8.8.8.8_hex:sw_port82:1:20 aṣayan_22_hex:sw_port82:2:16 aṣayan_18_hex:sw_mac:82:26 40 yan ip, mask,router,dns lati ọdọ awọn olumulo nibiti oke(mac)=oke('{option_3_AgentRemoteId_hex}') ati oke(port)=oke('{option_1_AgentCircuitId_port_hex}') yan ip,mask,router,dns lati ọdọ awọn olumulo nibiti oke(mac)=oke('{sw_mac}') ati oke(port)=oke('{sw_port82}') yan ip,mask,router,dns lati ọdọ awọn olumulo nibiti oke(mac)=oke('{ClientMacAddress}') fi sii sinu itan (id,dt,mac,ip, comment) iye (asan, bayi(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Bayi ni alaye diẹ sii lori awọn afi:

Apakan dcpserver ṣe apejuwe awọn eto ipilẹ fun bibẹrẹ olupin naa, eyun:

  • agbalejo - kini adiresi IP ti olupin naa gbọ lori ibudo 67
  • igbohunsafefe - eyiti ip jẹ igbohunsafefe fun DHCPOFFER ati DHCPACK
  • DHCPServer – kini ip olupin DHCP
  • LeaseTime akoko yiyalo ti adiresi IP ti a fiweranṣẹ
  • ThreadLimit - melo ni awọn okun ti n ṣiṣẹ ni akoko kanna lati ṣe ilana awọn apo-iwe UDP ti nwọle lori ibudo 67. O yẹ lati ṣe iranlọwọ lori awọn iṣẹ akanṣe giga 😉
  • defaultMask,defaultRouter,defaultDNS - ohun ti a nṣe si alabapin nipasẹ aiyipada ti o ba ri IP kan ninu aaye data, ṣugbọn awọn afikun awọn paramita ko ni pato fun rẹ

apakan mysql:

ogun, olumulo, ọrọigbaniwọle, basename - ohun gbogbo soro fun ara rẹ. Ilana data isunmọ ti wa ni fifiranṣẹ lori GitHub

Abala ibeere: awọn ibeere fun gbigba OFFER/ACK jẹ apejuwe nibi:

  • offer_count - nọmba awọn laini pẹlu awọn ibeere ti o da abajade pada bi ip, boju, olulana, dns
  • offer_n - okun ìbéèrè. Ti ipadabọ ba ṣofo, lẹhinna ṣiṣẹ ibeere ipese atẹle
  • History_sql - ibeere ti o kọ, fun apẹẹrẹ, si “itan-aṣẹ” fun alabapin kan

Awọn ibeere le pẹlu eyikeyi awọn oniyipada lati apakan awọn aṣayan tabi awọn aṣayan lati Ilana DHCP.

Awọn aṣayan apakan. Eleyi jẹ ibi ti o ti n diẹ awon. Nibi a le ṣẹda awọn oniyipada ti a le lo nigbamii ni apakan ibeere.

Fun apere:

option_82_hex:sw_port1:20:22

Laini aṣẹ yii gba gbogbo laini ti o wa ni aṣayan ibeere DHCP 82, ni ọna kika hex, ni ibiti o wa lati 20 si 22 baiti pẹlu ati fi sii ni sw_port1 oniyipada tuntun (ibudo iyipada lati ibiti ibeere naa ti wa)

option_82_hex:sw_mac:26:40

, ṣalaye oniyipada sw_mac, mu hex lati iwọn 26:40

O le wo gbogbo awọn aṣayan ti o ṣee ṣe ti o le ṣee lo ninu awọn ibeere nipa bibẹrẹ olupin pẹlu -d yipada. A yoo rii nkan bi akọọlẹ yii:

--pakẹẹti DHCPINFORM kan ti de lori ibudo 67, lati 0025224ad764, b'x91xa5xe0xa3xa5xa9-x8fx8a', ('172.30.114.25', 68) {'ClientMacAddress','0025224Cd'Address':'764CdCd'Address':'00 7%"Jxd91d' , 'HType': 'Ethernet', 'HostName': b'x5xa0xe3xa5xa9xa8-x8fx43a', 'ReqListDNS': Otitọ, 'ReqListDomainName': Otitọ, 'ReqListPerfowmRouterDiscover': Otitọ, 'ReqLister'ReqListerout: True, 'ReqLister 'ReqListSubnetM beere': Otitọ, 'ReqListVendorSpecInfo': 0.0.0.0, 'RequestedIpAddress': '5.0', 'Vendor': b'MSFT 0025224', 'chaddr': '764ad172.30.128.13', 'ciadr00': 00. , 'flags': b'x172.30.114.25x308', 'giaadr': '6', 'gpoz': 1, 'hlen': 82, 'hops': 12, 'htype': 'MAC', 'magic_cookie': b'cx12Sc', 'op': 'DHCPINFORM', 'aṣayan53': 53, 'aṣayan55': 55, 'aṣayan60': 60, 'aṣayan61': 61, 'aṣayan82': 82, 'aṣayan82': 12,' option_01_byte': b'x06x00x04x00x01x00x06x02x08x00x06x00'b'x1x9x2eXx82exb12010600040001000602080006001xad','aṣayan_589_hex': '2e 82_len': 18 82, 'option_12_str': "b'x01x06x00x04x00x01x00x06x02x08x00x06x00x1x9eXx2exb768xad", 'esi': Eke, 'aaya': 0.0.0.0, 'siadr': '001', 'sw_mac': '589e2eb1ad', 'sw_port06': '89', 'xidbyte': b'

Nitorinaa, a le fi ipari si eyikeyi oniyipada ni {} ati pe yoo ṣee lo ninu ibeere SQL.

Jẹ ki a gbasilẹ fun itan-akọọlẹ pe alabara gba adiresi IP naa:

DHCP + MySQL olupin ni Python

DHCP + MySQL olupin ni Python

Bibẹrẹ olupin naa

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

- d console o wu mode DEBUG
- c <faili> faili iṣeto ni

Debriefing

Ati ni bayi awọn alaye diẹ sii lori imuse olupin ni Python. O jẹ irora. Python ti kọ ẹkọ lori fo. Ọpọlọpọ awọn akoko ni a ṣe ni ara ti “wow, bakan Mo jẹ ki o ṣiṣẹ.” Ko iṣapeye rara, ati fi silẹ ni fọọmu yii ni pataki nitori iriri kekere ni idagbasoke Python. Emi yoo gbe lori awọn aaye ti o nifẹ julọ ti imuse olupin ni “koodu”.

XML atunto faili parser

Awọn boṣewa Python module xml.dom ti lo. O dabi pe o rọrun, ṣugbọn lakoko imuse o jẹ akiyesi aini ti awọn iwe aṣẹ ti o han gbangba ati awọn apẹẹrẹ lori nẹtiwọọki nipa lilo module yii.

    igi = minidom.parse (gconfig ["config_file") mconfig = igi.getElementsByTagName ("mysql") fun elem ni mconfig: gconfig ["mysql_host"] = elem.getElementsByTagName ("ogun") [0].firstChild.data gconfig ["mysql_username"] = elem.getElementsByTagName ("orukọ olumulo") [0].firstChild.data gconfig ["mysql_password"] = elem.getElementsByTagName ("ọrọigbaniwọle") [0].firstChild.data gconfig ["mysql_basename"] = elem.getElementsByTagName ("basename") [0].firstChild.data dconfig = igi.getElementsByTagName ("dhcpserver") fun elem ni dconfig: gconfig ["igbohunsafefe"] = elem.getElementsByTagName ("igbohunsafefe") [0]. firstChild.data gconfig ["dhcp_host"] = elem.getElementsByTagName ("ogun") [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 [" ultMacp = elem.getElementsByTagName ("defaultMask") [0].firstChild.data gconfig ["dhcp_defaultRouter"] = elem.getElementsByTagName ("defaultRouter") [0] .firstChild.data gconfig ["dhcp_defaultDNS"] = elem. defaultDNS") [0] . firstChild.data qconfig = igi.getElementsByTagName ("ibeere") fun elem ni qconfig: gconfig ["offer_count"] = elem.getElementsByTagName ("offer_count") [0] . FirstChild.data fun num in ibiti (int (gconfig ["offer_count")): gconfig ["offer_"+str (nom+1)]=elem.getElementsByTagName ("offer_"+str (nom+1))[0].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName ("history_sql")[0].firstChild.data awọn aṣayan=igi.getElementsByTagName ("awọn aṣayan") fun elem ninu awọn aṣayan: node = elem.getElementsByTagName ("aṣayan") fun awọn aṣayan ni ipade ọna. : awọn aṣayanMod.append (awọn aṣayan.firstChild.data)

Multithreading

Ni iyalẹnu, multithreading ni Python ni imuse ni kedere ati irọrun.

def PacketWork(data, addr): ... # imuse ti sisọ pakẹti ti nwọle ati idahun si… lakoko Otitọ: data, addr = udp_socket.recvfrom(1024) # nduro fun okun packet UDP = threading.Thread( target=PacketWork , args=(data,addr,)))bẹrẹ() # bi o ti de - a ṣe ifilọlẹ iṣẹ PacketWork ti a ti sọ tẹlẹ ni abẹlẹ pẹlu awọn paramita nigba threading.active_count ()>gconfig["dhcp_ThreadLimit"]: akoko. sun(1) # ti nọmba ba wa ni awọn okun ti nṣiṣẹ tẹlẹ ju ninu awọn eto, a duro titi ti wọn yoo fi dinku.

Gba/firanṣẹ DHCP soso

Lati le ṣe idiwọ awọn apo-iwe UDP ti n bọ nipasẹ kaadi nẹtiwọọki, o nilo lati “gbe” iho naa:

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

, nibiti awọn asia wa:

  • AF_INET - tumọ si pe ọna kika adirẹsi yoo jẹ IP: ibudo. AF_UNIX le tun wa - nibiti a ti fun ni adirẹsi nipasẹ orukọ faili.
  • SOCK_DGRAM - tumọ si pe a ko gba “pakẹti aise” kan, ṣugbọn ọkan ti o ti kọja nipasẹ ogiriina, ati pẹlu soso gige kan. Awon. a gba nikan UDP soso lai si "ti ara" paati ti UDP packet wrapper. Ti o ba lo asia SOCK_RAW, lẹhinna iwọ yoo tun nilo lati ṣe itupalẹ “wrapper” yii.

Fifiranṣẹ apo-iwe kan le dabi igbohunsafefe:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #yipada iho si ipo igbohunsafefe rz=udp_socket.sendto(packetack, (gconfig["igbohunsafefe"],68))

, àti sí àdírẹ́sì “Níbi tí àpòpọ̀ náà ti wá”:

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # yipada iho si ipo olutẹtisi pupọ rz=udp_socket.sendto(packetack, addr)

, nibiti SOL_SOCKET tumọ si “ipele ilana” fun eto awọn aṣayan,

, SO_BROADCAST aṣayan pe apo-iṣiro ibori jẹ “igbohunsafefe”

  ,SO_REUSEADDR aṣayan yipada iho si "ọpọlọpọ awọn olutẹtisi" mode. Ni imọran, ko ṣe pataki ninu ọran yii, ṣugbọn lori ọkan ninu awọn olupin FreeBSD lori eyiti Mo ṣe idanwo, koodu ko ṣiṣẹ laisi aṣayan yii.

Ṣiṣayẹwo idii DHCP kan

Eyi ni ibi ti Mo fẹran Python gaan. O wa ni jade pe ninu apoti ti o faye gba o lati wa ni oyimbo rọ pẹlu awọn bytecode. Gbigba laaye lati tumọ ni irọrun pupọ si awọn iye eleemewa, awọn okun ati hex - i.e. eyi ni ohun ti a nilo lati loye ilana ti package naa. Nitorinaa, fun apẹẹrẹ, o le gba ọpọlọpọ awọn baiti ni HEX ati awọn baiti kan:

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

, gbe awọn baiti sinu eto kan:

res["awọn asia"]= idii ('BB',data[10],data[11])

Gba IP lati eto:

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

Ati idakeji:

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

Iyẹn ni gbogbo fun bayi 😉

orisun: www.habr.com

Fi ọrọìwòye kun