DHCP + сервери Mysql дар Python

DHCP + сервери Mysql дар Python

Мақсади ин лоиҳа чунин буд:

  • Омӯзиш дар бораи DHCP дар шабакаи IPv4
  • Омӯзиши Python (каме бештар аз сифр 😉)
  • иваз кардани сервер DB2DHCP (шахри ман), аслӣ дар ин ҷо, ки барои ОС нав васл кардан торафт душвортар мегардад. Ва ба ман маъқул нест, ки ин дуӣ аст, ки роҳи "айни замон тағир додан" вуҷуд надорад
  • гирифтани сервери кории DHCP бо қобилияти интихоби суроғаи IP-и муштарӣ бо истифода аз mac муштарӣ ё коммутатсионӣ mac+port (Опсияи 82)
  • навиштани дучархаи дигар (Оҳ! ин фаъолияти дӯстдоштаи ман аст)
  • Гирифтани шарҳҳо дар бораи клуби шумо дар Habrahabr (ё беҳтараш, даъват) 😉

Натиҷа: он кор мекунад 😉 Дар FreeBSD ва Ubuntu OS озмуда шудааст. Аз ҷиҳати назариявӣ, кодро метавон дархост кард, ки дар ҳама гуна ОС кор кунад, зеро Чунин ба назар мерасад, ки дар код ягон бастабандии мушаххас вуҷуд надорад.
Бодиққат! Боз бисьёр чизхо дар пешанд.

Истинод ба анбори ҳаваскорон "зинда ламс".

Раванди насб, конфигуратсия ва истифодаи натиҷаи "омӯхтани сахтафзор" хеле пасттар аст ва сипас каме назария дар бораи протоколи DHCP. Барои худам. Ва барои таърих 😉

Як назария

DHCP чист

Ин протоколи шабакавист, ки ба дастгоҳ имкон медиҳад суроғаи IP-и худро (ва параметрҳои дигар ба монанди дарвоза, DNS ва ғ.) аз сервери DHCP пайдо кунад. Бастаҳо бо истифода аз протоколи UDP мубодила карда мешаванд. Принсипи умумии кори дастгоҳ ҳангоми дархости параметрҳои шабака чунин аст:

  1. Дастгоҳ (мизоҷ) дархости пахши UDP (DHCPDISCOVER) дар тамоми шабака бо дархости "хуб, касе ба ман суроғаи IP диҳад" мефиристад. Ғайр аз он, одатан (вале на ҳамеша) дархост аз бандари 68 (манбаъ) сурат мегирад ва макони таъинот порти 67 (маҳалли таъинот) мебошад. Баъзе дастгоҳҳо инчунин пакетҳоро аз порти 67 мефиристанд. Суроғаи MAC-и дастгоҳи муштарӣ дар дохили бастаи DHCPDISCOVER дохил карда шудааст.
  2. Ҳама серверҳои DHCP, ки дар шабака ҷойгиранд (ва шояд якчандтои онҳо бошанд) пешниҳоди DHCPOFFER-ро бо танзимоти шабака барои дастгоҳе, ки DHCPDISCOVER фиристодааст, ташкил медиҳанд ва инчунин онро тавассути шабака пахш мекунанд. Муайян кардани он, ки ин баста барои кӣ пешбинӣ шудааст, ба суроғаи MAC-и муштарӣ, ки қаблан дар дархости DHCPDISCOVER дода шуда буд, асос меёбад.
  3. Мизоҷ бастаҳоро бо пешниҳодҳо барои танзимоти шабака қабул мекунад, ҷолибтаринро интихоб мекунад (меъёрҳо метавонанд гуногун бошанд, масалан, вақти интиқоли бастаҳо, шумораи хатсайрҳои мобайнӣ) ва бо танзимоти шабака "дархости расмӣ" DHCPREQUEST медиҳад. аз сервери DHCP ба он маъқул аст. Дар ин ҳолат, баста ба сервери мушаххаси DHCP меравад.
  4. Сервере, ки DHCPREQUEST-ро гирифтааст, бастаи формати DHCPACK мефиристад, ки дар он бори дигар танзимоти шабакаро, ки барои ин муштарӣ пешбинӣ шудааст, номбар мекунад.

DHCP + сервери Mysql дар Python

Илова бар ин, бастаҳои DHCPINFORM мавҷуданд, ки аз муштарӣ меоянд ва ҳадафи онҳо огоҳ кардани сервери DHCP дар бораи он, ки "мизоҷ зинда аст" ва танзимоти шабакаи додашударо истифода мебарад. Дар татбиқи ин сервер ин бастаҳо сарфи назар карда мешаванд.

Формати баста

Умуман, чаҳорчӯбаи бастаи Ethernet чунин менамояд:

DHCP + сервери Mysql дар Python

Дар ҳолати мо, мо танҳо маълумотро мустақиман аз мундариҷаи бастаи UDP, бидуни сарлавҳаҳои протоколи қабати OSI, яъне сохтори DHCP баррасӣ хоҳем кард:

DHCPDISCOVER

Ҳамин тавр, раванди дарёфти суроғаи IP барои дастгоҳ аз он оғоз мешавад, ки муштарии DHCP дархости пахшро аз бандари 68 то 255.255.255.255:67 мефиристад. Дар ин баста муштарӣ суроғаи MAC ва инчунин он чизеро, ки аз сервери DHCP гирифтан мехоҳад, дар бар мегирад. Сохтори бастаҳо дар ҷадвали зер тавсиф шудааст.

Ҷадвали сохтори бастаҳои DHCPDISCOVER

Ҷойгир дар баста
Номи арзиш
Мисол
Муқаддима
Байт
Шарҳ

1
Дархости боркунӣ
1
Хез
1
Навъи паём. 1 - дархост аз муштарӣ ба сервер, 2 - посух аз сервер ба муштарӣ

2
Навъи сахтафзор
1
Хез
1
Навъи суроғаи сахтафзор, дар ин протокол 1 - MAC

3
Таҷҳизот ба дарозӣ муроҷиат мекунад
6
Хез
1
Дарозии суроғаи MAC дастгоҳ

4
Мастакҳо
1
Хез
1
Шумораи хатсайрҳои мобайнӣ

5
ID амалиёт
23:cf:de:1д
Хез
4
Идентификатори ягонаи транзаксия. Аз ҷониби муштарӣ дар оғози амалиёти дархост тавлид мешавад

7
Дуюм гузашт
0
Хез
4
Вақт бо сонияҳо аз оғози раванди дарёфти суроға

9
Парчамҳои боркунӣ
0
Хез
2
Баъзе парчамҳое, ки метавонанд барои нишон додани параметрҳои протокол таъин карда шаванд

11
Суроғаи IP муштарӣ
0.0.0.0
Стринг
4
Суроғаи IP муштарӣ (агар бошад)

15
Суроғаи IP муштарии шумо
0.0.0.0
Стринг
4
Суроғаи IP, ки сервер пешниҳод мекунад (агар дастрас бошад)

19
Суроғаи IP сервери навбатӣ
0.0.0.0
Стринг
4
Суроғаи IP сервер (агар маълум бошад)

23
Реле агенти суроғаи IP
172.16.114.41
Стринг
4
Суроғаи IP-и агенти реле (масалан, коммутатор)

27
Суроғаи MAC муштарӣ
14:d6:4d:a7:c9:55
Хез
6
Суроғаи MAC-и ирсолкунандаи баста (муштарӣ)

31
Таъмини суроғаи сахтафзори муштарӣ
 
Хез
10
Ҷойи захирашуда. Одатан бо сифрҳо пур карда мешавад

41
Номи хости сервер
 
Стринг
64
Номи сервери DHCP. Одатан интиқол дода намешавад

105
Номи файли пурборшаванда
 
Стринг
128
Номи файл дар сервер, ки ҳангоми пурборкунӣ истгоҳҳои бе диск истифода мебаранд

235
Кукиҳои ҷодугарӣ
63: 82: 53: 63
Хез
4
Рақами "ҷодугарӣ", ки мувофиқи он, аз ҷумла. шумо метавонед муайян кунед, ки ин баста ба протоколи DHCP тааллуқ дорад

Имконоти DHCP. Метавонед бо ҳама гуна тартиб равед

236
Рақами вариант
53
Дек
1
Варианти 53, ки навъи бастаи DHCP-ро муайян мекунад

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

 
Дарозии вариант
1
Дек
1

 
Арзиши опсия
1
Дек
1

 
Рақами вариант
50
Дек
1
Кадом суроғаи IP муштарӣ гирифтан мехоҳад?

 
Дарозии вариант
4
Дек
1

 
Арзиши опсия
172.16.134.61
Стринг
4

 
Рақами вариант
55
 
1
Параметрҳои шабака аз ҷониби муштарӣ дархостшуда. Таркиб метавонад фарқ кунад

01 — «Никоби сеть».
03 - Дарвоза
06 - DNS
oc — Номи мизбон
0f - номи домени шабака
1c - суроғаи дархости пахш (пахш)
42 - Номи сервери TFTP
79 - Масири статикии бесинф

 
Дарозии вариант
8
 
1

 
Арзиши опсия
01:03:06:0c:0f:1c:42:79
 
8

 
Рақами вариант
82
Дек
 
Варианти 82, ки суроғаи MAC-и дастгоҳи такрорӣ ва баъзе арзишҳои иловагиро интиқол медиҳад.

Аксар вақт ин порти коммутаторе мебошад, ки муштарии охири DHCP дар он кор мекунад.Ин хосият параметрҳои иловагиро дар бар мегирад.Байти аввал рақами «зери интихоб», дуюм дарозии он, баъд арзиши он мебошад.

Дар ин ҳолат, дар варианти 82, зерпараментҳо лона гузошта шудаанд:
Agent Circuit ID = 00:04:00:01:00:04, ки дар он ду байти охир порти муштарии DHCP мебошанд, ки дархост аз он ворид шудааст

Agent Remote ID = 00:06:c8:be:19:93:11:48 - суроғаи MAC-и дастгоҳи такрории DHCP

 
Дарозии вариант
18
Дек
 

 
Арзиши опсия
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Хез
 

 
Анҷоми баста
255
Дек
1
255 рамзи анҷоми бастаро нишон медиҳад

DHCPOFFER

Ҳамин ки сервер бастаи DHCPDISCOVER-ро қабул мекунад ва агар бубинад, ки метавонад ба муштарӣ чизе аз дархости дархостшуда пешниҳод кунад, он гоҳ барои он ҷавоб тавлид мекунад - DHCPDISCOVER. Ҷавоб ба бандар «аз куҷо омад», тавассути пахш фиристода мешавад, зеро Дар айни замон, муштарӣ суроғаи IP надорад, бинобар ин, он метавонад бастаро танҳо дар сурати фиристодани он тавассути пахш қабул кунад. Муштарӣ эътироф мекунад, ки ин баста барои ӯ аз рӯи суроғаи MAC дар дохили баста ва инчунин рақами транзаксияе, ки ӯ ҳангоми сохтани бастаи аввал тавлид мекунад, эътироф мекунад.

Ҷадвали сохтори бастаи DHCPOFFER

Ҷойгир дар баста
Номи арзиш (умумӣ)
Мисол
Муқаддима
Байт
Шарҳ

1
Дархости боркунӣ
1
Хез
1
Навъи паём. 1 - дархост аз муштарӣ ба сервер, 2 - посух аз сервер ба муштарӣ

2
Навъи сахтафзор
1
Хез
1
Навъи суроғаи сахтафзор, дар ин протокол 1 - MAC

3
Таҷҳизот ба дарозӣ муроҷиат мекунад
6
Хез
1
Дарозии суроғаи MAC дастгоҳ

4
Мастакҳо
1
Хез
1
Шумораи хатсайрҳои мобайнӣ

5
ID амалиёт
23:cf:de:1д
Хез
4
Идентификатори ягонаи транзаксия. Аз ҷониби муштарӣ дар оғози амалиёти дархост тавлид мешавад

7
Дуюм гузашт
0
Хез
4
Вақт бо сонияҳо аз оғози раванди дарёфти суроға

9
Парчамҳои боркунӣ
0
Хез
2
Баъзе парчамҳое, ки метавонанд барои нишон додани параметрҳои протокол таъин карда шаванд. Дар ин ҳолат, 0 маънои навъи дархости Unicast-ро дорад

11
Суроғаи IP муштарӣ
0.0.0.0
Стринг
4
Суроғаи IP муштарӣ (агар бошад)

15
Суроғаи IP муштарии шумо
172.16.134.61
Стринг
4
Суроғаи IP, ки сервер пешниҳод мекунад (агар дастрас бошад)

19
Суроғаи IP сервери навбатӣ
0.0.0.0
Стринг
4
Суроғаи IP сервер (агар маълум бошад)

23
Реле агенти суроғаи IP
172.16.114.41
Стринг
4
Суроғаи IP-и агенти реле (масалан, коммутатор)

27
Суроғаи MAC муштарӣ
14:d6:4d:a7:c9:55
Хез
6
Суроғаи MAC-и ирсолкунандаи баста (муштарӣ)

31
Таъмини суроғаи сахтафзори муштарӣ
 
Хез
10
Ҷойи захирашуда. Одатан бо сифрҳо пур карда мешавад

41
Номи хости сервер
 
Стринг
64
Номи сервери DHCP. Одатан интиқол дода намешавад

105
Номи файли пурборшаванда
 
Стринг
128
Номи файл дар сервер, ки ҳангоми пурборкунӣ истгоҳҳои бе диск истифода мебаранд

235
Кукиҳои ҷодугарӣ
63: 82: 53: 63
Хез
4
Рақами "ҷодугарӣ", ки мувофиқи он, аз ҷумла. шумо метавонед муайян кунед, ки ин баста ба протоколи DHCP тааллуқ дорад

Имконоти DHCP. Метавонед бо ҳама гуна тартиб равед

236
Рақами вариант
53
Дек
1
Опсияи 53, ки навъи бастаи DHCP 2 - DHCPOFFER -ро муайян мекунад

 
Дарозии вариант
1
Дек
1

 
Арзиши опсия
2
Дек
1

 
Рақами вариант
1
Дек
1
Опсияи пешниҳоди муштарии DHCP ниқоби шабакавӣ

 
Дарозии вариант
4
Дек
1

 
Арзиши опсия
255.255.224.0
Стринг
4

 
Рақами вариант
3
Дек
1
Опсия барои пешниҳоди муштарии DHCP як дарвозаи пешфарз

 
Дарозии вариант
4
Дек
1

 
Арзиши опсия
172.16.12.1
Стринг
4

 
Рақами вариант
6
Дек
1
Опсияи пешниҳоди DHCP ба муштарии DNS

 
Дарозии вариант
4
Дек
1

 
Арзиши опсия
8.8.8.8
Стринг
4

 
Рақами вариант
51
Дек
1
Давомнокии умри параметрҳои шабакаи додашуда дар сонияҳо, пас аз он муштарии DHCP бояд онҳоро дубора дархост кунад

 
Дарозии вариант
4
Дек
1

 
Арзиши опсия
86400
Дек
4

 
Рақами вариант
82
Дек
1
Варианти 82, он чизеро, ки дар DHCPDISCOVER омадааст, такрор мекунад

 
Дарозии вариант
18
Дек
1

 
Арзиши опсия
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4д: д
Дек
18

 
Анҷоми баста
255
Дек
1
255 рамзи анҷоми бастаро нишон медиҳад

DHCPREQUEST

Пас аз он ки муштарӣ DHCPOFFER-ро қабул мекунад, вай бастаеро ташкил мекунад, ки параметрҳои шабакаро на ба ҳама серверҳои DHCP дар шабака, балки танҳо ба як сервери мушаххасе, ки пешниҳоди DHCPOFFER ба ӯ бештар "писанд омад" дархост мекунад. Меъёрҳои "ба монанди" метавонанд гуногун бошанд ва аз татбиқи DHCP муштарӣ вобаста бошанд. Гирифтани дархост бо истифода аз суроғаи MAC-и сервери DHCP муайян карда мешавад. Инчунин, бастаи DHCPREQUEST метавонад аз ҷониби муштарӣ бидуни тавлиди аввал DHCPDISCOVER фиристода шавад, агар суроғаи IP-и сервер қаблан гирифта шуда бошад.

Ҷадвали сохтори бастаҳои DHCPREQUEST

Ҷойгир дар баста
Номи арзиш (умумӣ)
Мисол
Муқаддима
Байт
Шарҳ

1
Дархости боркунӣ
1
Хез
1
Навъи паём. 1 - дархост аз муштарӣ ба сервер, 2 - посух аз сервер ба муштарӣ

2
Навъи сахтафзор
1
Хез
1
Навъи суроғаи сахтафзор, дар ин протокол 1 - MAC

3
Таҷҳизот ба дарозӣ муроҷиат мекунад
6
Хез
1
Дарозии суроғаи MAC дастгоҳ

4
Мастакҳо
1
Хез
1
Шумораи хатсайрҳои мобайнӣ

5
ID амалиёт
23:cf:de:1д
Хез
4
Идентификатори ягонаи транзаксия. Аз ҷониби муштарӣ дар оғози амалиёти дархост тавлид мешавад

7
Дуюм гузашт
0
Хез
4
Вақт бо сонияҳо аз оғози раванди дарёфти суроға

9
Парчамҳои боркунӣ
8000
Хез
2
Баъзе парчамҳое, ки метавонанд барои нишон додани параметрҳои протокол таъин карда шаванд. Дар ин ҳолат, "пахш" муқаррар карда мешавад

11
Суроғаи IP муштарӣ
0.0.0.0
Стринг
4
Суроғаи IP муштарӣ (агар бошад)

15
Суроғаи IP муштарии шумо
172.16.134.61
Стринг
4
Суроғаи IP, ки сервер пешниҳод мекунад (агар дастрас бошад)

19
Суроғаи IP сервери навбатӣ
0.0.0.0
Стринг
4
Суроғаи IP сервер (агар маълум бошад)

23
Реле агенти суроғаи IP
172.16.114.41
Стринг
4
Суроғаи IP-и агенти реле (масалан, коммутатор)

27
Суроғаи MAC муштарӣ
14:d6:4d:a7:c9:55
Хез
6
Суроғаи MAC-и ирсолкунандаи баста (муштарӣ)

31
Таъмини суроғаи сахтафзори муштарӣ
 
Хез
10
Ҷойи захирашуда. Одатан бо сифрҳо пур карда мешавад

41
Номи хости сервер
 
Стринг
64
Номи сервери DHCP. Одатан интиқол дода намешавад

105
Номи файли пурборшаванда
 
Стринг
128
Номи файл дар сервер, ки ҳангоми пурборкунӣ истгоҳҳои бе диск истифода мебаранд

235
Кукиҳои ҷодугарӣ
63: 82: 53: 63
Хез
4
Рақами "ҷодугарӣ", ки мувофиқи он, аз ҷумла. шумо метавонед муайян кунед, ки ин баста ба протоколи DHCP тааллуқ дорад

Имконоти DHCP. Метавонед бо ҳама гуна тартиб равед

236
Рақами вариант
53
Дек
3
Опсияи 53, ки навъи бастаи DHCP-ро муайян мекунад 3 - DHCPREQUEST

 
Дарозии вариант
1
Дек
1

 
Арзиши опсия
3
Дек
1

 
Рақами вариант
61
Дек
1
ID муштарӣ: 01 (барои Ehernet) + суроғаи MAC муштарӣ

 
Дарозии вариант
7
Дек
1

 
Арзиши опсия
01:2c:ab:25:ff:72:a6
Хез
7

 
Рақами вариант
60
Дек
 
"Идентификатори синфи фурӯшанда". Дар ҳолати ман, он версияи муштарии DHCP хабар медиҳад. Шояд дастгоҳҳои дигар чизи дигарро баргардонанд. Масалан, Windows дар бораи MSFT 5.0 гузориш медиҳад

 
Дарозии вариант
11
Дек
 

 
Арзиши опсия
udhcp 0.9.8
Стринг
 

 
Рақами вариант
55
 
1
Параметрҳои шабака аз ҷониби муштарӣ дархостшуда. Таркиб метавонад фарқ кунад

01 — «Никоби сеть».
03 - Дарвоза
06 - DNS
oc — Номи мизбон
0f - номи домени шабака
1c - суроғаи дархости пахш (пахш)
42 - Номи сервери TFTP
79 - Масири статикии бесинф

 
Дарозии вариант
8
 
1

 
Арзиши опсия
01:03:06:0c:0f:1c:42:79
 
8

 
Рақами вариант
82
Дек
1
Варианти 82, он чизеро, ки дар DHCPDISCOVER омадааст, такрор мекунад

 
Дарозии вариант
18
Дек
1

 
Арзиши опсия
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4д: д
Дек
18

 
Анҷоми баста
255
Дек
1
255 рамзи анҷоми бастаро нишон медиҳад

DHCPACK

Ҳамчун тасдиқи он, ки "бале, ин дуруст аст, ин суроғаи IP-и шумост ва ман онро ба касе намедиҳам" аз сервери DHCP, баста дар формати DHCPACK аз сервер ба муштарӣ хидмат мекунад. Он мисли дигар бастаҳо пахш карда мешавад. Гарчанде, ки дар коди зер барои сервери DHCP, ки дар Python амалӣ карда шудааст, ман ҳар гуна дархости пахшро тавассути фиристодани баста ба IP муштарии мушаххас такрор мекунам, агар он аллакай маълум бошад. Ғайр аз он, сервери DHCP тамоман парвое надорад, ки бастаи DHCPACK ба муштарӣ расидааст. Агар муштарӣ DHCPACK-ро қабул накунад, пас аз муддате он танҳо DHCPREQUEST-ро такрор мекунад

Ҷадвали сохтори бастаи DHCPACK

Ҷойгир дар баста
Номи арзиш (умумӣ)
Мисол
Муқаддима
Байт
Шарҳ

1
Дархости боркунӣ
2
Хез
1
Навъи паём. 1 - дархост аз муштарӣ ба сервер, 2 - посух аз сервер ба муштарӣ

2
Навъи сахтафзор
1
Хез
1
Навъи суроғаи сахтафзор, дар ин протокол 1 - MAC

3
Таҷҳизот ба дарозӣ муроҷиат мекунад
6
Хез
1
Дарозии суроғаи MAC дастгоҳ

4
Мастакҳо
1
Хез
1
Шумораи хатсайрҳои мобайнӣ

5
ID амалиёт
23:cf:de:1д
Хез
4
Идентификатори ягонаи транзаксия. Аз ҷониби муштарӣ дар оғози амалиёти дархост тавлид мешавад

7
Дуюм гузашт
0
Хез
4
Вақт бо сонияҳо аз оғози раванди дарёфти суроға

9
Парчамҳои боркунӣ
8000
Хез
2
Баъзе парчамҳое, ки метавонанд барои нишон додани параметрҳои протокол таъин карда шаванд. Дар ин ҳолат, "пахш" муқаррар карда мешавад

11
Суроғаи IP муштарӣ
0.0.0.0
Стринг
4
Суроғаи IP муштарӣ (агар бошад)

15
Суроғаи IP муштарии шумо
172.16.134.61
Стринг
4
Суроғаи IP, ки сервер пешниҳод мекунад (агар дастрас бошад)

19
Суроғаи IP сервери навбатӣ
0.0.0.0
Стринг
4
Суроғаи IP сервер (агар маълум бошад)

23
Реле агенти суроғаи IP
172.16.114.41
Стринг
4
Суроғаи IP-и агенти реле (масалан, коммутатор)

27
Суроғаи MAC муштарӣ
14:d6:4d:a7:c9:55
Хез
6
Суроғаи MAC-и ирсолкунандаи баста (муштарӣ)

31
Таъмини суроғаи сахтафзори муштарӣ
 
Хез
10
Ҷойи захирашуда. Одатан бо сифрҳо пур карда мешавад

41
Номи хости сервер
 
Стринг
64
Номи сервери DHCP. Одатан интиқол дода намешавад

105
Номи файли пурборшаванда
 
Стринг
128
Номи файл дар сервер, ки ҳангоми пурборкунӣ истгоҳҳои бе диск истифода мебаранд

235
Кукиҳои ҷодугарӣ
63: 82: 53: 63
Хез
4
Рақами "ҷодугарӣ", ки мувофиқи он, аз ҷумла. шумо метавонед муайян кунед, ки ин баста ба протоколи DHCP тааллуқ дорад

Имконоти DHCP. Метавонед бо ҳама гуна тартиб равед

236
Рақами вариант
53
Дек
3
Варианти 53, ки навъи бастаи DHCP 5 - DHCPACK -ро муайян мекунад

 
Дарозии вариант
1
Дек
1

 
Арзиши опсия
5
Дек
1

 
Рақами вариант
1
Дек
1
Опсияи пешниҳоди муштарии DHCP ниқоби шабакавӣ

 
Дарозии вариант
4
Дек
1

 
Арзиши опсия
255.255.224.0
Стринг
4

 
Рақами вариант
3
Дек
1
Опсия барои пешниҳоди муштарии DHCP як дарвозаи пешфарз

 
Дарозии вариант
4
Дек
1

 
Арзиши опсия
172.16.12.1
Стринг
4

 
Рақами вариант
6
Дек
1
Опсияи пешниҳоди DHCP ба муштарии DNS

 
Дарозии вариант
4
Дек
1

 
Арзиши опсия
8.8.8.8
Стринг
4

 
Рақами вариант
51
Дек
1
Давомнокии умри параметрҳои шабакаи додашуда дар сонияҳо, пас аз он муштарии DHCP бояд онҳоро дубора дархост кунад

 
Дарозии вариант
4
Дек
1

 
Арзиши опсия
86400
Дек
4

 
Рақами вариант
82
Дек
1
Варианти 82, он чизеро, ки дар DHCPDISCOVER омадааст, такрор мекунад

 
Дарозии вариант
18
Дек
1

 
Арзиши опсия
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4д: д
Дек
18

 
Анҷоми баста
255
Дек
1
255 рамзи анҷоми бастаро нишон медиҳад

параметр

Насб воқеан аз насб кардани модулҳои python барои кор зарур аст. Тахмин меравад, ки MySQL аллакай насб ва танзим шудааст.

FreeBSD

pkg насб кардани python3 python3 -m providepip pip3 насб кардани mysql-connector

Ubuntu

sudo apt-get насб кунед python3 sudo apt-get насб кунед pip3 sudo pip3 насб кунед mysql-пайвасткунак

Мо базаи MySQL эҷод мекунем, партови pydhcp.sql-ро ба он бор мекунем ва файли конфигуратсияро танзим мекунем.

Танзимот

Ҳама танзимоти сервер дар файли xml мебошанд. Файли истинод:

1.0 0.0.0.0 255.255.255.255 192.168.0.71 8600 1 255.255.255.0 192.168.0.1 маҳаллӣ озмоиш озмоиш 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-ро аз корбароне интихоб кунед, ки дар он ҷо боло(mac)=боло('{option_3_AgentRemoteId_hex}') ва боло(порт)=боло('{option_1_AgentCircuitId_port_hex}') аз корбароне, ки дар он ҷо боло(mac)=боло('{sw_mac}') ва боло(порт)=боло('{sw_port82}') ip,mask,router,dns-ро интихоб кунед. аз корбароне, ки дар он ҷо боло(mac)=боло('{ClientMacAddress}') ip,mask,router,dns-ро интихоб кунед ба таърих ворид кунед (id,dt,mac,ip,comment) арзишҳо (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Акнун муфассалтар дар бораи барчаспҳо:

Бахши dhcpserver танзимоти асосиро барои оғоз кардани сервер тавсиф мекунад, яъне:

  • ҳост - кадом суроғаи IP сервер дар порти 67 гӯш мекунад
  • пахш - кадом IP пахш барои DHCPOFFER ва DHCPACK аст
  • DHCPServer - IP-и сервери DHCP чист
  • Вақти иҷораи суроғаи IP додашудаи LeaseTime
  • ThreadLimit - барои коркарди бастаҳои UDP-и воридотӣ дар порти 67 чанд ришта ҳамзамон кор мекунад. Он бояд дар лоиҳаҳои пурбор кӯмак кунад 😉
  • defaultMask,defaultRouter,defaultDNS - он чизест, ки ба муштарӣ бо нобаёнӣ пешниҳод карда мешавад, агар IP дар базаи маълумот пайдо шавад, аммо барои он параметрҳои иловагӣ муайян карда нашудаанд

фасли mysql:

мизбон, номи корбар, парол, номи асосӣ - ҳама чиз барои худ сухан мегӯяд. Сохтори тахминии базаи маълумот дар он ҷойгир карда шудааст GitHub

Бахши пурсиш: дархостҳо барои гирифтани OFFER/ACK дар ин ҷо тавсиф шудаанд:

  • offer_count — шумораи сатрҳо бо дархостҳое, ки натиҷаеро ба мисли ip, mask, роутер, dns бармегардонанд
  • offer_n — сатри дархост. Агар бозгашт холӣ бошад, пас дархости пешниҳоди зеринро иҷро мекунад
  • history_sql - дархосте, ки масалан ба "таърихи авторизатсия" барои муштарӣ менависад

Дархостҳо метавонанд ҳама гуна тағирёбандаҳоро аз бахши интихобҳо ё имконоти протоколи DHCP дар бар гиранд.

Бахши параметрҳо. Ин ҷо ҷолибтар мешавад. Дар ин ҷо мо метавонем тағирёбандаҳоро эҷод кунем, ки мо метавонем баъдтар дар бахши дархост истифода барем.

Масалан:

option_82_hex:sw_port1:20:22

, ин сатри фармон тамоми сатри дар дархости DHCP барои опсияи 82 омадаро дар формати шонздаҳӣ дар диапазони аз 20 то 22 байт мегирад ва онро дар тағирёбандаи нави sw_port1 мегузорад (гузариши порт аз куҷо дархост омад)

option_82_hex:sw_mac:26:40

, муайян тағйирёбанда sw_mac, бо назардошти шонздаҳӣ аз диапазони 26:40

Шумо метавонед ҳамаи имконоти имконпазирро, ки метавонанд дар дархостҳо истифода шаванд, тавассути оғоз кардани сервер бо гузариши -d дидан мумкин аст. Мо чизе монанди ин гузориш хоҳем дид:

--як бастаи DHCPINFORM ба порти 67, аз 0025224ad764, b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress'0025224,'764Caddress'00,'7'cddress, омад. : b'x91 5%"Jxd0d' , ' HType': 'Ethernet', 'HostName': b'x3xa5xe9xa8xa8xa43-x0.0.0.0fx5.0a', 'ReqListDNS': True, 'ReqListDomainName': Рост, 'ReqListPerfowmRouter TrueList,'ReqListPerfowmRouterDiscovere,'ReqList:',' Роҳ ': Дуруст, 'ReqListSubnetM мепурсад ': Дуруст, 'ReqListVendorSpecInfo': 0025224, 'RequestedIpAddress': '764', 'Vendor': b'MSFT 172.30.128.13', 'chaddr': '00ad00.'172.30.114.25ad308.' ' , 'парчамҳо ': b'x6x1', 'giaddr': '82', 'gpoz': 12, 'hlen': 12, 'hops': 53, 'htype': 'MAC', 'magic_cookie:' b'cx53Sc ', 'op': 'DHCPINFORM', 'option55': 55, 'option60': 60, 'option61': 61, 'option82': 82, 'option82': 12, 'option01': 06,' option_00_byte': b'x04x00x01x00x06x02x08x00x06x00x1x9' b'x2x82x12010600040001000602080006001eXx589exb2xad', 'option_82_hex': '18ad 'option_82_len': 12 01, 'option_06_str': "b'x00x04x00x01x00x06x02x08x00x06x00x1x9x2x768eXx0.0.0.0exb001xad'", 'натиҷа': бардурӯғ, 589s:' 'siaddr': '2', 'sw_mac': '1e06eb89ad', 'sw_port8': '3', 'xidbyte': b'

Мувофиқи он, мо метавонем ҳама гуна тағирёбандаро дар {} печонем ва он дар дархости SQL истифода мешавад.

Биёед барои таърих сабт кунем, ки муштарӣ суроғаи IP-ро гирифтааст:

DHCP + сервери Mysql дар Python

DHCP + сервери Mysql дар Python

Оғози сервер

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

— d режими баромади консол DEBUG
- c <namename> файли конфигуратсия

Хулосабарорӣ

Ва ҳоло тафсилоти бештар дар бораи татбиқи сервер дар Python. Ин дард аст. Python дар парвоз омӯхта шуд. Лаҳзаҳои зиёде бо услуби "вой, ман чӣ гуна кор кардам" сохта шудаанд. Умуман оптимизатсия карда нашудааст ва асосан аз сабаби таҷрибаи ками таҳияи Python дар ин шакл мондааст. Ман дар бораи ҷанбаҳои ҷолибтарини татбиқи сервер дар "код" таваққуф хоҳам кард.

Таҳлилгари файли конфигуратсияи XML

Модули стандартии Python xml.dom истифода мешавад. Чунин ба назар мерасад, ки оддӣ аст, аммо ҳангоми татбиқи ин модул камбудиҳои назарраси ҳуҷҷатҳои дақиқ ва мисолҳо дар шабака ба назар мерасанд.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") барои elem дар mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0]. gconfig["mysql_username"]=elem.getElementsByTagName("username")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("password")[0].firstChild_se["name] gconfigdba." =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") барои elem дар dconfig: gconfig["broadcast"]=elem.getElementsByTagName()"[]ad." firstChild.data gconfig["dhcp_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["dhcp_LeaseTime"]=elem.getElementsByTagName("LeaseTime") gconfig[0]. DHCP_TEREADLIMIT "] = INT (ELEMSELOTELSTYBAME (" Threadlimit ") [DHCPINCESTYBENTYBAME (« DCCP_SERARTYBERSTAME («DCCPIVER» ("DHCPIVER") [D] .FARMESTSYSTANDSTAMPY ("DHCPINGER") .fata gonfig.data gonfig '] = ELEMSELESTOMEBAMEBAME ("CheatchyStellSt_data Gets.data gondfigs"] = Elmefalentsberbernner ("DHCPANGINGIONTYBENTIONNNENT) defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") for elem дар qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild inta. диапазон(int(gconfig["offer_count"])): gconfig["offer_"+str(num+0)]=elem.getElementsByTagName("offer_"+str(num+0))[0].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[0].firstChild.data options=tree.getElementsByTagName("Options") барои elem дар имконоти: node=elem.getElementsByTagName("option") барои интихобҳо дар node : optionsMod.append(options.firstChild.data)

Мултираи

Тааҷҷубовар аст, ки чанд ришта дар Python хеле возеҳ ва содда амалӣ карда мешавад.

def PacketWork(data,addr): ... # амалисозии таҳлили бастаи воридотӣ ва посух додан ба он ... дар ҳоле, ки дуруст аст: маълумот, addr = udp_socket.recvfrom(1024) # интизори риштаи пакети UDP = threading.Thread( target=PacketWork, args=(data,addr,)).start() # чун омад - мо функсияи қаблан муайяншудаи PacketWork-ро дар замина бо параметрҳо ҳангоми threading.active_count() >gconfig["dhcp_ThreadLimit"] оғоз мекунем: вақт. хоб(1) # агар рақам назар ба танзимот риштаҳои бештар иҷро шуда бошанд, мо интизор мешавем, ки шумораи онҳо камтар шавад.

Пакетҳои DHCP-ро қабул/фиристед

Барои боздоштани бастаҳои UDP, ки тавассути корти шабакавӣ ворид мешаванд, шумо бояд розеткаро "баланд кунед":

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

, дар куҷо парчамҳо ҳастанд:

  • AF_INET - маънои онро дорад, ки формати суроға IP хоҳад буд: порт. Инчунин метавонад AF_UNIX бошад - дар он суроға бо номи файл дода мешавад.
  • SOCK_DGRAM - маънои онро дорад, ки мо "бастаи хом" -ро қабул намекунем, аммо бастаи он аллакай аз брандмауэр гузаштааст ва бастаи қисман буридашуда. Онхое. мо танҳо як бастаи UDP-ро бидуни ҷузъи "физикӣ"-и бастаи бастаи UDP мегирем. Агар шумо парчами SOCK_RAW -ро истифода баред, он гоҳ ба шумо низ лозим меояд, ки ин "маҷмӯа"-ро таҳлил кунед.

Фиристодани баста метавонад мисли пахш бошад:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #сокетро ба реҷаи пахш гузаронед rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

, ва ба суроғаи "баста аз куҷо омадааст":

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # розеткаро ба ҳолати бисёршунаванда гузаронед rz=udp_socket.sendto(packettack, addr)

, ки дар он SOL_SOCKET маънои "сатҳи протокол" барои танзими имконоти,

, Опсияи SO_BROADCAST, ки бастаи хӯди "пахш" аст

  Опсияи ,SO_REUSEADDR розеткаро ба реҷаи "шунавандагони бисёр" мегузарад. Дар назария, ин дар ин ҳолат нолозим аст, аммо дар яке аз серверҳои FreeBSD, ки ман дар он озмоиш кардам, код бе ин хосият кор накард.

Таҳлили бастаи DHCP

Ин ҷоест, ки ба ман Python хеле маъқул буд. Маълум мешавад, ки аз қуттӣ он ба шумо имкон медиҳад, ки бо байт-код хеле чандир бошед. Имкон додан ба он хеле ба осонӣ ба арзишҳои даҳӣ, сатрҳо ва шонздаҳӣ тарҷума карда шавад - яъне. ин аст он чизе ки мо воқеан бояд сохтори бастаро фаҳмем. Ҳамин тавр, масалан, шумо метавонед як қатор байтҳоро дар HEX ва танҳо байтҳо ба даст оред:

    res["xidhex"]=маълумот[4:8].hex() res["xidbyte"]=маълумот[4:8]

, байтҳоро ба сохтор бастабандӣ кунед:

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

Гирифтани IP аз сохтор:

res["ciaddr"]=socket.inet_ntoa(маҷмӯа('BBBB',маълумот[12],маълумот[13],маълумот[14],маълумот[15]));

Ва баръакс:

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

Ҳоло ҳамааш ҳамин 😉

Манбаъ: will.com

Илова Эзоҳ