sostituzzjoni tas-server DB2DHCP (furketta tiegħi), oriġinali hawn, li qed issir aktar u aktar diffiċli biex tinġabar għall-OS il-ġdid. U ma nħobbx li hija binarja li m'hemm l-ebda mod kif "jinbidel issa"
il-ksib ta' server DHCP li jaħdem bil-kapaċità li jagħżel l-indirizz IP tal-abbonat billi juża l-mac tal-abbonat jew il-kombinazzjoni tal-mac+port tal-iswiċċ (Għażla 82)
nikteb rota oħra (Oh! din hija l-attività favorita tiegħi)
tirċievi kummenti dwar l-idejn tal-klabb tiegħek fuq Habrahabr (jew aħjar, stedina) 😉
Riżultat: jaħdem 😉 Ittestjat fuq FreeBSD u Ubuntu OS. Teoretikament, il-kodiċi jista 'jiġi mitlub jaħdem taħt kwalunkwe OS, għaliex Jidher li m'hemm l-ebda rbit speċifiku fil-kodiċi.
B'attenzjoni! Hemm ħafna aktar li ġejjin.
Link għar-repożitorju għad-dilettanti "mess ħaj".
Il-proċess ta 'installazzjoni, konfigurazzjoni u użu tar-riżultat ta' "studju tal-ħardwer" huwa ħafna aktar baxx, u mbagħad ftit teorija dwar il-protokoll DHCP. Għalija nnifsi. U għall-istorja 😉
Ftit teorija
X'inhu DHCP
Dan huwa protokoll tan-netwerk li jippermetti li apparat isib l-indirizz IP tiegħu (u parametri oħra bħal gateway, DNS, eċċ.) minn server DHCP. Il-pakketti jiġu skambjati bl-użu tal-protokoll UDP. Il-prinċipju ġenerali tat-tħaddim tal-apparat meta titlob il-parametri tan-netwerk huwa kif ġej:
L-apparat (klijent) jibgħat talba ta’ xandir UDP (DHCPDISCOVER) fin-netwerk kollu bit-talba “tajjeb, xi ħadd agħtini indirizz IP.” Barra minn hekk, normalment (iżda mhux dejjem) it-talba sseħħ mill-port 68 (sors), u d-destinazzjoni hija l-port 67 (destinazzjoni). Xi apparati wkoll jibagħtu pakketti mill-port 67. L-indirizz MAC tal-apparat tal-klijent huwa inkluż ġewwa l-pakkett DHCPDISCOVER.
Is-servers DHCP kollha li jinsabu fin-netwerk (u jista 'jkun hemm diversi minnhom) jiffurmaw offerta DHCPOFFER b'settings tan-netwerk għall-apparat li bagħat DHCPDISCOVER, u wkoll xandruha fuq in-netwerk. L-identifikazzjoni ta' min huwa maħsub għal dan il-pakkett hija bbażata fuq l-indirizz MAC tal-klijent ipprovdut aktar kmieni fit-talba DHCPDISCOVER.
Il-klijent jaċċetta pakketti bi proposti għal settings tan-netwerk, jagħżel l-aktar wieħed attraenti (il-kriterji jistgħu jkunu differenti, pereżempju, il-ħin tal-kunsinna tal-pakketti, in-numru ta 'rotot intermedji), u jagħmel "talba uffiċjali" DHCPREQUEST mas-settings tan-netwerk mis-server DHCP li jħobb. F'dan il-każ, il-pakkett imur għal server DHCP speċifiku.
Is-server li rċieva d-DHCPREQUEST jibgħat pakkett tal-format DHCPACK, li fih għal darb'oħra jelenka s-settings tan-netwerk maħsuba għal dan il-klijent
Barra minn hekk, hemm pakketti DHCPINFORM li ġejjin mill-klijent, u l-iskop tagħhom huwa li jinforma lis-server DHCP li l-"klijent huwa ħaj" u qed juża s-settings tan-netwerk maħruġa. Fl-implimentazzjoni ta' dan is-server, dawn il-pakketti huma injorati.
Format tal-pakkett
B'mod ġenerali, qafas ta 'pakkett Ethernet jidher xi ħaġa bħal din:
Fil-każ tagħna, se nikkunsidraw biss id-dejta direttament mill-kontenut tal-pakkett UDP, mingħajr headers tal-protokoll tas-saff OSI, jiġifieri l-istruttura DHCP:
DHCPDISCOVER
Għalhekk, il-proċess tal-kisba ta 'indirizz IP għal apparat jibda bil-klijent DHCP jibgħat talba ta' xandir mill-port 68 għal 255.255.255.255:67. F'dan il-pakkett, il-klijent jinkludi l-indirizz MAC tiegħu, kif ukoll dak li eżattament irid jirċievi mis-server DHCP. L-istruttura tal-pakkett hija deskritta fit-tabella hawn taħt.
Tabella tal-Istruttura tal-Pakketti DHCPDISCOVER
Pożizzjoni fil-pakkett
Isem tal-valur
Eżempju
Introduzzjoni
Byte
kjarifika
1
Talba għall-Ibbutjar
1
Hex
1
Tip ta' messaġġ. 1 - talba minn klijent għal server, 2 - tweġiba minn server għal klijent
2
Tip ta 'ħardwer
1
Hex
1
Tip ta' indirizz tal-ħardwer, f'dan il-protokoll 1 - MAC
Numru tal-għażla
50
Diċembru
1
X'indirizz IP irid jirċievi l-klijent?
Tul tal-għażla
4
Diċembru
1
Valur tal-għażla
172.16.134.61
Linja
4
Numru tal-għażla
55
1
Parametri tan-netwerk mitluba mill-klijent. Il-kompożizzjoni tista' tvarja
01 — Maskra tan-netwerk
03 - Bieb
06 - DNS
oc — L-isem tal-ospitant
0f - isem tad-dominju tan-netwerk
1c - indirizz tat-talba tax-xandir (xandira)
42 - Isem tas-server TFTP
79 - Rotta Statika Bla Klassi
Tul tal-għażla
8
1
Valur tal-għażla
01:03:06:0c:0f:1c:42:79
8
Numru tal-għażla
82
Diċembru
Għażla 82, li tittrasmetti l-indirizz MAC tal-apparat ripetitur u xi valuri addizzjonali.
Ħafna drabi, dan huwa l-port tal-iswiċċ li fuqu jaħdem il-klijent DHCP aħħari.Din l-għażla fiha parametri addizzjonali.L-ewwel byte huwa n-numru tas-"suboption", it-tieni huwa t-tul tiegħu, imbagħad il-valur tiegħu.
F'dan il-każ, fl-għażla 82, is-subgħażliet huma mdaħħla:
Agent Circuit ID = 00:04:00:01:00:04, fejn l-aħħar żewġ bytes huma l-port tal-klijent DHCP li minnu tkun ġiet it-talba
Aġent Remote ID = 00:06:c8:be:19:93:11:48 - indirizz MAC tat-tagħmir ripetitur DHCP
Tmiem tal-pakkett
255
Diċembru
1
255 jissimbolizza t-tmiem tal-pakkett
DHCPOFFER
Hekk kif is-server jirċievi l-pakkett DHCPDISCOVER u jekk jara li jista’ joffri lill-klijent xi ħaġa minn dak mitlub, allura jiġġenera rispons għalih - DHCPDISCOVER. Ir-rispons jintbagħat lill-port “minn fejn ġie”, bix-xandir, għax f'dan il-mument, il-klijent għad m'għandux indirizz IP, għalhekk jista 'jaċċetta biss il-pakkett jekk jintbagħat bix-xandir. Il-klijent jagħraf li dan huwa pakkett għalih mill-indirizz MAC tiegħu ġewwa l-pakkett, kif ukoll in-numru tat-tranżazzjoni li jiġġenera fil-ħin li jinħoloq l-ewwel pakkett.
Tabella tal-Istruttura tal-Pakketti DHCPOFFER
Pożizzjoni fil-pakkett
Isem tal-valur (komuni)
Eżempju
Introduzzjoni
Byte
kjarifika
1
Talba għall-Ibbutjar
1
Hex
1
Tip ta' messaġġ. 1 - talba minn klijent għal server, 2 - tweġiba minn server għal klijent
2
Tip ta 'ħardwer
1
Hex
1
Tip ta' indirizz tal-ħardwer, f'dan il-protokoll 1 - MAC
5
ID tat-Tranżazzjoni
23:cf:de:1d
Hex
4
Identifikatur uniku tat-tranżazzjoni. Ġenerat mill-klijent fil-bidu ta 'operazzjoni ta' talba
7
It-tieni għadda
0
Hex
4
Ħin f'sekondi mill-bidu tal-proċess biex jinkiseb indirizz
9
Bnadar boot
0
Hex
2
Ċerti bnadar li jistgħu jiġu ssettjati biex jindikaw parametri tal-protokoll. F'dan il-każ, 0 tfisser it-tip ta' talba Unicast
11
Indirizz IP tal-klijent
0.0.0.0
Linja
4
Indirizz IP tal-klijent (jekk hemm)
15
L-indirizz IP tal-klijent tiegħek
172.16.134.61
Linja
4
Indirizz IP offrut mis-server (jekk disponibbli)
19
Indirizz IP tas-server li jmiss
0.0.0.0
Linja
4
Indirizz IP tas-server (jekk magħruf)
23
Indirizz IP tal-aġent tar-relay
172.16.114.41
Linja
4
Indirizz IP tar-relay agent (per eżempju, swiċċ)
27
Indirizz MAC tal-klijent
14:d6:4d:a7:c9:55
Hex
6
Indirizz MAC tal-mittent tal-pakkett (klijent)
31
Kuttunar tal-indirizz tal-ħardwer tal-klijent
Hex
10
Sedil riservat. Normalment mimli żerijiet
41
Isem tal-host tas-server
Linja
64
Isem tas-server DHCP. Normalment mhux trasmess
105
Isem tal-fajl tal-ibbutjar
Linja
128
Isem tal-fajl fuq is-server użat minn stazzjonijiet mingħajr disk meta jibdew
235
Cookies maġiċi
63: 82: 53: 63
Hex
4
Numru "Maġiku", li skontu, inkl. tista' tiddetermina li dan il-pakkett jappartjeni għall-protokoll DHCP
Għażliet DHCP. Jista 'jmur fi kwalunkwe ordni
236
Numru tal-għażla
53
Diċembru
1
Għażla 53, li tiddefinixxi t-tip ta' pakkett DHCP 2 - DHCPOFFER
Tul tal-għażla
1
Diċembru
1
Valur tal-għażla
2
Diċembru
1
Numru tal-għażla
1
Diċembru
1
Għażla li toffri lill-klijent DHCP maskra tan-netwerk
Tul tal-għażla
4
Diċembru
1
Valur tal-għażla
255.255.224.0
Linja
4
Numru tal-għażla
3
Diċembru
1
Għażla li toffri lill-klijent DHCP gateway default
Tul tal-għażla
4
Diċembru
1
Valur tal-għażla
172.16.12.1
Linja
4
Numru tal-għażla
6
Diċembru
1
Għażla li toffri DHCP lill-klijent DNS
Tul tal-għażla
4
Diċembru
1
Valur tal-għażla
8.8.8.8
Linja
4
Numru tal-għażla
51
Diċembru
1
Il-ħajja tal-parametri tan-netwerk maħruġa f'sekondi, u wara l-klijent DHCP irid jerġa' jitlobhom
Tul tal-għażla
4
Diċembru
1
Valur tal-għażla
86400
Diċembru
4
Numru tal-għażla
82
Diċembru
1
Għażla 82, tirrepeti dak li daħal f'DHCPDISCOVER
Tul tal-għażla
18
Diċembru
1
Valur tal-għażla
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Diċembru
18
Tmiem tal-pakkett
255
Diċembru
1
255 jissimbolizza t-tmiem tal-pakkett
DHCPREQUEST
Wara li l-klijent jirċievi DHCPOFFER, jifforma pakkett li jitlob il-parametri tan-netwerk mhux lis-servers DHCP kollha fuq in-netwerk, iżda biss lil wieħed speċifiku, li l-offerta DHCPOFFER tiegħu "għoġob" l-aktar. Il-kriterji "bħal" jistgħu jkunu differenti u jiddependu fuq l-implimentazzjoni tad-DHCP tal-klijent. Ir-riċevitur tat-talba huwa speċifikat bl-użu tal-indirizz MAC tas-server DHCP. Ukoll, pakkett DHCPREQUEST jista’ jintbagħat mill-klijent mingħajr ma l-ewwel jiġġenera DHCPDISCOVER, jekk l-indirizz IP tas-server ikun diġà nkiseb qabel.
5
ID tat-Tranżazzjoni
23:cf:de:1d
Hex
4
Identifikatur uniku tat-tranżazzjoni. Ġenerat mill-klijent fil-bidu ta 'operazzjoni ta' talba
7
It-tieni għadda
0
Hex
4
Ħin f'sekondi mill-bidu tal-proċess biex jinkiseb indirizz
9
Bnadar boot
8000
Hex
2
Ċerti bnadar li jistgħu jiġu ssettjati biex jindikaw parametri tal-protokoll. F'dan il-każ, "xandira" hija ssettjata
11
Indirizz IP tal-klijent
0.0.0.0
Linja
4
Indirizz IP tal-klijent (jekk hemm)
15
L-indirizz IP tal-klijent tiegħek
172.16.134.61
Linja
4
Indirizz IP offrut mis-server (jekk disponibbli)
19
Indirizz IP tas-server li jmiss
0.0.0.0
Linja
4
Indirizz IP tas-server (jekk magħruf)
23
Indirizz IP tal-aġent tar-relay
172.16.114.41
Linja
4
Indirizz IP tar-relay agent (per eżempju, swiċċ)
27
Indirizz MAC tal-klijent
14:d6:4d:a7:c9:55
Hex
6
Indirizz MAC tal-mittent tal-pakkett (klijent)
31
Kuttunar tal-indirizz tal-ħardwer tal-klijent
Hex
10
Sedil riservat. Normalment mimli żerijiet
41
Isem tal-host tas-server
Linja
64
Isem tas-server DHCP. Normalment mhux trasmess
105
Isem tal-fajl tal-ibbutjar
Linja
128
Isem tal-fajl fuq is-server użat minn stazzjonijiet mingħajr disk meta jibdew
235
Cookies maġiċi
63: 82: 53: 63
Hex
4
Numru "Maġiku", li skontu, inkl. tista' tiddetermina li dan il-pakkett jappartjeni għall-protokoll DHCP
Għażliet DHCP. Jista 'jmur fi kwalunkwe ordni
236
Numru tal-għażla
53
Diċembru
3
Għażla 53, li tiddefinixxi l-pakkett DHCP tat-tip 3 - DHCPREQUEST
Tul tal-għażla
1
Diċembru
1
Valur tal-għażla
3
Diċembru
1
Numru tal-għażla
61
Diċembru
1
ID tal-klijent: 01 (għal Ehernet) + indirizz MAC tal-klijent
Tul tal-għażla
7
Diċembru
1
Valur tal-għażla
01:2c:ab:25:ff:72:a6
Hex
7
Numru tal-għażla
60
Diċembru
"Identifikatur tal-klassi tal-bejjiegħ". Fil-każ tiegħi, tirrapporta l-verżjoni tal-klijent DHCP. Forsi apparati oħra jirritornaw xi ħaġa differenti. Windows pereżempju jirrapporta MSFT 5.0
Tul tal-għażla
11
Diċembru
Valur tal-għażla
udhcp 0.9.8
Linja
Numru tal-għażla
55
1
Parametri tan-netwerk mitluba mill-klijent. Il-kompożizzjoni tista' tvarja
01 — Maskra tan-netwerk
03 - Bieb
06 - DNS
oc — L-isem tal-ospitant
0f - isem tad-dominju tan-netwerk
1c - indirizz tat-talba tax-xandir (xandira)
42 - Isem tas-server TFTP
79 - Rotta Statika Bla Klassi
Tul tal-għażla
8
1
Valur tal-għażla
01:03:06:0c:0f:1c:42:79
8
Numru tal-għażla
82
Diċembru
1
Għażla 82, tirrepeti dak li daħal f'DHCPDISCOVER
Tul tal-għażla
18
Diċembru
1
Valur tal-għażla
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Diċembru
18
Tmiem tal-pakkett
255
Diċembru
1
255 jissimbolizza t-tmiem tal-pakkett
DHCPACK
Bħala konferma li "iva, hekk hu, dan huwa l-indirizz IP tiegħek, u jien mhux se nagħtih lil ħaddieħor" mis-server DHCP, iservi pakkett fil-format DHCPACK mis-server lill-klijent. Tintbagħat imxandra bħal pakketti oħra. Għalkemm, fil-kodiċi ta 'hawn taħt għal server DHCP implimentat f'Python, fil-każ, nidduplika kwalunkwe talba ta' xandir billi nibgħat pakkett lil IP klijent speċifiku, jekk ikun diġà magħruf. Barra minn hekk, is-server DHCP ma jimpurtah xejn jekk il-pakkett DHCPACK laħaqx il-klijent. Jekk il-klijent ma jirċievix DHCPACK, imbagħad wara ftit sempliċement jirrepeti DHCPREQUEST
Tabella tal-Istruttura tal-Pakketti DHCPACK
Pożizzjoni fil-pakkett
Isem tal-valur (komuni)
Eżempju
Introduzzjoni
Byte
kjarifika
1
Talba għall-Ibbutjar
2
Hex
1
Tip ta' messaġġ. 1 - talba minn klijent għal server, 2 - tweġiba minn server għal klijent
2
Tip ta 'ħardwer
1
Hex
1
Tip ta' indirizz tal-ħardwer, f'dan il-protokoll 1 - MAC
5
ID tat-Tranżazzjoni
23:cf:de:1d
Hex
4
Identifikatur uniku tat-tranżazzjoni. Ġenerat mill-klijent fil-bidu ta 'operazzjoni ta' talba
7
It-tieni għadda
0
Hex
4
Ħin f'sekondi mill-bidu tal-proċess biex jinkiseb indirizz
9
Bnadar boot
8000
Hex
2
Ċerti bnadar li jistgħu jiġu ssettjati biex jindikaw parametri tal-protokoll. F'dan il-każ, "xandira" hija ssettjata
11
Indirizz IP tal-klijent
0.0.0.0
Linja
4
Indirizz IP tal-klijent (jekk hemm)
15
L-indirizz IP tal-klijent tiegħek
172.16.134.61
Linja
4
Indirizz IP offrut mis-server (jekk disponibbli)
19
Indirizz IP tas-server li jmiss
0.0.0.0
Linja
4
Indirizz IP tas-server (jekk magħruf)
23
Indirizz IP tal-aġent tar-relay
172.16.114.41
Linja
4
Indirizz IP tar-relay agent (per eżempju, swiċċ)
27
Indirizz MAC tal-klijent
14:d6:4d:a7:c9:55
Hex
6
Indirizz MAC tal-mittent tal-pakkett (klijent)
31
Kuttunar tal-indirizz tal-ħardwer tal-klijent
Hex
10
Sedil riservat. Normalment mimli żerijiet
41
Isem tal-host tas-server
Linja
64
Isem tas-server DHCP. Normalment mhux trasmess
105
Isem tal-fajl tal-ibbutjar
Linja
128
Isem tal-fajl fuq is-server użat minn stazzjonijiet mingħajr disk meta jibdew
235
Cookies maġiċi
63: 82: 53: 63
Hex
4
Numru "Maġiku", li skontu, inkl. tista' tiddetermina li dan il-pakkett jappartjeni għall-protokoll DHCP
Għażliet DHCP. Jista 'jmur fi kwalunkwe ordni
236
Numru tal-għażla
53
Diċembru
3
Għażla 53, li tiddefinixxi l-pakkett DHCP tip 5 - DHCPACK
Tul tal-għażla
1
Diċembru
1
Valur tal-għażla
5
Diċembru
1
Numru tal-għażla
1
Diċembru
1
Għażla li toffri lill-klijent DHCP maskra tan-netwerk
Tul tal-għażla
4
Diċembru
1
Valur tal-għażla
255.255.224.0
Linja
4
Numru tal-għażla
3
Diċembru
1
Għażla li toffri lill-klijent DHCP gateway default
Tul tal-għażla
4
Diċembru
1
Valur tal-għażla
172.16.12.1
Linja
4
Numru tal-għażla
6
Diċembru
1
Għażla li toffri DHCP lill-klijent DNS
Tul tal-għażla
4
Diċembru
1
Valur tal-għażla
8.8.8.8
Linja
4
Numru tal-għażla
51
Diċembru
1
Il-ħajja tal-parametri tan-netwerk maħruġa f'sekondi, u wara l-klijent DHCP irid jerġa' jitlobhom
Tul tal-għażla
4
Diċembru
1
Valur tal-għażla
86400
Diċembru
4
Numru tal-għażla
82
Diċembru
1
Għażla 82, tirrepeti dak li daħal f'DHCPDISCOVER
Tul tal-għażla
18
Diċembru
1
Valur tal-għażla
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Diċembru
18
Tmiem tal-pakkett
255
Diċembru
1
255 jissimbolizza t-tmiem tal-pakkett
Installazzjoni
L-installazzjoni fil-fatt tikkonsisti fl-installazzjoni tal-moduli python meħtieġa għax-xogħol. Huwa preżunt li MySQL huwa diġà installat u kkonfigurat.
Is-settings kollha tas-server huma f'fajl xml. Fajl ta' referenza:
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 test test 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 agħżel ip, maskra, router, dns minn utenti fejn upper(mac)=upper('{option_3_AgentRemoteId_hex}') u upper(port)=upper('{option_1_AgentCircuitId_port_hex}') agħżel ip, maskra, router, dns minn utenti fejn upper(mac)=upper('{sw_mac}') u upper(port)=upper('{sw_port82}') agħżel ip, maskra, router, dns mill-utenti fejn upper(mac)=upper('{ClientMacAddress}') daħħal fl-istorja (id,dt,mac,ip,kumment) valuri (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')
host - liema indirizz IP jisma' s-server fuq il-port 67
xandira - liema ip hija x-xandir għal DHCPOFFER u DHCPACK
DHCPServer - x'inhu l-ip tas-server DHCP
Il-ħin tal-kiri LeaseTime tal-indirizz IP maħruġ
ThreadLimit - kemm-il ħjut qed jaħdmu simultanjament biex jipproċessaw pakketti UDP li jkunu deħlin fuq il-port 67. Suppost jgħin fuq proġetti ta' tagħbija għolja 😉
defaultMask,defaultRouter,defaultDNS - x'inhu offrut lill-abbonat b'mod awtomatiku jekk jinstab IP fid-database, iżda parametri addizzjonali mhumiex speċifikati għalih
sezzjoni mysql:
host, username, password, basename - kollox jitkellem waħdu. Struttura tad-database approssimattiva hija mwaħħla fuq GitHub
Sezzjoni tal-Mistoqsija: talbiet biex tirċievi OFFERTA/ACK huma deskritti hawn:
offer_count — in-numru ta' linji b'talbiet li jirritornaw riżultat bħal ip, maskra, router, dns
offer_n — sekwenza ta' mistoqsijiet. Jekk ir-ritorn huwa vojt, imbagħad jesegwixxi t-talba għall-offerta li ġejja
history_sql - mistoqsija li tikteb, pereżempju, fl-"istorja tal-awtorizzazzjoni" għal abbonat
It-talbiet jistgħu jinkludu kwalunkwe varjabbli mit-taqsima tal-għażliet jew għażliet mill-protokoll DHCP.
Taqsima tal-għażliet. Dan huwa fejn isir aktar interessanti. Hawnhekk nistgħu noħolqu varjabbli li nistgħu nużaw aktar tard fit-taqsima tal-mistoqsija.
Per eżempju:
option_82_hex:sw_port1:20:22
, din il-linja tal-kmand tieħu l-linja kollha li ġiet fl-għażla tat-talba DHCP 82, f'format hex, fil-medda minn 20 sa 22 bytes inklużivi u tpoġġiha fil-varjabbli l-ġdida sw_port1 (iswiċċ il-port minn fejn ġiet it-talba)
option_82_hex:sw_mac:26:40
, iddefinixxi l-varjabbli sw_mac, billi tieħu l-hex mill-medda 26:40
Tista 'tara l-għażliet kollha possibbli li jistgħu jintużaw fil-mistoqsijiet billi tibda s-server bl-iswiċċ -d. Se naraw xi ħaġa bħal dan il-log:
Għaldaqstant, nistgħu nagħżlu kwalunkwe varjabbli fi {} u se tintuża fil-mistoqsija SQL.
Ejjew nirreġistraw għall-istorja li l-klijent irċieva l-indirizz IP:
Il-bidu tas-server
./pydhcpdb.py -d -c config.xml
— d-modalità tal-ħruġ tal-console DEBUG
- c <filename> fajl tal-konfigurazzjoni
Debriefing
U issa aktar dettalji dwar l-implimentazzjoni tas-server f'Python. Huwa wġigħ. Python tgħallem fuq il-fly. Ħafna mumenti jsiru fl-istil ta '"naqra, b'xi mod għamiltha taħdem." Mhux ottimizzat xejn, u jitħalla f'din il-forma prinċipalment minħabba ftit esperjenza fl-iżvilupp ta 'Python. Se nitkellem fuq l-aktar aspetti interessanti tal-implimentazzjoni tas-server f'"kodiċi".
Parser tal-fajl tal-konfigurazzjoni XML
Jintuża l-modulu standard Python xml.dom. Jidher sempliċi, iżda waqt l-implimentazzjoni kien hemm nuqqas notevoli ta 'dokumentazzjoni ċara u eżempji fuq in-netwerk li juża dan il-modulu.
siġra = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") għal elem f'mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["mysql_username"]=elem.getElementsByTagName("username")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("password")[0].firstChild.data gconfig["]mysql_basename =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") għal elem f'dconfig: gconfig["broadcast"]=elem.getElementsByTagName("broadcast")[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]fault["dhcp_Server"]=elem.getElementsByTagName("DHCPServer")[0].firstChild.data gconfig. =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultRouter"](Nam.ByTagName"] defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") għal elem f'qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[1].firstChild.data għal num in firxa(int(gconfig["offer_count"])): gconfig["offer_"+str(num+1)]=elem.getElementsByTagName("offerta_"+str(num+0))[0].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[XNUMX].firstChild.data options=tree.getElementsByTagName("għażliet") għall-elem fl-għażliet: node=elem.getElementsByTagName("għażla") għall-għażliet fin-node : optionsMod.append(options.firstChild.data)
Multithreading
B'mod stramb, multithreading f'Python huwa implimentat b'mod ċar u sempliċi ħafna.
def PacketWork(data,addr): ... # implimentazzjoni tal-parsing tal-pakkett li jkun dieħel u twieġeb għalih... filwaqt li Veru: data, addr = udp_socket.recvfrom(1024) # stennija għall-ħajt tal-pakkett UDP = threading.Thread( target=PacketWork , args=(data,addr,)).start() # kif ġie - inniedu l-funzjoni PacketWork definita qabel fl-isfond bil-parametri waqt threading.active_count() >gconfig["dhcp_ThreadLimit"]: ħin. sleep(1) # jekk in-numru Diġà hemm aktar ħjut għaddejjin milli fis-settings, nistennew sakemm ikun hemm inqas minnhom
Irċievi/ibgħat pakkett DHCP
Sabiex tinterċetta l-pakketti UDP li ġejjin mill-karta tan-netwerk, għandek bżonn "tgħolli" is-sokit:
AF_INET - tfisser li l-format tal-indirizz se jkun IP: port. Jista' jkun hemm ukoll AF_UNIX - fejn l-indirizz jingħata mill-isem tal-fajl.
SOCK_DGRAM - ifisser li ma naċċettawx "pakkett mhux maħdum", iżda wieħed li diġà għadda mill-firewall, u b'pakkett parzjalment mirqum. Dawk. nirċievu biss pakkett UDP mingħajr il-komponent "fiżiku" tat-tgeżwir tal-pakkett UDP. Jekk tuża l-bandiera SOCK_RAW, allura jkollok bżonn ukoll li teżamina dan il-"wrapper".
, fejn SOL_SOCKET tfisser il-"livell tal-protokoll" għall-issettjar tal-għażliet,
, Għażla SO_BROADCAST li l-pakkett tal-elmu huwa "xandira"
L-għażla ,SO_REUSEADDR taqleb is-socket għall-modalità "ħafna semmiegħa". Fit-teorija, mhuwiex meħtieġ f'dan il-każ, iżda fuq wieħed mis-servers FreeBSD li fuqhom ittestjajt, il-kodiċi ma ħadimx mingħajr din l-għażla.
Parsing ta' pakkett DHCP
Dan huwa fejn għoġobni ħafna Python. Jirriżulta li barra mill-kaxxa jippermettilek tkun pjuttost flessibbli mal-bytecode. Li jippermetti li jiġi tradott faċilment f'valuri deċimali, kordi u hex - i.e. dan huwa dak li fil-fatt jeħtieġ li nifhmu l-istruttura tal-pakkett. Allura, pereżempju, tista 'tikseb firxa ta' bytes f'HEX u bytes biss: