şû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:
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.
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.
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î.
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.
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:
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
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
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
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
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
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:
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:
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":
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))
, 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: