Pêşkêşkara DHCP + Mysql li Python

Pêşkêşkara DHCP + Mysql li Python

Armanca vê projeyê ev bû:

  • Fêrbûna li ser DHCP li ser torê IPv4
  • Fêrbûna Python (piçek ji sifirê zêdetir 😉)
  • şûna server DB2DHCP (çira min), orjînal vir, ku kombûna ji bo OS-ya nû her ku diçe dijwartir dibe. Û ez jê hez nakim ku ew binaryek e ku rêyek tune ku "niha biguhezîne"
  • bidestxistina serverek DHCP-ya xebitandinê ya ku bi jêhatîbûna hilbijartina navnîşana IP-ya aboneyê bi karanîna mac-ya aboneyê an veguheztina mac + portê ve girêdayî ye (Vebijarka 82)
  • nivîsandina bisîkletek din (Oh! ev çalakiya min a bijare ye)
  • li ser Habrahabr (an jî çêtir e, vexwendinek) di derbarê klûb-destê xwe de şîroveyan bistînin 😉

Encam: ew dixebite 😉 Li ser FreeBSD û Ubuntu OS-ê ceribandin. Ji hêla teorîkî ve, kod dikare were xwestin ku di bin her OS-ê de bixebite, ji ber ku Wusa dixuye ku di kodê de girêdanên taybetî tune.
Bi baldarî! Gelek tiştên din hene.

Girêdana depoyê ji bo amatoran "bi zindî bi dest xistin".

Pêvajoya sazkirin, mîhengkirin û karanîna encama "lêkolîna hardware" pir kêmtir e, û dûv re jî teoriyek piçûk di derbarê protokola DHCP de. Ji bo xwe. Û ji bo dîrokê 😉

Teoriyek piçûk

DHCP çi ye

Ev protokola torê ye ku dihêle amûrek navnîşana IP-ya xwe (û pîvanên din ên wekî dergeh, DNS, hwd.) ji serverek DHCP-ê bibîne. Paket bi karanîna protokola UDP têne veguheztin. Prensîba giştî ya xebitandina cîhazê dema ku pîvanên torê daxwaz dikin wiha ye:

  1. Amûr (mişterî) daxwazek weşana UDP (DHCPDISCOVER) li seranserê torê bi daxwaza "baş e, kesek navnîşek IP-ê bide min" dişîne. Wekî din, bi gelemperî (lê ne her gav) daxwaz ji porta 68 (çavkaniyê) pêk tê, û mebest port 67 (mebest) e. Hin cîhaz jî ji porta 67 pakêtan dişînin. Navnîşana MAC ya cîhaza muwekîlê di hundurê pakêta DHCPDISCOVER de ye.
  2. Hemî pêşkêşkerên DHCP yên ku li ser torê ne (û dibe ku çend ji wan hebin) ji bo cîhaza ku DHCPDISCOVER şandiye pêşniyarek DHCPOFFER bi mîhengên torê ava dikin, û di heman demê de wê li ser torê jî belav dikin. Nasnameya ku ev pakêt ji bo kê tê armanc kirin li ser bingeha navnîşana MAC ya xerîdar e ku berê di daxwaznameya DHCPDISCOVER de hatî peyda kirin.
  3. Xerîdar pakêtên bi pêşniyarên mîhengên torê qebûl dike, ya herî balkêş hildibijêre (pîvan dibe ku cûda bin, wek nimûne, dema radestkirina pakêtê, hejmara rêyên navîn), û bi mîhengên torê re "daxwaza fermî" DHCPREQUEST dike. ji servera DHCP ku ew jê hez dike. Di vê rewşê de, pakêt diçe serverek DHCP ya taybetî.
  4. Pêşkêşkara ku DHCPREQUEST wergirtiye pakêtek formata DHCPACK dişîne, ku tê de ew careke din mîhengên torê yên ku ji bo vê muwekîlê hatine armanc kirin navnîş dike.

Pêşkêşkara DHCP + Mysql li Python

Wekî din, pakêtên DHCPINFORM hene ku ji xerîdar têne, û mebesta wan ew e ku servera DHCP agahdar bike ku "muwekîlê sax e" û mîhengên torê yên hatî derxistin bikar tîne. Di pêkanîna vê serverê de, ev pakêt têne paşguh kirin.

Forma pakêtê

Bi gelemperî, çarçoveyek pakêtek Ethernet bi vî rengî xuya dike:

Pêşkêşkara DHCP + Mysql li Python

Di doza me de, em ê tenê daneyan rasterast ji naveroka pakêta UDP-ê, bêyî sernavên protokola qata OSI, ango avahiya DHCP-ê binirxînin:

DHCPDISCOVER

Ji ber vê yekê, pêvajoya wergirtina navnîşana IP-ya ji bo amûrekê bi xerîdar DHCP re dest pê dike ku daxwaznameyek weşanê ji porta 68-ê berbi 255.255.255.255:67 dişîne. Di vê pakêtê de, xerîdar navnîşana MAC-a xwe vedihewîne, û her weha tiştê ku ew bi rastî dixwaze ji servera DHCP bistîne. Avahiya pakêtê di tabloya jêrîn de tête diyar kirin.

Tabloya Structure Packet DHCPDISCOVER

Position di pakêtê de
Navê nirxê
Nimûne:
Pîrozbahiyê
Byte
Ravekirin

1
Daxwaza Boot
1
Hex
1
Cureyê peyamê. 1 - Daxwaza ji muwekîlê ji serverê re, 2 - bersiv ji serverek ji xerîdar re

2
Cureyê hardware
1
Hex
1
Cureya navnîşana hardware, di vê protokolê de 1 - MAC

3
Dirêjahiya navnîşanên Hardware
6
Hex
1
Dirêjahiya navnîşana MAC a cîhazê

4
Hops
1
Hex
1
Hejmara rêyên navîn

5
Nasnameya danûstendinê
23:cf:de:1d
Hex
4
Nasnameya danûstendinê ya bêhempa. Di destpêka operasyona daxwaznameyê de ji hêla xerîdar ve hatî çêkirin

7
Duyemîn derbas bû
0
Hex
4
Dem di çirkeyan de ji destpêka pêvajoya bidestxistina navnîşanek

9
alên Boot
0
Hex
2
Hin alên ku dikarin werin danîn da ku pîvanên protokolê destnîşan bikin

11
Navnîşana IP-ya Xerîdar
0.0.0.0
Xet
4
Navnîşana IP-ya xerîdar (heke hebe)

15
Navnîşana IP-ya muwekîlê we
0.0.0.0
Xet
4
Navnîşana IP ya ku ji hêla serverê ve hatî pêşkêş kirin (heke hebe)

19
Navnîşana IP-ya serverê ya paşîn
0.0.0.0
Xet
4
Navnîşana IP-ya serverê (heke tê zanîn)

23
Navnîşana IP-ya nûnerê veguhestin
172.16.114.41
Xet
4
Navnîşana IP ya kargêrê relay (mînak, veguhezek)

27
Navnîşana MAC ya Xerîdar
14:d6:4d:a7:c9:55
Hex
6
Navnîşana MAC ya şanderê pakêtê (mişterî)

31
Daxistina navnîşana hardware ya xerîdar
 
Hex
10
Kursiyê parastiye. Bi gelemperî bi sifiran têne dagirtin

41
Navê mêvandarê serverê
 
Xet
64
Navê servera DHCP. Bi gelemperî nayê veguheztin

105
Navê pelê boot
 
Xet
128
Navê pelê li ser serverê ku dema bootkirinê ji hêla qereqolên bê dîsk ve tê bikar anîn

235
Cookies Magic
63: 82: 53: 63
Hex
4
Hejmara "Magic", li gorî ku, di nav de. hûn dikarin diyar bikin ku ev pakêt girêdayî protokola DHCP ye

Vebijarkên DHCP. Di her rêzê de dikare biçe

236
Hejmara vebijêrkê
53
Dec
1
Vebijêrk 53, ku celebê pakêtê DHCP diyar dike

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

 
Dirêjahiya Option
1
Dec
1

 
nirxa vebijêrkê
1
Dec
1

 
Hejmara vebijêrkê
50
Dec
1
Xerîdar dixwaze kîjan navnîşana IP-ê bistîne?

 
Dirêjahiya Option
4
Dec
1

 
nirxa vebijêrkê
172.16.134.61
Xet
4

 
Hejmara vebijêrkê
55
 
1
Parametreyên torê yên ku ji hêla xerîdar ve têne xwestin. Pêkhatin dikare cûda bibe

01 - Maskeya torê
03 - Dergeh
06 - DNS
oc - Navê mêvandar
0f - navê domaina torê
1c - navnîşana daxwaza weşanê (weşan)
42 - Navê servera TFTP
79 - Rêya statîkî ya bê çîn

 
Dirêjahiya Option
8
 
1

 
nirxa vebijêrkê
01:03:06:0c:0f:1c:42:79
 
8

 
Hejmara vebijêrkê
82
Dec
 
Vebijêrk 82, ku navnîşana MAC-ê ya cîhaza dubareker û hin nirxên din veguhezîne.

Pir caran, ev porta guhastinê ye ku xerîdar DHCP-ya dawî lê dimeşe. Ev vebijark pîvanên din jî dihewîne. Bîteya yekem hejmara "binvebijarkê" ye, ya duyemîn dirêjahiya wê ye, paşê nirxa wê ye.

Di vê rewşê de, di vebijarka 82-an de, vebijarkên jêrîn têne hêlîn kirin:
Agent Circuit ID = 00:04:00:01:00:04, ku du baytên paşîn porta xerîdar DHCP-ê ye ku daxwaz jê hatî ye.

Agent Remote ID = 00:06:c8:be:19:93:11:48 - Navnîşana MAC ya cîhaza dubareker DHCP

 
Dirêjahiya Option
18
Dec
 

 
nirxa vebijêrkê
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Dawiya pakêtê
255
Dec
1
255 dawiya pakêtê nîşan dide

DHCPOFFER

Hema ku server pakêta DHCPDISCOVER distîne û heke bibîne ku ew dikare ji ya daxwazkirî tiştek pêşkêşî xerîdar bike, wê hingê ew bersivek jê re çêdike - DHCPDISCOVER. Bersiv ji benderê "ji ku derê hat", bi weşanê tê şandin, ji ber di vê gavê de, xerîdar hîn ne xwediyê navnîşek IP-yê ye, ji ber vê yekê ew tenê dikare pakêtê qebûl bike heke ew bi weşanê were şandin. Xerîdar bi navnîşana MAC-a xwe ya di hundurê pakêtê de, û her weha jimara danûstendinê ya ku di dema çêkirina pakêta yekem de çêdike, ji bo wî pakêtek e.

Tabloya Structure Packet DHCPOFFER

Position di pakêtê de
Navê nirxê (hevbeş)
Nimûne:
Pîrozbahiyê
Byte
Ravekirin

1
Daxwaza Boot
1
Hex
1
Cureyê peyamê. 1 - Daxwaza ji muwekîlê ji serverê re, 2 - bersiv ji serverek ji xerîdar re

2
Cureyê hardware
1
Hex
1
Cureya navnîşana hardware, di vê protokolê de 1 - MAC

3
Dirêjahiya navnîşanên Hardware
6
Hex
1
Dirêjahiya navnîşana MAC a cîhazê

4
Hops
1
Hex
1
Hejmara rêyên navîn

5
Nasnameya danûstendinê
23:cf:de:1d
Hex
4
Nasnameya danûstendinê ya bêhempa. Di destpêka operasyona daxwaznameyê de ji hêla xerîdar ve hatî çêkirin

7
Duyemîn derbas bû
0
Hex
4
Dem di çirkeyan de ji destpêka pêvajoya bidestxistina navnîşanek

9
alên Boot
0
Hex
2
Hin alên ku dikarin werin danîn da ku pîvanên protokolê destnîşan bikin. Di vê rewşê de, 0 tê wateya celebê daxwaza Unicast

11
Navnîşana IP-ya Xerîdar
0.0.0.0
Xet
4
Navnîşana IP-ya xerîdar (heke hebe)

15
Navnîşana IP-ya muwekîlê we
172.16.134.61
Xet
4
Navnîşana IP ya ku ji hêla serverê ve hatî pêşkêş kirin (heke hebe)

19
Navnîşana IP-ya serverê ya paşîn
0.0.0.0
Xet
4
Navnîşana IP-ya serverê (heke tê zanîn)

23
Navnîşana IP-ya nûnerê veguhestin
172.16.114.41
Xet
4
Navnîşana IP ya kargêrê relay (mînak, veguhezek)

27
Navnîşana MAC ya Xerîdar
14:d6:4d:a7:c9:55
Hex
6
Navnîşana MAC ya şanderê pakêtê (mişterî)

31
Daxistina navnîşana hardware ya xerîdar
 
Hex
10
Kursiyê parastiye. Bi gelemperî bi sifiran têne dagirtin

41
Navê mêvandarê serverê
 
Xet
64
Navê servera DHCP. Bi gelemperî nayê veguheztin

105
Navê pelê boot
 
Xet
128
Navê pelê li ser serverê ku dema bootkirinê ji hêla qereqolên bê dîsk ve tê bikar anîn

235
Cookies Magic
63: 82: 53: 63
Hex
4
Hejmara "Magic", li gorî ku, di nav de. hûn dikarin diyar bikin ku ev pakêt girêdayî protokola DHCP ye

Vebijarkên DHCP. Di her rêzê de dikare biçe

236
Hejmara vebijêrkê
53
Dec
1
Vebijêrk 53, ku celebê pakêtê DHCP 2 diyar dike - DHCPOFFER

 
Dirêjahiya Option
1
Dec
1

 
nirxa vebijêrkê
2
Dec
1

 
Hejmara vebijêrkê
1
Dec
1
Vebijêrk ku ji xerîdar DHCP re maskek torê pêşkêşî dike

 
Dirêjahiya Option
4
Dec
1

 
nirxa vebijêrkê
255.255.224.0
Xet
4

 
Hejmara vebijêrkê
3
Dec
1
Vebijêrk ku ji xerîdar DHCP re dergehek xwerû pêşkêş dike

 
Dirêjahiya Option
4
Dec
1

 
nirxa vebijêrkê
172.16.12.1
Xet
4

 
Hejmara vebijêrkê
6
Dec
1
Vebijarka ku DHCP ji xerîdar DNS re pêşkêş dike

 
Dirêjahiya Option
4
Dec
1

 
nirxa vebijêrkê
8.8.8.8
Xet
4

 
Hejmara vebijêrkê
51
Dec
1
Jiyana pîvanên torê yên hatine derxistin di çirkeyan de, piştî ku xerîdar DHCP divê wan dîsa bixwaze

 
Dirêjahiya Option
4
Dec
1

 
nirxa vebijêrkê
86400
Dec
4

 
Hejmara vebijêrkê
82
Dec
1
Vebijêrk 82, tiştê ku di DHCPDISCOVER de hatî dubare dike

 
Dirêjahiya Option
18
Dec
1

 
nirxa vebijêrkê
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Dec
18

 
Dawiya pakêtê
255
Dec
1
255 dawiya pakêtê nîşan dide

DHCPREQUEST

Piştî ku xerîdar DHCPOFFER-ê distîne, ew pakêtek çêdike ku daxwaza parametreyên torê dike ne ji hemî pêşkêşkerên DHCP-ê yên li ser torê, lê tenê ji yek taybetî re, ku ew pêşniyara DHCPOFFER-ê herî zêde "eciband" dike. Pîvanên "wek" dikarin cûda bin û bi pêkanîna DHCP-ê ya xerîdar ve girêdayî ye. Wergerê daxwazê ​​bi karanîna navnîşana MAC ya servera DHCP tête diyar kirin. Di heman demê de, pakêtek DHCPREQUEST dikare ji hêla xerîdar ve bêyî ku pêşî DHCPDISCOVER çêbike, were şandin, heke navnîşana IP-ya serverê berê hatî wergirtin.

DHCPREQUEST Tabloya Structure Packet

Position di pakêtê de
Navê nirxê (hevbeş)
Nimûne:
Pîrozbahiyê
Byte
Ravekirin

1
Daxwaza Boot
1
Hex
1
Cureyê peyamê. 1 - Daxwaza ji muwekîlê ji serverê re, 2 - bersiv ji serverek ji xerîdar re

2
Cureyê hardware
1
Hex
1
Cureya navnîşana hardware, di vê protokolê de 1 - MAC

3
Dirêjahiya navnîşanên Hardware
6
Hex
1
Dirêjahiya navnîşana MAC a cîhazê

4
Hops
1
Hex
1
Hejmara rêyên navîn

5
Nasnameya danûstendinê
23:cf:de:1d
Hex
4
Nasnameya danûstendinê ya bêhempa. Di destpêka operasyona daxwaznameyê de ji hêla xerîdar ve hatî çêkirin

7
Duyemîn derbas bû
0
Hex
4
Dem di çirkeyan de ji destpêka pêvajoya bidestxistina navnîşanek

9
alên Boot
8000
Hex
2
Hin alên ku dikarin werin danîn da ku pîvanên protokolê destnîşan bikin. Di vê rewşê de, "weşan" tê danîn

11
Navnîşana IP-ya Xerîdar
0.0.0.0
Xet
4
Navnîşana IP-ya xerîdar (heke hebe)

15
Navnîşana IP-ya muwekîlê we
172.16.134.61
Xet
4
Navnîşana IP ya ku ji hêla serverê ve hatî pêşkêş kirin (heke hebe)

19
Navnîşana IP-ya serverê ya paşîn
0.0.0.0
Xet
4
Navnîşana IP-ya serverê (heke tê zanîn)

23
Navnîşana IP-ya nûnerê veguhestin
172.16.114.41
Xet
4
Navnîşana IP ya kargêrê relay (mînak, veguhezek)

27
Navnîşana MAC ya Xerîdar
14:d6:4d:a7:c9:55
Hex
6
Navnîşana MAC ya şanderê pakêtê (mişterî)

31
Daxistina navnîşana hardware ya xerîdar
 
Hex
10
Kursiyê parastiye. Bi gelemperî bi sifiran têne dagirtin

41
Navê mêvandarê serverê
 
Xet
64
Navê servera DHCP. Bi gelemperî nayê veguheztin

105
Navê pelê boot
 
Xet
128
Navê pelê li ser serverê ku dema bootkirinê ji hêla qereqolên bê dîsk ve tê bikar anîn

235
Cookies Magic
63: 82: 53: 63
Hex
4
Hejmara "Magic", li gorî ku, di nav de. hûn dikarin diyar bikin ku ev pakêt girêdayî protokola DHCP ye

Vebijarkên DHCP. Di her rêzê de dikare biçe

236
Hejmara vebijêrkê
53
Dec
3
Vebijêrk 53, ku celebê pakêta DHCP 3 - DHCPREQUEST diyar dike

 
Dirêjahiya Option
1
Dec
1

 
nirxa vebijêrkê
3
Dec
1

 
Hejmara vebijêrkê
61
Dec
1
Nasnameya Xerîdar: 01 (ji bo Ehernet) + navnîşana MAC-ya xerîdar

 
Dirêjahiya Option
7
Dec
1

 
nirxa vebijêrkê
01:2c:ab:25:ff:72:a6
Hex
7

 
Hejmara vebijêrkê
60
Dec
 
"Nasnameya pola firoşkar". Di doza min de, ew guhertoya xerîdar DHCP radigihîne. Dibe ku amûrên din tiştek cûda vegerînin. Windows ji bo nimûne MSFT 5.0 rapor dike

 
Dirêjahiya Option
11
Dec
 

 
nirxa vebijêrkê
udhcp 0.9.8
Xet
 

 
Hejmara vebijêrkê
55
 
1
Parametreyên torê yên ku ji hêla xerîdar ve têne xwestin. Pêkhatin dikare cûda bibe

01 - Maskeya torê
03 - Dergeh
06 - DNS
oc - Navê mêvandar
0f - navê domaina torê
1c - navnîşana daxwaza weşanê (weşan)
42 - Navê servera TFTP
79 - Rêya statîkî ya bê çîn

 
Dirêjahiya Option
8
 
1

 
nirxa vebijêrkê
01:03:06:0c:0f:1c:42:79
 
8

 
Hejmara vebijêrkê
82
Dec
1
Vebijêrk 82, tiştê ku di DHCPDISCOVER de hatî dubare dike

 
Dirêjahiya Option
18
Dec
1

 
nirxa vebijêrkê
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Dec
18

 
Dawiya pakêtê
255
Dec
1
255 dawiya pakêtê nîşan dide

DHCPACK

Wekî piştrastkirina ku "erê, rast e, ev navnîşana IP-ya we ye, û ez ê wê nedim kesek din" ji servera DHCP, pakêtek bi formata DHCPACK ji serverê heya xerîdar re xizmetê dike. Ew wekî pakêtên din weşan tê şandin. Her çend, di koda jêrîn de ji bo serverek DHCP-ya ku li Python-ê hatî bicîh kirin, tenê di rewşê de, ez her daxwazek weşanê dubare dikim bi şandina pakêtek ji IP-ya xerîdarek taybetî re, heke ew jixwe tê zanîn. Wekî din, servera DHCP qet ferq nake ka pakêta DHCPACK gihîştiye xerîdar. Ger xerîdar DHCPACK-ê nestîne, wê hingê piştî demekê ew bi tenê DHCPREQUEST dubare dike

Tabloya Structure Packet DHCPACK

Position di pakêtê de
Navê nirxê (hevbeş)
Nimûne:
Pîrozbahiyê
Byte
Ravekirin

1
Daxwaza Boot
2
Hex
1
Cureyê peyamê. 1 - Daxwaza ji muwekîlê ji serverê re, 2 - bersiv ji serverek ji xerîdar re

2
Cureyê hardware
1
Hex
1
Cureya navnîşana hardware, di vê protokolê de 1 - MAC

3
Dirêjahiya navnîşanên Hardware
6
Hex
1
Dirêjahiya navnîşana MAC a cîhazê

4
Hops
1
Hex
1
Hejmara rêyên navîn

5
Nasnameya danûstendinê
23:cf:de:1d
Hex
4
Nasnameya danûstendinê ya bêhempa. Di destpêka operasyona daxwaznameyê de ji hêla xerîdar ve hatî çêkirin

7
Duyemîn derbas bû
0
Hex
4
Dem di çirkeyan de ji destpêka pêvajoya bidestxistina navnîşanek

9
alên Boot
8000
Hex
2
Hin alên ku dikarin werin danîn da ku pîvanên protokolê destnîşan bikin. Di vê rewşê de, "weşan" tê danîn

11
Navnîşana IP-ya Xerîdar
0.0.0.0
Xet
4
Navnîşana IP-ya xerîdar (heke hebe)

15
Navnîşana IP-ya muwekîlê we
172.16.134.61
Xet
4
Navnîşana IP ya ku ji hêla serverê ve hatî pêşkêş kirin (heke hebe)

19
Navnîşana IP-ya serverê ya paşîn
0.0.0.0
Xet
4
Navnîşana IP-ya serverê (heke tê zanîn)

23
Navnîşana IP-ya nûnerê veguhestin
172.16.114.41
Xet
4
Navnîşana IP ya kargêrê relay (mînak, veguhezek)

27
Navnîşana MAC ya Xerîdar
14:d6:4d:a7:c9:55
Hex
6
Navnîşana MAC ya şanderê pakêtê (mişterî)

31
Daxistina navnîşana hardware ya xerîdar
 
Hex
10
Kursiyê parastiye. Bi gelemperî bi sifiran têne dagirtin

41
Navê mêvandarê serverê
 
Xet
64
Navê servera DHCP. Bi gelemperî nayê veguheztin

105
Navê pelê boot
 
Xet
128
Navê pelê li ser serverê ku dema bootkirinê ji hêla qereqolên bê dîsk ve tê bikar anîn

235
Cookies Magic
63: 82: 53: 63
Hex
4
Hejmara "Magic", li gorî ku, di nav de. hûn dikarin diyar bikin ku ev pakêt girêdayî protokola DHCP ye

Vebijarkên DHCP. Di her rêzê de dikare biçe

236
Hejmara vebijêrkê
53
Dec
3
Vebijêrk 53, ku celebê pakêta DHCP 5 - DHCPACK diyar dike

 
Dirêjahiya Option
1
Dec
1

 
nirxa vebijêrkê
5
Dec
1

 
Hejmara vebijêrkê
1
Dec
1
Vebijêrk ku ji xerîdar DHCP re maskek torê pêşkêşî dike

 
Dirêjahiya Option
4
Dec
1

 
nirxa vebijêrkê
255.255.224.0
Xet
4

 
Hejmara vebijêrkê
3
Dec
1
Vebijêrk ku ji xerîdar DHCP re dergehek xwerû pêşkêş dike

 
Dirêjahiya Option
4
Dec
1

 
nirxa vebijêrkê
172.16.12.1
Xet
4

 
Hejmara vebijêrkê
6
Dec
1
Vebijarka ku DHCP ji xerîdar DNS re pêşkêş dike

 
Dirêjahiya Option
4
Dec
1

 
nirxa vebijêrkê
8.8.8.8
Xet
4

 
Hejmara vebijêrkê
51
Dec
1
Jiyana pîvanên torê yên hatine derxistin di çirkeyan de, piştî ku xerîdar DHCP divê wan dîsa bixwaze

 
Dirêjahiya Option
4
Dec
1

 
nirxa vebijêrkê
86400
Dec
4

 
Hejmara vebijêrkê
82
Dec
1
Vebijêrk 82, tiştê ku di DHCPDISCOVER de hatî dubare dike

 
Dirêjahiya Option
18
Dec
1

 
nirxa vebijêrkê
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Dec
18

 
Dawiya pakêtê
255
Dec
1
255 dawiya pakêtê nîşan dide

mîhengê

Sazkirin bi rastî ji sazkirina modulên python ên ku ji bo xebatê hewce ne pêk tê. Tê texmîn kirin ku MySQL jixwe hatî saz kirin û mîheng kirin.

FreeBSD

pkg python3 python3 saz bike -m surepip pip3 girêdana mysql saz bike

Ubuntu

sudo apt-get saz bike python3 sudo apt-get saz bike pip3 sudo pip3 saz bike mysql-connector

Em danegehek MySQL diafirînin, pydhcp.sql dumpê tê de bar dikin, û pelê veavakirinê mîheng dikin.

Guhertin

Hemî mîhengên serverê di pelek xml de ne. Pela referansê:

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 îmtîhan îmtîhan 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 ip, mask, router, dns ji bikarhêneran hilbijêrin ku jorîn(mac)=jor('{option_3_AgentRemoteId_hex}') û jorîn(port)=jor('{option_1_AgentCircuitId_port_hex}') ip, mask, router, dns ji bikarhêneran hilbijêrin ku jorîn(mac)=jor('{sw_mac}') û jorîn(port)=jor('{sw_port82}') ip, mask, router, dns ji bikarhêneran hilbijêrin ku jorîn(mac)=jor('{ClientMacAddress}') nirxan têxe dîrokê (id, dt, mac, ip, şîrove) (null, niha(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Naha bi hûrgulî li ser etîketan:

Beşa dhcpserver mîhengên bingehîn ên ji bo destpêkirina serverê vedibêje, bi taybetî:

  • mêvandar - kîjan navnîşana IP-yê server li porta 67-ê guhdarî dike
  • weşan - kîjan ip ji bo DHCPOFFER û DHCPACK weşana ye
  • DHCPServer - ip-ya servera DHCP çi ye
  • LeaseTime dema kirêkirina navnîşana IP-ya hatî weşandin
  • ThreadLimit - çend mijar bi hevdemî dimeşin da ku pakêtên UDP-ê yên hatinî li porta 67 bişopînin. Tê texmîn kirin ku ew di projeyên bargiraniya bilind de bibe alîkar 😉
  • defaultMask,defaultRouter,defaultDNS - heke IP-yek di databasê de were dîtin, çi ji hêla xwerû ve ji aboneyê re tê pêşkêş kirin, lê pîvanên din ji bo wê nehatine diyar kirin

beşa mysql:

mêvandar, navê bikarhêner, şîfre, navê bingehîn - her tişt ji bo xwe dipeyive. Strukturek databasê ya texmînî li ser hatî şandin GitHub

Beşa pirsê: Daxwazên wergirtina PÊŞNIYAR / ACK li vir têne diyar kirin:

  • offer_count - hejmara rêzikên bi daxwazên ku encamek mîna ip, mask, router, dns vedigerînin
  • pêşniyar_n - rêzika pirsê. Ger veger vala ye, wê hingê daxwaza pêşniyara jêrîn pêk tîne
  • history_sql - pirsek ku ji bo aboneyek, wek nimûne, li "dîroka destûrnameyê" dinivîse.

Daxwaz dikarin her guhêrbar ji beşa vebijarkan an vebijarkên ji protokola DHCP vehewînin.

Beşa Vebijarkan. Li vir balkêştir dibe. Li vir em dikarin guhêrbaran biafirînin ku em dikarin paşê di beşa pirsê de bikar bînin.

Bo nimûne:

option_82_hex:sw_port1:20:22

, ev rêza fermanê tevahiya rêza ku di vebijarka daxwaza DHCP 82 de hatî, di forma hex de, di navberê de ji 20 heta 22 bayt tê de digire û wê dixe nav guhêrbara nû sw_port1 (porta guheztina ku daxwaz jê hatî)

option_82_hex:sw_mac:26:40

, guherbara sw_mac pênase bike, hex ji rêza 26:40 bigire

Hûn dikarin hemî vebijarkên gengaz ên ku dikarin di pirsan de werin bikar anîn bi destpêkirina serverê bi guheztina -d bibînin. Em ê tiştek mîna vê têketinê bibînin:

--pakêtek DHCPINFORM hat porta 67, ji 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress': '0025224yMacAddress': '764yMaddress': '00yMacaddress': '7yMaddress', '91yMaddress', '5yMac0', '3yMaddress', '5yMaddress', '9yMaddress', '8yMac', '8yMaddress': '43ad0.0.0.0' % "Jxd5.0d", 'HTYPE': 'Ethernet', 'hostname': b'x0025224xa764xa172.30.128.13-x00fx00a ', rasteqîn,' reqlistfowmrouterdiscover ': Rast,' reqliststaticroute ': Rast e,' ReqListSubnetMask ': Rast, 'ReqListVendorSpecInfo': 172.30.114.25, 'RequestedIpAddress': '308', 'Verfiroş': b'MSFT 6', 'chaddr': '1ad82', '12': '12': '53. alên ': b'x53x55', 'giaddr': '55', 'gpoz': 60, 'hlen': 60, 'hops': 61, 'htype': 'MAC', 'cookie_magic': b' cx61Sc ', 'op': 'DHCPINFORM', 'option82': 82, 'option82': 12, 'option01': 06, 'option00': 04, 'option00': 01, 'option00': 06, 'option_02_byte' : b'x08x00x06x00x1x9x2x82x12010600040001000602080006001x589x2x82' b'x18x82x12eXx01exb06xad', 'option_00_hex': '04', '00' 01, 'option_00_str': "b'x06x02x08x00x06x00x1x9x2x768x0.0.0.0x001x589x2x1eXx06exb89xad'", 'encam': Derew, 'seks': 8, 'siaddr' : '3', 'sw_mac': '897e8eb0.0.0.0ad', 'sw_portXNUMX': 'XNUMX', 'xidbyte': b'

Li gorî vê yekê, em dikarin her guhêrbar di {} de bipêçin û ew ê di pirsa SQL de were bikar anîn.

Ka em ji bo dîrokê tomar bikin ku xerîdar navnîşana IP-yê wergirtiye:

Pêşkêşkara DHCP + Mysql li Python

Pêşkêşkara DHCP + Mysql li Python

Server dest pê dike

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

- d moda derketina konsolê DEBUG
- c <navê pelê> pelê veavakirinê

Debriefing

Û naha bêtir hûrgulî li ser pêkanîna serverê li Python. Ew êş e. Python di firînê de hîn bû. Gelek dem bi şêwaza "wey, bi rengekî min ew kir" têne çêkirin. Bi tevahî ne xweşbîn kirin, û bi taybetî ji ber ezmûna hindik a di pêşkeftina Python de bi vî rengî hişt. Ez ê di "kodê" de li ser aliyên herî balkêş ên pêkanîna serverê bisekinim.

Parsera pelê veavakirina XML

Modula standard Python xml.dom tê bikaranîn. Ew hêsan xuya dike, lê di dema bicîhkirinê de kêmasiyek berbiçav a belge û nimûneyên zelal li ser torê bi karanîna vê modulê hebû.

    dar = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") ji bo elem di mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].dast gconfig["mysql_username"]=elem.getElementsByTagName("navê bikarhêner")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("şîfre")[0].firstqlconfigeChild. =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") ji bo elem di dconfig: gconfig["broadcast"]=elem.getElementsByTagName.)"(0)"(0)" firstChild.data gconfig["dhcp_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["dhcp_LeaseTime"]=elem.getElementsByTagName("LeaseTime")[0]configd.firtast dhcp_ThreadLimit"]=int(elem.getElementsByTagName("ThreadLimit")[0].firstChild.data) gconfig["dhcp_Server"]=elem.getElementsByTagName("DHCPSPerver")[0]configd]. =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig[eult.NSa defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("pirsîn") ji bo elemê di qconfig de: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[1].firstChild.data bo num range(int(gconfig["offer_count"]): gconfig["offer_"+str(num+1)]=elem.getElementsByTagName("offer_"+str(hejmar+0))[0].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[XNUMX].firstChild.data options=tree.getElementsByTagName("options") ji bo elem di vebijarkan de: node=elem.getElementsByTagName")(vebijarkên)" : optionsMod.append(options.firstChild.data)

Multithreading

Pir ecêb e, pirzimanî di Python de pir zelal û sade tê pêkanîn.

def PacketWork(data,addr): ... # pêkanîna parskirina pakêta tê û bersivdana wê ... dema ku Rast e: dane, addr = udp_socket.recvfrom(1024) # li benda pakêta UDP-ê xêza = xêzkirin. Mijarek( target=PacketWork, args=(data,addr,)).start() # wek ku hat - dema threading.active_count() >gconfig["dhcp_ThreadLimit"]: dem, em fonksiyona PacketWork ya berê diyarkirî bi parameteran di paşperdeyê de dest pê dikin. xew (1) # heke hejmar Ji mîhengan zêdetir mijarên berê dimeşin, em li bendê ne ku ji wan kêmtir bin

Pakêta DHCP bistînin / bişînin

Ji bo ku hûn pakêtên UDP yên ku bi qerta torê ve têne asteng kirin, hûn hewce ne ku soketê "rabikin":

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

, ku al ev in:

  • AF_INET - tê vê wateyê ku forma navnîşê dê IP be: port. Di heman demê de dibe ku AF_UNIX jî hebe - ku navnîş bi navê pelê tê dayîn.
  • SOCK_DGRAM - tê vê wateyê ku em "pakêtek xav" napejirînin, lê ya ku berê di dîwarê agir de derbas bûye, û bi pakêtek qismî qutkirî ye. Ewan. em tenê pakêtek UDP bêyî beşê "fizîkî" ya pakêta pakêta UDP distînin. Ger hûn ala SOCK_RAW bikar bînin, wê hingê hûn ê jî hewce bikin ku vê "pêça" parsek bikin.

Şandina pakêtek dikare wekî weşanek be:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #switch socket bo moda weşanê rz=udp_socket.sendto(packetack, (gconfig["weşan"],68))

, û navnîşana "pakêtê ji ku hat":

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # soketê veguherîne moda pir-guhdar rz=udp_socket.sendto(packetack, addr)

, ku SOL_SOCKET tê wateya "asta protokolê" ji bo vebijarkan,

, Vebijarka SO_BROADCAST ku pakêta helmet "weşan" e

  Vebijarka SO_REUSEADDR soketê vediguherîne moda "gelek guhdaran". Di teorîyê de, di vê rewşê de ne hewce ye, lê li ser yek ji serverên FreeBSD ku min ceriband, kod bêyî vê vebijarkê nexebitî.

Parskirina pakêtek DHCP

Li vir min pir ji Python hez kir. Derket holê ku ji qutîkê ew dihêle hûn bi bytekodê re pir maqûl bin. Destûrê dide ku ew pir bi hêsanî di nirx, rêz û heksan de were wergerandin - ango. Ya ku em bi rastî hewce ne ku em avahiya pakêtê fam bikin ev e. Ji ber vê yekê, mînakî, hûn dikarin di HEX-ê de rêzek byte û tenê bytes bistînin:

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

, bytes di nav avahiyek de pak bikin:

res["flags"]=pack('BB',data[10],data[11])

IP-ê ji avahiyê bistînin:

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

Û berevajî:

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

Ji bo niha ev hemû 😉

Source: www.habr.com

Add a comment