Gweinydd DHCP + Mysql yn Python

Gweinydd DHCP + Mysql yn Python

Pwrpas y prosiect hwn oedd:

  • Dysgu am DHCP ar rwydwaith IPv4
  • Dysgu Python (ychydig yn fwy nag o'r dechrau 😉)
  • amnewid gweinydd DB2DHCP (fy fforch), gwreiddiol yma, sy'n dod yn fwyfwy anodd i ymgynnull ar gyfer yr OS newydd. A dydw i ddim yn hoffi ei fod yn ddeuaidd nad oes unrhyw ffordd i “newid ar hyn o bryd”
  • cael gweinydd DHCP sy'n gweithio gyda'r gallu i ddewis cyfeiriad IP tanysgrifiwr gan ddefnyddio mac y tanysgrifiwr neu newid cyfuniad mac + port (Opsiwn 82)
  • sgwennu beic arall (O! dyma fy hoff weithgaredd)
  • derbyn sylwadau am eich caredigrwydd clwb ar Habrahabr (neu well eto, gwahoddiad) 😉

Canlyniad: mae'n gweithio 😉 Wedi'i brofi ar FreeBSD a Ubuntu OS. Yn ddamcaniaethol, gellir gofyn i'r cod weithio o dan unrhyw OS, oherwydd Ymddengys nad oes unrhyw rwymiadau penodol yn y cod.
Yn ofalus! Mae llawer mwy i ddod.

Dolen i gadwrfa ar gyfer amaturiaid "cyffwrdd yn fyw".

Mae'r broses o osod, ffurfweddu a defnyddio canlyniad "astudio'r caledwedd" yn llawer is, ac yna ychydig o theori am y protocol DHCP. I mi fy hun. Ac am hanes 😉

Ychydig o ddamcaniaeth

Beth yw DHCP

Mae hwn yn brotocol rhwydwaith sy'n caniatáu dyfais i ddarganfod ei gyfeiriad IP (a pharamedrau eraill fel porth, DNS, ac ati) o weinydd DHCP. Mae pecynnau'n cael eu cyfnewid gan ddefnyddio protocol y CDU. Mae egwyddor gyffredinol gweithrediad y ddyfais wrth ofyn am baramedrau rhwydwaith fel a ganlyn:

  1. Mae'r ddyfais (cleient) yn anfon cais darlledu CDU (DHCPDISCOVER) ledled y rhwydwaith gyda'r cais “wel, mae rhywun yn rhoi cyfeiriad IP i mi.” Ar ben hynny, fel arfer (ond nid bob amser) mae'r cais yn digwydd o borthladd 68 (ffynhonnell), a'r cyrchfan yw porthladd 67 (cyrchfan). Mae rhai dyfeisiau hefyd yn anfon pecynnau o borth 67. Mae cyfeiriad MAC dyfais y cleient wedi'i gynnwys yn y pecyn DHCPDISCOVER.
  2. Mae pob gweinydd DHCP sydd wedi'i leoli ar y rhwydwaith (ac efallai bod nifer ohonynt) yn ffurfio cynnig DHCPOFFER gyda gosodiadau rhwydwaith ar gyfer y ddyfais a anfonodd DHCPDISCOVER, a hefyd yn ei ddarlledu dros y rhwydwaith. Mae dynodi ar gyfer pwy y bwriedir y pecyn hwn yn seiliedig ar gyfeiriad MAC y cleient a ddarparwyd yn gynharach yn y cais DHCPDISCOVER.
  3. Mae'r cleient yn derbyn pecynnau gyda chynigion ar gyfer gosodiadau rhwydwaith, yn dewis yr un mwyaf deniadol (gall y meini prawf fod yn wahanol, er enghraifft, amser dosbarthu pecynnau, nifer y llwybrau canolradd), ac yn gwneud "cais swyddogol" DHCPREQUEST gyda'r gosodiadau rhwydwaith o'r gweinydd DHCP mae'n ei hoffi. Yn yr achos hwn, mae'r pecyn yn mynd i weinydd DHCP penodol.
  4. Mae'r gweinydd a dderbyniodd y DHCPREQUEST yn anfon pecyn fformat DHCPACK, lle mae unwaith eto yn rhestru'r gosodiadau rhwydwaith a fwriedir ar gyfer y cleient hwn

Gweinydd DHCP + Mysql yn Python

Yn ogystal, mae yna becynnau DHCPINFORM sy'n dod gan y cleient, a'u pwrpas yw hysbysu'r gweinydd DHCP bod y “cleient yn fyw” ac yn defnyddio'r gosodiadau rhwydwaith a gyhoeddwyd. Yng ngweithrediad y gweinydd hwn, anwybyddir y pecynnau hyn.

Fformat pecyn

Yn gyffredinol, mae ffrâm pecyn Ethernet yn edrych fel hyn:

Gweinydd DHCP + Mysql yn Python

Yn ein hachos ni, byddwn yn ystyried y data yn uniongyrchol o gynnwys y pecyn CDU yn unig, heb benawdau protocol haen OSI, sef strwythur DHCP:

DHCPDISCOVER

Felly, mae'r broses o gael cyfeiriad IP ar gyfer dyfais yn dechrau gyda'r cleient DHCP yn anfon cais darlledu o borthladd 68 i 255.255.255.255:67. Yn y pecyn hwn, mae'r cleient yn cynnwys ei gyfeiriad MAC, yn ogystal â beth yn union y mae am ei dderbyn gan y gweinydd DHCP. Disgrifir strwythur y pecyn yn y tabl isod.

DHCPDISCOVER Tabl Strwythur Pecyn

Safle yn y pecyn
Enw gwerth
Enghraifft
Cyflwyniad
Beit
Eglurhad

1
Cais Boot
1
Hex
1
Math o neges. 1 - cais gan gleient i weinydd, 2 - ymateb o weinydd i gleient

2
Math o galedwedd
1
Hex
1
Math o gyfeiriad caledwedd, yn y protocol hwn 1 - MAC

3
Mae caledwedd yn mynd i'r afael â hyd
6
Hex
1
Hyd cyfeiriad MAC y ddyfais

4
Hopys
1
Hex
1
Nifer y llwybrau canolradd

5
ID y Trafodiad
23:cf:de:1d
Hex
4
Dynodwr trafodiad unigryw. Wedi'i gynhyrchu gan y cleient ar ddechrau gweithrediad cais

7
Aeth yr ail heibio
0
Hex
4
Amser mewn eiliadau o ddechrau'r broses o gael cyfeiriad

9
Baneri Boot
0
Hex
2
Rhai baneri y gellir eu gosod i ddangos paramedrau protocol

11
Cyfeiriad IP cleient
0.0.0.0
Llinyn
4
Cyfeiriad IP cleient (os o gwbl)

15
Cyfeiriad IP eich cleient
0.0.0.0
Llinyn
4
Cyfeiriad IP a gynigir gan y gweinydd (os yw ar gael)

19
Cyfeiriad IP gweinydd nesaf
0.0.0.0
Llinyn
4
Cyfeiriad IP gweinydd (os yw'n hysbys)

23
Cyfeiriad IP asiant cyfnewid
172.16.114.41
Llinyn
4
Cyfeiriad IP yr asiant cyfnewid (er enghraifft, switsh)

27
Cyfeiriad MAC cleient
14:d6:4d:a7:c9:55
Hex
6
Cyfeiriad MAC anfonwr y pecyn (cleient)

31
Padin cyfeiriad caledwedd cleient
 
Hex
10
Sedd neilltuedig. Fel arfer llenwi â sero

41
Enw gwesteiwr y gweinydd
 
Llinyn
64
Enw gweinydd DHCP. Fel arfer ni chaiff ei drosglwyddo

105
Enw ffeil cychwyn
 
Llinyn
128
Enw ffeil ar y gweinydd a ddefnyddir gan orsafoedd di-ddisg wrth gychwyn

235
Cwcis hud
63: 82: 53: 63
Hex
4
Rhif “hud”, yn ôl pa un, gan gynnwys. gallwch benderfynu bod y pecyn hwn yn perthyn i'r protocol DHCP

Opsiynau DHCP. Gall fynd mewn unrhyw drefn

236
Rhif opsiwn
53
Rhagfyr
1
Opsiwn 53, sy'n pennu'r math o becyn DHCP

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

 
Hyd opsiwn
1
Rhagfyr
1

 
Gwerth opsiwn
1
Rhagfyr
1

 
Rhif opsiwn
50
Rhagfyr
1
Pa gyfeiriad IP y mae'r cleient am ei dderbyn?

 
Hyd opsiwn
4
Rhagfyr
1

 
Gwerth opsiwn
172.16.134.61
Llinyn
4

 
Rhif opsiwn
55
 
1
Paramedrau rhwydwaith y mae'r cleient yn gofyn amdanynt. Gall cyfansoddiad amrywio

01 - Mwgwd rhwydwaith
03 - Porth
06 - DNS
oc — Enw gwesteiwr
0f - enw parth rhwydwaith
1c - cyfeiriad y cais darlledu (darlledu)
42 - enw gweinydd TFTP
79 - Llwybr Sefydlog Di-ddosbarth

 
Hyd opsiwn
8
 
1

 
Gwerth opsiwn
01:03:06:0c:0f:1c:42:79
 
8

 
Rhif opsiwn
82
Rhagfyr
 
Opsiwn 82, sy'n trosglwyddo cyfeiriad MAC y ddyfais ailadrodd a rhai gwerthoedd ychwanegol.

Yn fwyaf aml, dyma borthladd y switsh y mae'r cleient DHCP terfynol yn rhedeg arno.Mae'r opsiwn hwn yn cynnwys paramedrau ychwanegol. Y beit cyntaf yw nifer yr "suboption", yr ail yw ei hyd, yna ei werth.

Yn yr achos hwn, yn opsiwn 82, mae'r is-opsiynau wedi'u nythu:
Agent Circuit ID = 00:04:00:01:00:04, lle mae'r ddau beit olaf yn borthladd cleient DHCP y daeth y cais ohono

ID Remote Asiant = 00:06:c8:be:19:93:11:48 - Cyfeiriad MAC y ddyfais ailadrodd DHCP

 
Hyd opsiwn
18
Rhagfyr
 

 
Gwerth opsiwn
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Diwedd y pecyn
255
Rhagfyr
1
Mae 255 yn symbol o ddiwedd y pecyn

DHCPOFFER

Cyn gynted ag y bydd y gweinydd yn derbyn y pecyn DHCPDISCOVER ac os yw'n gweld y gall gynnig rhywbeth o'r un y gofynnwyd amdano i'r cleient, yna mae'n cynhyrchu ymateb ar ei gyfer - DHCPDISCOVER. Anfonir yr ymateb i’r porthladd “o ble y daeth”, trwy ddarlledu, oherwydd ar hyn o bryd, nid oes gan y cleient gyfeiriad IP eto, felly dim ond os caiff ei anfon trwy ddarllediad y gall dderbyn y pecyn. Mae'r cleient yn cydnabod bod hwn yn becyn iddo gan ei gyfeiriad MAC y tu mewn i'r pecyn, yn ogystal â'r rhif trafodiad y mae'n ei gynhyrchu ar yr adeg y caiff y pecyn cyntaf ei greu.

Tabl Strwythur Pecyn DHCPOFFER

Safle yn y pecyn
Enw'r gwerth (cyffredin)
Enghraifft
Cyflwyniad
Beit
Eglurhad

1
Cais Boot
1
Hex
1
Math o neges. 1 - cais gan gleient i weinydd, 2 - ymateb o weinydd i gleient

2
Math o galedwedd
1
Hex
1
Math o gyfeiriad caledwedd, yn y protocol hwn 1 - MAC

3
Mae caledwedd yn mynd i'r afael â hyd
6
Hex
1
Hyd cyfeiriad MAC y ddyfais

4
Hopys
1
Hex
1
Nifer y llwybrau canolradd

5
ID y Trafodiad
23:cf:de:1d
Hex
4
Dynodwr trafodiad unigryw. Wedi'i gynhyrchu gan y cleient ar ddechrau gweithrediad cais

7
Aeth yr ail heibio
0
Hex
4
Amser mewn eiliadau o ddechrau'r broses o gael cyfeiriad

9
Baneri Boot
0
Hex
2
Rhai baneri y gellir eu gosod i ddangos paramedrau protocol. Yn yr achos hwn, mae 0 yn golygu'r math o gais Unicast

11
Cyfeiriad IP cleient
0.0.0.0
Llinyn
4
Cyfeiriad IP cleient (os o gwbl)

15
Cyfeiriad IP eich cleient
172.16.134.61
Llinyn
4
Cyfeiriad IP a gynigir gan y gweinydd (os yw ar gael)

19
Cyfeiriad IP gweinydd nesaf
0.0.0.0
Llinyn
4
Cyfeiriad IP gweinydd (os yw'n hysbys)

23
Cyfeiriad IP asiant cyfnewid
172.16.114.41
Llinyn
4
Cyfeiriad IP yr asiant cyfnewid (er enghraifft, switsh)

27
Cyfeiriad MAC cleient
14:d6:4d:a7:c9:55
Hex
6
Cyfeiriad MAC anfonwr y pecyn (cleient)

31
Padin cyfeiriad caledwedd cleient
 
Hex
10
Sedd neilltuedig. Fel arfer llenwi â sero

41
Enw gwesteiwr y gweinydd
 
Llinyn
64
Enw gweinydd DHCP. Fel arfer ni chaiff ei drosglwyddo

105
Enw ffeil cychwyn
 
Llinyn
128
Enw ffeil ar y gweinydd a ddefnyddir gan orsafoedd di-ddisg wrth gychwyn

235
Cwcis hud
63: 82: 53: 63
Hex
4
Rhif “hud”, yn ôl pa un, gan gynnwys. gallwch benderfynu bod y pecyn hwn yn perthyn i'r protocol DHCP

Opsiynau DHCP. Gall fynd mewn unrhyw drefn

236
Rhif opsiwn
53
Rhagfyr
1
Opsiwn 53, sy'n diffinio math pecyn DHCP 2 - DHCPOFFER

 
Hyd opsiwn
1
Rhagfyr
1

 
Gwerth opsiwn
2
Rhagfyr
1

 
Rhif opsiwn
1
Rhagfyr
1
Opsiwn i gynnig mwgwd rhwydwaith i'r cleient DHCP

 
Hyd opsiwn
4
Rhagfyr
1

 
Gwerth opsiwn
255.255.224.0
Llinyn
4

 
Rhif opsiwn
3
Rhagfyr
1
Opsiwn i gynnig porth rhagosodedig i'r cleient DHCP

 
Hyd opsiwn
4
Rhagfyr
1

 
Gwerth opsiwn
172.16.12.1
Llinyn
4

 
Rhif opsiwn
6
Rhagfyr
1
Opsiwn i gynnig DHCP i gleient DNS

 
Hyd opsiwn
4
Rhagfyr
1

 
Gwerth opsiwn
8.8.8.8
Llinyn
4

 
Rhif opsiwn
51
Rhagfyr
1
Oes y paramedrau rhwydwaith a gyhoeddwyd mewn eiliadau, ac ar ôl hynny mae'n rhaid i'r cleient DHCP ofyn amdanynt eto

 
Hyd opsiwn
4
Rhagfyr
1

 
Gwerth opsiwn
86400
Rhagfyr
4

 
Rhif opsiwn
82
Rhagfyr
1
Mae Opsiwn 82 yn ailadrodd yr hyn a ddaeth yn DHCPDISCOVER

 
Hyd opsiwn
18
Rhagfyr
1

 
Gwerth opsiwn
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Rhagfyr
18

 
Diwedd y pecyn
255
Rhagfyr
1
Mae 255 yn symbol o ddiwedd y pecyn

DHCPREQUEST

Ar ôl i'r cleient dderbyn DHCPOFFER, mae'n ffurfio pecyn sy'n gofyn am baramedrau rhwydwaith nid i bob gweinydd DHCP ar y rhwydwaith, ond dim ond i un penodol, y mae ei gynnig DHCPOFFER yr oedd yn ei “hoffi” fwyaf. Gall y meini prawf "hoffi" fod yn wahanol ac yn dibynnu ar weithrediad DHCP y cleient. Pennir derbynnydd y cais gan ddefnyddio cyfeiriad MAC y gweinydd DHCP. Hefyd, gall y cleient anfon pecyn DHCPREQUEST heb gynhyrchu DHCPDISCOVER yn gyntaf, os yw cyfeiriad IP y gweinydd eisoes wedi'i gael yn flaenorol.

Tabl Strwythur Pecyn DHCPREQUEST

Safle yn y pecyn
Enw'r gwerth (cyffredin)
Enghraifft
Cyflwyniad
Beit
Eglurhad

1
Cais Boot
1
Hex
1
Math o neges. 1 - cais gan gleient i weinydd, 2 - ymateb o weinydd i gleient

2
Math o galedwedd
1
Hex
1
Math o gyfeiriad caledwedd, yn y protocol hwn 1 - MAC

3
Mae caledwedd yn mynd i'r afael â hyd
6
Hex
1
Hyd cyfeiriad MAC y ddyfais

4
Hopys
1
Hex
1
Nifer y llwybrau canolradd

5
ID y Trafodiad
23:cf:de:1d
Hex
4
Dynodwr trafodiad unigryw. Wedi'i gynhyrchu gan y cleient ar ddechrau gweithrediad cais

7
Aeth yr ail heibio
0
Hex
4
Amser mewn eiliadau o ddechrau'r broses o gael cyfeiriad

9
Baneri Boot
8000
Hex
2
Rhai baneri y gellir eu gosod i ddangos paramedrau protocol. Yn yr achos hwn, mae “darlledu” wedi'i osod

11
Cyfeiriad IP cleient
0.0.0.0
Llinyn
4
Cyfeiriad IP cleient (os o gwbl)

15
Cyfeiriad IP eich cleient
172.16.134.61
Llinyn
4
Cyfeiriad IP a gynigir gan y gweinydd (os yw ar gael)

19
Cyfeiriad IP gweinydd nesaf
0.0.0.0
Llinyn
4
Cyfeiriad IP gweinydd (os yw'n hysbys)

23
Cyfeiriad IP asiant cyfnewid
172.16.114.41
Llinyn
4
Cyfeiriad IP yr asiant cyfnewid (er enghraifft, switsh)

27
Cyfeiriad MAC cleient
14:d6:4d:a7:c9:55
Hex
6
Cyfeiriad MAC anfonwr y pecyn (cleient)

31
Padin cyfeiriad caledwedd cleient
 
Hex
10
Sedd neilltuedig. Fel arfer llenwi â sero

41
Enw gwesteiwr y gweinydd
 
Llinyn
64
Enw gweinydd DHCP. Fel arfer ni chaiff ei drosglwyddo

105
Enw ffeil cychwyn
 
Llinyn
128
Enw ffeil ar y gweinydd a ddefnyddir gan orsafoedd di-ddisg wrth gychwyn

235
Cwcis hud
63: 82: 53: 63
Hex
4
Rhif “hud”, yn ôl pa un, gan gynnwys. gallwch benderfynu bod y pecyn hwn yn perthyn i'r protocol DHCP

Opsiynau DHCP. Gall fynd mewn unrhyw drefn

236
Rhif opsiwn
53
Rhagfyr
3
Opsiwn 53, sy'n diffinio pecyn DHCP math 3 - DHCPREQUEST

 
Hyd opsiwn
1
Rhagfyr
1

 
Gwerth opsiwn
3
Rhagfyr
1

 
Rhif opsiwn
61
Rhagfyr
1
ID Cleient: 01 (ar gyfer Ehernet) + cyfeiriad MAC cleient

 
Hyd opsiwn
7
Rhagfyr
1

 
Gwerth opsiwn
01:2c:ab:25:ff:72:a6
Hex
7

 
Rhif opsiwn
60
Rhagfyr
 
"Dynodwr dosbarth gwerthwr". Yn fy achos i, mae'n adrodd fersiwn cleient DHCP. Efallai bod dyfeisiau eraill yn dychwelyd rhywbeth gwahanol. Mae Windows er enghraifft yn adrodd MSFT 5.0

 
Hyd opsiwn
11
Rhagfyr
 

 
Gwerth opsiwn
udhcp 0.9.8
Llinyn
 

 
Rhif opsiwn
55
 
1
Paramedrau rhwydwaith y mae'r cleient yn gofyn amdanynt. Gall cyfansoddiad amrywio

01 - Mwgwd rhwydwaith
03 - Porth
06 - DNS
oc — Enw gwesteiwr
0f - enw parth rhwydwaith
1c - cyfeiriad y cais darlledu (darlledu)
42 - enw gweinydd TFTP
79 - Llwybr Sefydlog Di-ddosbarth

 
Hyd opsiwn
8
 
1

 
Gwerth opsiwn
01:03:06:0c:0f:1c:42:79
 
8

 
Rhif opsiwn
82
Rhagfyr
1
Mae Opsiwn 82 yn ailadrodd yr hyn a ddaeth yn DHCPDISCOVER

 
Hyd opsiwn
18
Rhagfyr
1

 
Gwerth opsiwn
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Rhagfyr
18

 
Diwedd y pecyn
255
Rhagfyr
1
Mae 255 yn symbol o ddiwedd y pecyn

DHCPACK

Fel cadarnhad “ie, mae hynny'n iawn, dyma'ch cyfeiriad IP, ac ni fyddaf yn ei roi i unrhyw un arall” gan y gweinydd DHCP, pecyn mewn fformat DHCPACK o'r gweinydd i'r cleient y mae'n ei wasanaethu. Mae'n cael ei anfon darlledu yn union fel pecynnau eraill. Er, yn y cod isod ar gyfer gweinydd DHCP a weithredwyd yn Python, rhag ofn, rwy'n dyblygu unrhyw gais darlledu trwy anfon pecyn at IP cleient penodol, os yw'n hysbys eisoes. Ar ben hynny, nid yw'r gweinydd DHCP yn poeni o gwbl a yw'r pecyn DHCPACK wedi cyrraedd y cleient. Os nad yw'r cleient yn derbyn DHCPACK, yna ar ôl ychydig mae'n ailadrodd DHCPREQUEST

Tabl Strwythur Pecyn DHCPACK

Safle yn y pecyn
Enw'r gwerth (cyffredin)
Enghraifft
Cyflwyniad
Beit
Eglurhad

1
Cais Boot
2
Hex
1
Math o neges. 1 - cais gan gleient i weinydd, 2 - ymateb o weinydd i gleient

2
Math o galedwedd
1
Hex
1
Math o gyfeiriad caledwedd, yn y protocol hwn 1 - MAC

3
Mae caledwedd yn mynd i'r afael â hyd
6
Hex
1
Hyd cyfeiriad MAC y ddyfais

4
Hopys
1
Hex
1
Nifer y llwybrau canolradd

5
ID y Trafodiad
23:cf:de:1d
Hex
4
Dynodwr trafodiad unigryw. Wedi'i gynhyrchu gan y cleient ar ddechrau gweithrediad cais

7
Aeth yr ail heibio
0
Hex
4
Amser mewn eiliadau o ddechrau'r broses o gael cyfeiriad

9
Baneri Boot
8000
Hex
2
Rhai baneri y gellir eu gosod i ddangos paramedrau protocol. Yn yr achos hwn, mae “darlledu” wedi'i osod

11
Cyfeiriad IP cleient
0.0.0.0
Llinyn
4
Cyfeiriad IP cleient (os o gwbl)

15
Cyfeiriad IP eich cleient
172.16.134.61
Llinyn
4
Cyfeiriad IP a gynigir gan y gweinydd (os yw ar gael)

19
Cyfeiriad IP gweinydd nesaf
0.0.0.0
Llinyn
4
Cyfeiriad IP gweinydd (os yw'n hysbys)

23
Cyfeiriad IP asiant cyfnewid
172.16.114.41
Llinyn
4
Cyfeiriad IP yr asiant cyfnewid (er enghraifft, switsh)

27
Cyfeiriad MAC cleient
14:d6:4d:a7:c9:55
Hex
6
Cyfeiriad MAC anfonwr y pecyn (cleient)

31
Padin cyfeiriad caledwedd cleient
 
Hex
10
Sedd neilltuedig. Fel arfer llenwi â sero

41
Enw gwesteiwr y gweinydd
 
Llinyn
64
Enw gweinydd DHCP. Fel arfer ni chaiff ei drosglwyddo

105
Enw ffeil cychwyn
 
Llinyn
128
Enw ffeil ar y gweinydd a ddefnyddir gan orsafoedd di-ddisg wrth gychwyn

235
Cwcis hud
63: 82: 53: 63
Hex
4
Rhif “hud”, yn ôl pa un, gan gynnwys. gallwch benderfynu bod y pecyn hwn yn perthyn i'r protocol DHCP

Opsiynau DHCP. Gall fynd mewn unrhyw drefn

236
Rhif opsiwn
53
Rhagfyr
3
Opsiwn 53, sy'n diffinio pecyn DHCP math 5 - DHCPACK

 
Hyd opsiwn
1
Rhagfyr
1

 
Gwerth opsiwn
5
Rhagfyr
1

 
Rhif opsiwn
1
Rhagfyr
1
Opsiwn i gynnig mwgwd rhwydwaith i'r cleient DHCP

 
Hyd opsiwn
4
Rhagfyr
1

 
Gwerth opsiwn
255.255.224.0
Llinyn
4

 
Rhif opsiwn
3
Rhagfyr
1
Opsiwn i gynnig porth rhagosodedig i'r cleient DHCP

 
Hyd opsiwn
4
Rhagfyr
1

 
Gwerth opsiwn
172.16.12.1
Llinyn
4

 
Rhif opsiwn
6
Rhagfyr
1
Opsiwn i gynnig DHCP i gleient DNS

 
Hyd opsiwn
4
Rhagfyr
1

 
Gwerth opsiwn
8.8.8.8
Llinyn
4

 
Rhif opsiwn
51
Rhagfyr
1
Oes y paramedrau rhwydwaith a gyhoeddwyd mewn eiliadau, ac ar ôl hynny mae'n rhaid i'r cleient DHCP ofyn amdanynt eto

 
Hyd opsiwn
4
Rhagfyr
1

 
Gwerth opsiwn
86400
Rhagfyr
4

 
Rhif opsiwn
82
Rhagfyr
1
Mae Opsiwn 82 yn ailadrodd yr hyn a ddaeth yn DHCPDISCOVER

 
Hyd opsiwn
18
Rhagfyr
1

 
Gwerth opsiwn
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Rhagfyr
18

 
Diwedd y pecyn
255
Rhagfyr
1
Mae 255 yn symbol o ddiwedd y pecyn

Gosod

Mae'r gosodiad mewn gwirionedd yn cynnwys gosod y modiwlau python sy'n angenrheidiol ar gyfer gwaith. Tybir bod MySQL eisoes wedi'i osod a'i ffurfweddu.

FreeBSD

pkg gosod python3 python3 -m ensurepip pip3 gosod mysql-connector

Ubuntu

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

Rydyn ni'n creu cronfa ddata MySQL, yn llwytho'r dymp pydhcp.sql i mewn iddo, ac yn ffurfweddu'r ffeil ffurfweddu.

Ffurfweddiad

Mae holl osodiadau gweinydd mewn ffeil xml. Ffeil cyfeirio:

1.0 0.0.0.0 255.255.255.255 192.168.0.71 8600 1 255.255.255.0 192.168.0.1 gwesteiwr lleol prawf prawf pydhcp opsiwn_8.8.8.8_hex:sw_port82:1:20 opsiwn_22_hex:sw_port82:2:16 opsiwn_18_hex:sw_mac:82:26 40 dewiswch ip, mwgwd, llwybrydd, dns gan ddefnyddwyr lle mae upper(mac)=upper('{option_3_AgentRemoteId_hex}') ac uchaf(port)=uwch('{option_1_AgentCircuitId_port_hex}') dewiswch ip, mwgwd, llwybrydd, dns gan ddefnyddwyr lle mae upper(mac)=upper('{sw_mac}') ac upper(port)=upper('{sw_port82}') dewiswch ip, mwgwd, llwybrydd, dns gan ddefnyddwyr lle mae upper(mac) = uchaf ('{ClientMacAddress}') mewnosod mewn hanes (id,dt, mac, ip, sylw) gwerthoedd (null, nawr(), '{ClientMacAddress}', '{RequestedIpAddress}', 'DHCPACK/INFORM')

Nawr yn fwy manwl ar y tagiau:

Mae'r adran dhcpserver yn disgrifio'r gosodiadau sylfaenol ar gyfer cychwyn y gweinydd, sef:

  • gwesteiwr - pa gyfeiriad IP y mae'r gweinydd yn gwrando arno ar borthladd 67
  • darlledu - pa ip yw'r darllediad ar gyfer DHCPOFFER a DHCPACK
  • DHCPServer - beth yw ip y gweinydd DHCP
  • Amser prydles LeaseTime o'r cyfeiriad IP a gyhoeddwyd
  • ThreadLimit - faint o edafedd sy'n rhedeg ar yr un pryd i brosesu pecynnau CDU sy'n dod i mewn ar borthladd 67. Mae i fod i helpu ar brosiectau llwyth uchel 😉
  • defaultMask, defaultRouter,defaultDNS - yr hyn a gynigir i'r tanysgrifiwr yn ddiofyn os canfyddir IP yn y gronfa ddata, ond nid yw paramedrau ychwanegol wedi'u pennu ar ei gyfer

adran mysql:

gwesteiwr, enw defnyddiwr, cyfrinair, enw sylfaen - mae popeth yn siarad drosto'i hun. Mae strwythur cronfa ddata bras yn cael ei bostio ar GitHub

Adran ymholiadau: disgrifir ceisiadau am dderbyn CYNNIG/ACK yma:

  • offer_count - nifer y llinellau gyda cheisiadau sy'n dychwelyd canlyniad fel ip, mwgwd, llwybrydd, dns
  • offer_n — llinyn ymholiad. Os yw dychwelyd yn wag, yna mae'n gweithredu'r cais cynnig canlynol
  • history_sql - ymholiad sy'n ysgrifennu, er enghraifft, at yr “hanes awdurdodi” ar gyfer tanysgrifiwr

Gall ceisiadau gynnwys unrhyw newidynnau o'r adran opsiynau neu opsiynau o'r protocol DHCP.

Adran Opsiynau. Dyma lle mae'n dod yn fwy diddorol. Yma gallwn greu newidynnau y gallwn eu defnyddio yn nes ymlaen yn yr adran ymholiadau.

Er enghraifft:

option_82_hex:sw_port1:20:22

, mae'r llinell orchymyn hon yn cymryd y llinell gyfan a ddaeth yn opsiwn cais DHCP 82, mewn fformat hecs, yn yr ystod o 20 i 22 bytes yn gynwysedig ac yn ei roi yn y newidyn sw_port1 newydd (porthladd newid o ble daeth y cais)

option_82_hex:sw_mac:26:40

, diffiniwch y newidyn sw_mac, gan gymryd yr hecs o'r ystod 26:40

Gallwch weld yr holl opsiynau posibl y gellir eu defnyddio mewn ymholiadau trwy gychwyn y gweinydd gyda'r switsh -d. Byddwn yn gweld rhywbeth fel y log hwn:

--cyrhaeddodd pecyn DHCPINFORM ar borth 67, o 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress': '0025224Address': '764'Address': '00'Address': '7'Address': '91Address', b'x5xa0xe3xa5xa9xa8-x8fx43a' %"Jxd0.0.0.0d' , ' HType ': 'Ethernet', 'HostName': b'x5.0xa0025224xe764xa172.30.128.13xa00xa00-x172.30.114.25fx308a ', 'ReqListDNS': Gwir, 'ReqListDomainName': Gwir, 'ReqListPerfowmRouterDiscover': Gwir, 'ReqListDNS': Gwir, 'ReqListDomainName': Gwir, 'ReqListPerfowmRouterDiscover': True, 'ReqList': True, 'ReqList': True 'ReqListSubnetM ask': Gwir, 'ReqListVendorSpecInfo': 6, 'RequestedIpAddress': '1', 'Vendor': b'MSFT 82 ', 'chaddr': '12ad12', 'ciaddr': '53'. , 'baneri': b'x53x55 ', 'giaddr': '55' , 'gpoz': 60, 'hlen': 60, 'hops': 61, 'htype': 'MAC', 'magic_cookie': 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_len ': 01 00, 'option_06_str': "b'x02x08x00x06x00x1x9x2x768x0.0.0.0x001x589x2x1x06eXx89exb8xad'", 'canlyniad': Gau, 'eiliadau': 3 'siaddr': '897', 'sw_mac': '8e0.0.0.0ebXNUMXad', 'sw_portXNUMX': 'XNUMX', 'xidbyte': b'

Yn unol â hynny, gallwn lapio unrhyw newidyn yn {} a bydd yn cael ei ddefnyddio yn yr ymholiad SQL.

Gadewch inni gofnodi ar gyfer hanes bod y cleient wedi derbyn y cyfeiriad IP:

Gweinydd DHCP + Mysql yn Python

Gweinydd DHCP + Mysql yn Python

Cychwyn gweinydd

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

— d modd allbwn consol DEBUG
- c <filename> ffeil ffurfweddu

Ôl-drafod

A nawr mwy o fanylion ar weithredu'r gweinydd yn Python. Mae'n boen. Dysgwyd Python ar y hedfan. Gwneir llawer o eiliadau yn arddull “wow, rywsut fe wnes i iddo weithio.” Heb ei optimeiddio o gwbl, a'i adael yn y ffurf hon yn bennaf oherwydd ychydig o brofiad yn natblygiad Python. Byddaf yn canolbwyntio ar yr agweddau mwyaf diddorol ar weithrediad y gweinydd yn “cod”.

Parser ffeil ffurfweddu XML

Defnyddir y modiwl Python safonol xml.dom. Mae'n ymddangos yn syml, ond yn ystod y gweithredu roedd diffyg amlwg o ddogfennaeth ac enghreifftiau clir ar y rhwydwaith sy'n defnyddio'r modiwl hwn.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") ar gyfer elem yn mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("gwesteiwr")[0].firstChild.data gconfig["mysql_username"]=elem.getElementsByTagName("enw defnyddiwr")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("cyfrinair")[0].firstChild.data gconfig["mysql_basename"] =elem.getElementsByTagName("enw sylfaen")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") ar gyfer elem yn dconfig: gconfig["broadcast"]=elem.getElementsByTagName("darlledu")[0]. firstChild.data gconfig["dhcp_host"]=elem.getElementsByTagName("gwesteiwr")[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("DHCPSserver")[0].firstChild.data gconfig["dhcp_defaultMask"] =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDNS"]=elem.getElementsByTagName defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("ymholiad") ar gyfer elem yn qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_cyfrif")[0].firstChild.data am num yn range(int(gconfig["offer_count"])): gconfig["offer_"+str(num+1)]=elem.getElementsByTagName("offer_"+str(num+1))[0].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[0].firstChild.data options=tree.getElementsByTagName("opsiynau") ar gyfer elem mewn opsiynau: node=elem.getElementsByTagName("opsiwn") ar gyfer opsiynau yn y nod : optionsMod.append(options.firstChild.data)

Aml-edau

Yn rhyfedd ddigon, mae multithreading yn Python yn cael ei weithredu'n glir ac yn syml iawn.

def PacketWork(data,addr): ... # gweithredu dosrannu'r pecyn sy'n dod i mewn ac ymateb iddo ... tra Gwir: data, addr = udp_socket.recvfrom(1024) # waiting for the UDP packet thread = threading.Thread( target=PacketWork , args=(data,addr,)).start() # fel y daeth - rydym yn lansio'r swyddogaeth PacketWork a ddiffiniwyd yn flaenorol yn y cefndir gyda pharamedrau wrth threading.active_count() > gconfig["dhcp_ThreadLimit"]: amser. cysgu(1) # os yw'r rhif Mae mwy o edafedd yn rhedeg yn barod nag yn y gosodiadau, rydym yn aros nes bod llai ohonynt

Derbyn/anfon pecyn DHCP

Er mwyn rhyng-gipio pecynnau CDU sy'n dod trwy'r cerdyn rhwydwaith, mae angen i chi "godi" y soced:

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

, lle mae'r baneri:

  • AF_INET - yn golygu mai fformat y cyfeiriad fydd IP: port. Efallai y bydd AF_UNIX hefyd - lle mae'r cyfeiriad yn cael ei roi gan enw'r ffeil.
  • SOCK_DGRAM - yn golygu nad ydym yn derbyn “pecyn amrwd”, ond un sydd eisoes wedi mynd trwy'r wal dân, a gyda phecyn wedi'i docio'n rhannol. Y rhai. dim ond pecyn CDU yr ydym yn ei dderbyn heb y gydran “ffisegol” o bapur lapio pecyn y CDU. Os ydych chi'n defnyddio'r faner SOCK_RAW, yna bydd angen i chi hefyd ddosrannu'r “lapiwr” hwn.

Gall anfon pecyn fod fel darllediad:

                    udp_socket.setsockopt(soced.SOL_SOCKET, soced.SO_BROADCAST, 1) #newid y soced i'r modd darlledu rz=udp_socket.sendto(pecyn, (gconfig["darlledu"],68))

, ac i’r cyfeiriad “o ble y daeth y pecyn”:

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # newid y soced i'r modd aml-wrandäwr rz=udp_socket.sendto(pecyn, addr)

, lle mae SOL_SOCKET yn golygu'r “lefel protocol” ar gyfer gosod opsiynau,

, SO_BROADCAST opsiwn bod y pecyn helmed yn "ddarlledu"

  Mae opsiwn ,SO_REUSEADDR yn newid y soced i'r modd “llawer o wrandawyr”. Mewn theori, mae'n ddiangen yn yr achos hwn, ond ar un o'r gweinyddwyr FreeBSD y profais arno, ni weithiodd y cod heb yr opsiwn hwn.

Dosrannu pecyn DHCP

Dyma lle roeddwn i wir yn hoffi Python. Mae'n ymddangos bod allan o'r blwch yn caniatáu ichi fod yn eithaf hyblyg gyda'r bytecode. Caniatáu iddo gael ei gyfieithu’n hawdd iawn i werthoedd degol, llinynnau a hecs – h.y. dyma sydd ei angen arnom mewn gwirionedd i ddeall strwythur y pecyn. Felly, er enghraifft, gallwch gael amrywiaeth o beit mewn HEX a beit yn unig:

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

, paciwch y beit yn strwythur:

res["baneri"]=pecyn('BB',data[10],data[11])

Cael IP o strwythur:

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

Ac i'r gwrthwyneb:

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

Dyna i gyd am y tro 😉

Ffynhonnell: hab.com

Ychwanegu sylw