Server DHCP + Mysql f'Python

Server DHCP + Mysql f'Python

L-iskop ta’ dan il-proġett kien:

  • Tagħlim dwar DHCP fuq netwerk IPv4
  • It-tagħlim tal-Python (ftit aktar mill-bidu 😉)
  • 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:

  1. 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.
  2. 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.
  3. 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.
  4. 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

Server DHCP + Mysql f'Python

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:

Server DHCP + Mysql f'Python

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

3
Il-ħardwer jindirizza t-tul
6
Hex
1
It-tul tal-indirizz MAC tal-apparat

4
Ħops
1
Hex
1
Numru ta' rotot intermedji

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

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
0.0.0.0
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 tispeċifika t-tip ta' pakkett DHCP

1 - DHCPDISCOVER
3 - DHCPREQUEST
2 - OFFERTA DHCP
5 - DHCPACK
8 - DHCPINFORM

 
Tul tal-għażla
1
Diċembru
1

 
Valur tal-għażla
1
Diċembru
1

 
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

 
Tul tal-għażla
18
Diċembru
 

 
Valur tal-għażla
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
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

3
Il-ħardwer jindirizza t-tul
6
Hex
1
It-tul tal-indirizz MAC tal-apparat

4
Ħops
1
Hex
1
Numru ta' rotot intermedji

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.

Tabella tal-Istruttura tal-Pakketti tad-DHCPREQUEST

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

3
Il-ħardwer jindirizza t-tul
6
Hex
1
It-tul tal-indirizz MAC tal-apparat

4
Ħops
1
Hex
1
Numru ta' rotot intermedji

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

3
Il-ħardwer jindirizza t-tul
6
Hex
1
It-tul tal-indirizz MAC tal-apparat

4
Ħops
1
Hex
1
Numru ta' rotot intermedji

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.

FreeBSD

pkg install python3 python3 -m assurepip pip3 install mysql-connector

Ubuntu

sudo apt-get install python3 sudo apt-get install pip3 sudo pip3 install mysql-connector

Aħna noħolqu database MySQL, intellgħu d-dump pydhcp.sql fiha, u kkonfiguraw il-fajl tal-konfigurazzjoni.

Konfigurazzjoni

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')

Issa f'aktar dettall fuq it-tikketti:

Is-sezzjoni dhcpserver tiddeskrivi s-settings bażiċi għall-bidu tas-server, jiġifieri:

  • 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:

--Pakkett DHCPINFORM wasal fuq il-port 67, minn 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress': '0025224ad764': 'ClientMacAddress': 'ClientMacAddress': 'ClientMacAddress': 'ClientMacAddress': '00'7 Jxd91d', ' HType': 'Ethernet', 'HostName': b'x5xa0xe3xa5xa9xa8-x8fx43a', 'ReqListDNS': Veru, 'ReqListDomainName': Veru, 'ReqListPerfowmRouterDiscover': Veru, 'ReqListSRouterRouter':'ReqList:,'ReqListRouter':' ReqListSubnetMask ': Veru, 'ReqListVendorSpecInfo': 0.0.0.0, 'RequestedIpAddress': '5.0', 'Vendor': b'MSFT 0025224', 'chaddr': '764ad172.30.128.13', 'ciaddr.':00', '00.':172.30.114.25' bnadar ': b'x308x6', 'giaddr': '1', 'gpoz': 82, 'hlen': 12, 'hops': 12, 'htype': 'MAC', 'magic_cookie': b' cx53Sc ', 'op': 'DHCPINFORM', 'option53': 55, 'option55': 60, 'option60': 61, 'option61': 82, 'option82': 82, 'option12': 01, 'option_06_byte' : b'x00x04x00x01x00x06x02x08x00x06x00x1' b'x9x2x82eXx12010600040001000602080006001exb589xad', 'option_2_hex': '82 option_18_str': "b'x82x12x01x06x00x04x00x01x00x06x02x08x00x06x00eXx1exb9xad'", 'riżultat': Falz, 'secs': 2, 'siaddr' : '768', 'sw_mac': '0.0.0.0e001eb589ad', 'sw_port2': '1', 'xidbyte': b'

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:

Server DHCP + Mysql f'Python

Server DHCP + Mysql f'Python

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:

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

, fejn il-bnadar huma:

  • 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".

Li tibgħat pakkett jista' jkun bħal xandira:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #aqleb is-socket għall-mod tax-xandir rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

, u fl-indirizz "minn ġie l-pakkett":

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # taqleb is-socket għall-modalità multi-listener rz=udp_socket.sendto(packetack, addr)

, 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:

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

, ippakkja l-bytes fi struttura:

res["bnadar"]=pakkett('BB',data[10],data[11])

Ikseb l-IP mill-istruttura:

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

U viċi versa:

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

Dak kollu għalissa 😉

Sors: www.habr.com

Żid kumment