Python тіліндегі DHCP+Mysql сервері

Python тіліндегі DHCP+Mysql сервері

Бұл жобаның мақсаты:

  • IPv4 желісіндегі DHCP туралы білу
  • Python тілін үйрену (нөлден сәл артық😉)
  • серверді ауыстыру DB2DHCP (менің шанышқым), түпнұсқа осында, оны жаңа ОЖ үшін жинау қиындап барады. Маған «дәл қазір өзгертуге» жол жоқ екілік жүйе болғаны ұнамайды.
  • абоненттің mac немесе коммутатор mac+порт комбинациясын пайдаланып абоненттің IP мекенжайын таңдау мүмкіндігі бар жұмыс істейтін DHCP серверін алу (82 опция)
  • басқа велосипед жазу (О, бұл менің сүйікті әрекетім)
  • Хабрахабрдағы клубтық жұмысыңыз туралы пікірлер алу (немесе жақсырақ, шақыру) 😉

Нәтиже: ол жұмыс істейді 😉 FreeBSD және Ubuntu операциялық жүйелерінде сыналған. Теориялық тұрғыдан, кодты кез келген ОЖ астында жұмыс істеуді сұрауға болады, өйткені Кодта арнайы байланыстырулар жоқ сияқты.
Абайлаңыз! Алда көп нәрсе бар.

Әуесқойларға арналған репозиторийге сілтеме «тірі түртіңіз».

«Аппараттық құралды зерттеу» нәтижесін орнату, конфигурациялау және пайдалану процесі әлдеқайда төмен, содан кейін DHCP хаттамасы туралы аздаған теория. Өзім үшін. Ал тарих үшін 😉

Кішкене теория

DHCP дегеніміз не

Бұл құрылғыға DHCP серверінен оның IP мекенжайын (және шлюз, DNS, т.б. сияқты басқа параметрлерді) білуге ​​мүмкіндік беретін желілік протокол. Пакеттерді алмасу UDP протоколы арқылы жүзеге асырылады. Желі параметрлерін сұрау кезінде құрылғының жалпы жұмыс принципі келесідей:

  1. Құрылғы (клиент) бүкіл желіге UDP тарату сұрауын (DHCPDISCOVER) «жақсы, біреу маған IP мекенжайын беріңіз» деген сұраныспен жібереді. Сонымен қатар, әдетте (бірақ әрқашан емес) сұрау 68-порттан (көз), ал тағайындалған орын 67-порттан (тағайындалған орын) болады. Кейбір құрылғылар пакеттерді 67 порттан да жібереді. Клиенттік құрылғының MAC мекенжайы DHCPDISCOVER пакетіне кіреді.
  2. Желіде орналасқан барлық DHCP серверлері (және олардың бірнешеуі болуы мүмкін) DHCPDISCOVER жіберген құрылғы үшін желі параметрлері бар DHCPOFFER ұсынысын жасайды, сонымен қатар оны желі арқылы таратады. Бұл пакеттің кімге арналғанын анықтау DHCPDISCOVER сұрауында бұрын берілген клиенттің MAC мекенжайына негізделген.
  3. Клиент желі параметрлері бойынша ұсыныстары бар пакеттерді қабылдайды, ең тартымдысын таңдайды (критерийлер әртүрлі болуы мүмкін, мысалы, пакетті жеткізу уақыты, аралық маршруттар саны) және желі параметрлерімен DHCPREQUEST «ресми сұранысын» жасайды. оған ұнайтын DHCP серверінен. Бұл жағдайда пакет белгілі бір DHCP серверіне өтеді.
  4. DHCPREQUEST алған сервер DHCPACK пішім пакетін жібереді, онда ол осы клиентке арналған желі параметрлерін тағы бір рет тізімдейді.

Python тіліндегі DHCP+Mysql сервері

Бұған қоса, клиенттен келетін DHCPINFORM пакеттері бар және олардың мақсаты DHCP серверіне «клиент тірі» және берілген желі параметрлерін пайдаланып жатқаны туралы хабарлау болып табылады. Бұл серверді іске асыруда бұл пакеттер еленбейді.

Пакет пішімі

Жалпы, Ethernet пакеттік жақтауы келесідей көрінеді:

Python тіліндегі DHCP+Mysql сервері

Біздің жағдайда біз OSI деңгейі хаттамасының тақырыптарынсыз, атап айтқанда DHCP құрылымынсыз UDP пакетінің мазмұнынан деректерді ғана қарастырамыз:

DHCPDISCOVER

Сонымен, құрылғының IP мекенжайын алу процесі DHCP клиентінің 68 портынан 255.255.255.255:67 дейін тарату сұрауын жіберуінен басталады. Бұл пакетте клиент өзінің MAC мекенжайын, сонымен қатар DHCP серверінен нақты нені алғысы келетінін қамтиды. Пакет құрылымы төмендегі кестеде сипатталған.

DHCPDISCOVER Пакет құрылымының кестесі

Пакеттегі орын
Мән атауы
Мысал:
Кіріспе
Байт
Түсіндіру

1
Жүктеу сұрауы
1
Hex
1
Хабар түрі. 1 – клиенттен серверге сұраныс, 2 – серверден клиентке жауап

2
Аппараттық құрал түрі
1
Hex
1
Аппараттық адрестің түрі, осы хаттамада 1 - MAC

3
Аппараттық құрал ұзындығын анықтайды
6
Hex
1
Құрылғының MAC мекенжайының ұзындығы

4
Хопс
1
Hex
1
Аралық бағыттар саны

5
Мәміле идентификаторы
23:cf:de:1d
Hex
4
Бірегей транзакция идентификаторы. Сұрау операциясының басында клиент жасаған

7
Екінші өтті
0
Hex
4
Мекенжайды алу процесінің басынан секундпен есептелген уақыт

9
Жүктеу жалаушалары
0
Hex
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
Hex
6
Пакет жіберушінің (клиенттің) MAC мекенжайы

31
Клиенттік жабдықтың мекенжайын толтыру
 
Hex
10
Резервтелген орын. Әдетте нөлдермен толтырылады

41
Сервер хост атауы
 
Жол
64
DHCP сервер атауы. Әдетте берілмейді

105
Жүктеу файлының аты
 
Жол
128
Жүктеу кезінде дискісіз станциялар пайдаланатын сервердегі файл атауы

235
Сиқырлы печенье
63: 82: 53: 63
Hex
4
«Сиқырлы» нөмір, оған сәйкес, соның ішінде. бұл пакеттің DHCP протоколына жататынын анықтауға болады

DHCP опциялары. Кез келген ретпен жүруге болады

236
Опция нөмірі
53
Dec
1
DHCP пакет түрін көрсететін 53 опция

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

 
Опция ұзындығы
1
Dec
1

 
Опция мәні
1
Dec
1

 
Опция нөмірі
50
Dec
1
Клиент қандай IP мекенжайын алғысы келеді?

 
Опция ұзындығы
4
Dec
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
Dec
 
Қайталау құрылғысының MAC мекенжайын және кейбір қосымша мәндерді жіберетін 82 опция.

Көбінесе бұл соңғы DHCP клиенті жұмыс істейтін қосқыштың порты.Бұл опция қосымша параметрлерді қамтиды.Бірінші байт – «қосалқы опцияның» нөмірі, екіншісі – оның ұзындығы, содан кейін оның мәні.

Бұл жағдайда 82 нұсқада ішкі опциялар кірістірілген:
Агент тізбегі идентификаторы = 00:04:00:01:00:04, мұндағы соңғы екі байт сұрау келген DHCP клиент порты болып табылады.

Agent Remote ID = 00:06:c8:be:19:93:11:48 - DHCP қайталағыш құрылғысының MAC мекенжайы

 
Опция ұзындығы
18
Dec
 

 
Опция мәні
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Пакеттің соңы
255
Dec
1
255 пакеттің соңын білдіреді

DHCPOFFER

Сервер DHCPDISCOVER пакетін алғаннан кейін және егер ол клиентке сұралғаннан бірдеңе ұсына алатынын көрсе, ол оған жауап береді - DHCPDISCOVER. Жауап портқа «ол келген жерден» жіберіледі, өйткені Қазіргі уақытта клиентте әлі IP мекенжайы жоқ, сондықтан ол пакетті тек тарату арқылы жіберген жағдайда ғана қабылдай алады. Клиент бұл пакет екенін пакет ішіндегі MAC мекенжайы, сондай-ақ бірінші бума жасалған кезде жасайтын транзакция нөмірі арқылы таниды.

DHCPOFFER Пакет құрылымының кестесі

Пакеттегі орын
Құн атауы (ортақ)
Мысал:
Кіріспе
Байт
Түсіндіру

1
Жүктеу сұрауы
1
Hex
1
Хабар түрі. 1 – клиенттен серверге сұраныс, 2 – серверден клиентке жауап

2
Аппараттық құрал түрі
1
Hex
1
Аппараттық адрестің түрі, осы хаттамада 1 - MAC

3
Аппараттық құрал ұзындығын анықтайды
6
Hex
1
Құрылғының MAC мекенжайының ұзындығы

4
Хопс
1
Hex
1
Аралық бағыттар саны

5
Мәміле идентификаторы
23:cf:de:1d
Hex
4
Бірегей транзакция идентификаторы. Сұрау операциясының басында клиент жасаған

7
Екінші өтті
0
Hex
4
Мекенжайды алу процесінің басынан секундпен есептелген уақыт

9
Жүктеу жалаушалары
0
Hex
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
Hex
6
Пакет жіберушінің (клиенттің) MAC мекенжайы

31
Клиенттік жабдықтың мекенжайын толтыру
 
Hex
10
Резервтелген орын. Әдетте нөлдермен толтырылады

41
Сервер хост атауы
 
Жол
64
DHCP сервер атауы. Әдетте берілмейді

105
Жүктеу файлының аты
 
Жол
128
Жүктеу кезінде дискісіз станциялар пайдаланатын сервердегі файл атауы

235
Сиқырлы печенье
63: 82: 53: 63
Hex
4
«Сиқырлы» нөмір, оған сәйкес, соның ішінде. бұл пакеттің DHCP протоколына жататынын анықтауға болады

DHCP опциялары. Кез келген ретпен жүруге болады

236
Опция нөмірі
53
Dec
1
DHCP 53 пакет түрін анықтайтын 2 опция - DHCPOFFER

 
Опция ұзындығы
1
Dec
1

 
Опция мәні
2
Dec
1

 
Опция нөмірі
1
Dec
1
DHCP клиентіне желі маскасын ұсыну опциясы

 
Опция ұзындығы
4
Dec
1

 
Опция мәні
255.255.224.0
Жол
4

 
Опция нөмірі
3
Dec
1
DHCP клиентіне әдепкі шлюзді ұсыну опциясы

 
Опция ұзындығы
4
Dec
1

 
Опция мәні
172.16.12.1
Жол
4

 
Опция нөмірі
6
Dec
1
DNS клиентіне DHCP ұсыну опциясы

 
Опция ұзындығы
4
Dec
1

 
Опция мәні
8.8.8.8
Жол
4

 
Опция нөмірі
51
Dec
1
Берілген желі параметрлерінің қызмет ету мерзімі секундтарда, содан кейін DHCP клиенті оларды қайтадан сұрауы керек

 
Опция ұзындығы
4
Dec
1

 
Опция мәні
86400
Dec
4

 
Опция нөмірі
82
Dec
1
82 опция, DHCPDISCOVER ішінде келгенді қайталайды

 
Опция ұзындығы
18
Dec
1

 
Опция мәні
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:c
Dec
18

 
Пакеттің соңы
255
Dec
1
255 пакеттің соңын білдіреді

DHCPREQUEST

Клиент DHCPOFFER алғаннан кейін ол желі параметрлерін желідегі барлық DHCP серверлеріне емес, тек DHCPOFFER ұсынысы өзіне көбірек «ұнаған» бір нақты серверге сұрау пакетін құрады. «Ұнату» критерийлері әртүрлі болуы мүмкін және клиенттің DHCP енгізуіне байланысты. Сұраныс алушы DHCP серверінің MAC мекенжайы арқылы көрсетіледі. Сондай-ақ, сервердің IP мекенжайы бұрын алынған болса, DHCPREQUEST пакетін клиент алдымен DHCPDISCOVER жасамай-ақ жібере алады.

DHCPREQUEST Пакет құрылымының кестесі

Пакеттегі орын
Құн атауы (ортақ)
Мысал:
Кіріспе
Байт
Түсіндіру

1
Жүктеу сұрауы
1
Hex
1
Хабар түрі. 1 – клиенттен серверге сұраныс, 2 – серверден клиентке жауап

2
Аппараттық құрал түрі
1
Hex
1
Аппараттық адрестің түрі, осы хаттамада 1 - MAC

3
Аппараттық құрал ұзындығын анықтайды
6
Hex
1
Құрылғының MAC мекенжайының ұзындығы

4
Хопс
1
Hex
1
Аралық бағыттар саны

5
Мәміле идентификаторы
23:cf:de:1d
Hex
4
Бірегей транзакция идентификаторы. Сұрау операциясының басында клиент жасаған

7
Екінші өтті
0
Hex
4
Мекенжайды алу процесінің басынан секундпен есептелген уақыт

9
Жүктеу жалаушалары
8000
Hex
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
Hex
6
Пакет жіберушінің (клиенттің) MAC мекенжайы

31
Клиенттік жабдықтың мекенжайын толтыру
 
Hex
10
Резервтелген орын. Әдетте нөлдермен толтырылады

41
Сервер хост атауы
 
Жол
64
DHCP сервер атауы. Әдетте берілмейді

105
Жүктеу файлының аты
 
Жол
128
Жүктеу кезінде дискісіз станциялар пайдаланатын сервердегі файл атауы

235
Сиқырлы печенье
63: 82: 53: 63
Hex
4
«Сиқырлы» нөмір, оған сәйкес, соның ішінде. бұл пакеттің DHCP протоколына жататынын анықтауға болады

DHCP опциялары. Кез келген ретпен жүруге болады

236
Опция нөмірі
53
Dec
3
DHCP пакетінің 53 түрін анықтайтын 3 опция - DHCPREQUEST

 
Опция ұзындығы
1
Dec
1

 
Опция мәні
3
Dec
1

 
Опция нөмірі
61
Dec
1
Клиент идентификаторы: 01 (Ehernet үшін) + клиенттің MAC мекенжайы

 
Опция ұзындығы
7
Dec
1

 
Опция мәні
01:2c:ab:25:ff:72:a6
Hex
7

 
Опция нөмірі
60
Dec
 
«Жеткізуші класс идентификаторы». Менің жағдайда ол DHCP клиентінің нұсқасын хабарлайды. Мүмкін, басқа құрылғылар басқа нәрсені қайтарады. Windows, мысалы, MSFT 5.0 есептері

 
Опция ұзындығы
11
Dec
 

 
Опция мәні
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
Dec
1
82 опция, DHCPDISCOVER ішінде келгенді қайталайды

 
Опция ұзындығы
18
Dec
1

 
Опция мәні
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:c
Dec
18

 
Пакеттің соңы
255
Dec
1
255 пакеттің соңын білдіреді

DHCPACK

DHCP серверінен «иә, дұрыс, бұл сіздің IP мекенжайыңыз және оны ешкімге бермеймін» деген растау ретінде серверден клиентке DHCPACK пішіміндегі пакет қызмет етеді. Ол басқа пакеттер сияқты таратылады. Төмендегі кодта Python-да енгізілген DHCP серверіне арналған кодта, егер ол әлдеқашан белгілі болса, белгілі бір клиенттің IP мекенжайына пакет жіберу арқылы кез келген тарату сұрауын қайталаймын. Сонымен қатар, DHCP сервері DHCPACK пакетінің клиентке жеткен-жетпегеніне мүлдем мән бермейді. Егер клиент DHCPACK қабылдамаса, біраз уақыттан кейін ол жай ғана DHCPREQUEST қайталайды

DHCPACK Пакет құрылымының кестесі

Пакеттегі орын
Құн атауы (ортақ)
Мысал:
Кіріспе
Байт
Түсіндіру

1
Жүктеу сұрауы
2
Hex
1
Хабар түрі. 1 – клиенттен серверге сұраныс, 2 – серверден клиентке жауап

2
Аппараттық құрал түрі
1
Hex
1
Аппараттық адрестің түрі, осы хаттамада 1 - MAC

3
Аппараттық құрал ұзындығын анықтайды
6
Hex
1
Құрылғының MAC мекенжайының ұзындығы

4
Хопс
1
Hex
1
Аралық бағыттар саны

5
Мәміле идентификаторы
23:cf:de:1d
Hex
4
Бірегей транзакция идентификаторы. Сұрау операциясының басында клиент жасаған

7
Екінші өтті
0
Hex
4
Мекенжайды алу процесінің басынан секундпен есептелген уақыт

9
Жүктеу жалаушалары
8000
Hex
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
Hex
6
Пакет жіберушінің (клиенттің) MAC мекенжайы

31
Клиенттік жабдықтың мекенжайын толтыру
 
Hex
10
Резервтелген орын. Әдетте нөлдермен толтырылады

41
Сервер хост атауы
 
Жол
64
DHCP сервер атауы. Әдетте берілмейді

105
Жүктеу файлының аты
 
Жол
128
Жүктеу кезінде дискісіз станциялар пайдаланатын сервердегі файл атауы

235
Сиқырлы печенье
63: 82: 53: 63
Hex
4
«Сиқырлы» нөмір, оған сәйкес, соның ішінде. бұл пакеттің DHCP протоколына жататынын анықтауға болады

DHCP опциялары. Кез келген ретпен жүруге болады

236
Опция нөмірі
53
Dec
3
DHCP пакетінің 53 түрін анықтайтын 5 опция - DHCPACK

 
Опция ұзындығы
1
Dec
1

 
Опция мәні
5
Dec
1

 
Опция нөмірі
1
Dec
1
DHCP клиентіне желі маскасын ұсыну опциясы

 
Опция ұзындығы
4
Dec
1

 
Опция мәні
255.255.224.0
Жол
4

 
Опция нөмірі
3
Dec
1
DHCP клиентіне әдепкі шлюзді ұсыну опциясы

 
Опция ұзындығы
4
Dec
1

 
Опция мәні
172.16.12.1
Жол
4

 
Опция нөмірі
6
Dec
1
DNS клиентіне DHCP ұсыну опциясы

 
Опция ұзындығы
4
Dec
1

 
Опция мәні
8.8.8.8
Жол
4

 
Опция нөмірі
51
Dec
1
Берілген желі параметрлерінің қызмет ету мерзімі секундтарда, содан кейін DHCP клиенті оларды қайтадан сұрауы керек

 
Опция ұзындығы
4
Dec
1

 
Опция мәні
86400
Dec
4

 
Опция нөмірі
82
Dec
1
82 опция, DHCPDISCOVER ішінде келгенді қайталайды

 
Опция ұзындығы
18
Dec
1

 
Опция мәні
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:c
Dec
18

 
Пакеттің соңы
255
Dec
1
255 пакеттің соңын білдіреді

параметр

Орнату шын мәнінде жұмысқа қажетті python модульдерін орнатудан тұрады. MySQL әлдеқашан орнатылған және конфигурацияланған деп болжанады.

FreeBSD

pkg орнату python3 python3 -m providepip pip3 орнату mysql-коннектор

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 upper(mac)=upper('{option_3_AgentRemoteId_hex}') және upper(port)=upper('{option_1_AgentCircuitId_port_hex}') пайдаланушылардан ip,mask,router,dns таңдаңыз. upper(mac)=upper('{sw_mac}') және upper(port)=upper('{sw_port82}') пайдаланушылардан ip,mask,router,dns таңдаңыз. upper(mac)=upper('{ClientMacAddress}') болатын пайдаланушылардан ip,mask,router,dns таңдаңыз. тарихқа енгізу (id,dt,mac,ip,comment) мәндері (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Енді тегтер туралы толығырақ:

Dhcpserver бөлімі серверді іске қосудың негізгі параметрлерін сипаттайды, атап айтқанда:

  • хост – сервер 67 портта қандай IP мекенжайын тыңдайды
  • broadcast - DHCPOFFER және DHCPACK үшін қандай ip таратылады
  • DHCPServer - DHCP серверінің IP-і қандай
  • Берілген IP мекенжайының LeaseTime жалдау уақыты
  • ThreadLimit - 67 портта кіріс UDP пакеттерін өңдеу үшін бір уақытта қанша ағын жұмыс істейді. Ол жоғары жүктемелі жобаларға көмектесуі керек 😉
  • defaultMask,defaultRouter,defaultDNS - егер дерекқорда IP табылса, бірақ ол үшін қосымша параметрлер көрсетілмесе, абонентке әдепкі бойынша не ұсынылады

mysql бөлімі:

хост, пайдаланушы аты, құпия сөз, негізгі атау - бәрі өзі үшін сөйлейді. Дерекқордың шамамен құрылымы орналастырылған GitHub

Сұрау бөлімі: OFFER/ACK алуға сұраулар мына жерде сипатталған:

  • ұсыныс_саны — IP, маска, маршрутизатор, 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

, 26:40 ауқымынан он алтылық алып, sw_mac айнымалысын анықтаңыз

Серверді -d қосқышымен іске қосу арқылы сұрауларда пайдалануға болатын барлық мүмкін опцияларды көруге болады. Біз мына журналға ұқсас нәрсені көреміз:

--67 портқа DHCPINFORM пакеті келді, 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress': '0025224''ClientMacAddress': '764'Caaddress', '00'7Cyaddress : b'x91 5%"Jxd0d' , ' HType': 'Ethernet', 'HostName': b'x3xa5xe9xa8xa8xa43-x0.0.0.0fx5.0a', 'ReqListDNS': True, 'ReqListDomainName': True, 'ReqListPerfowmRouterDiscover,'RouterDiscover,'Req':'Req'List Маршрут': Рас, 'ReqListSubnetM сұрайды ': True, 'ReqListVendorSpecInfo': 0025224, 'RequestedIpAddress': '764', 'Vendor': b'MSFT 172.30.128.13', 'chaddr': '00ad00.', '172.30.114.25ad308.' ' , 'flags': 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'x04x00x01x00x06x02x08x00x06x00x1x9x2' b'x82x12010600040001000602080006001x589xx2x.kz.82E18EB82AD ',' Option_12_len ': 01 06,' опция_00_str ' : «B'x04x00x01x00x06x02x08x00x06x00x1x9x2x768x0.0.0.0x001x589x2x1x06x89exx8xb3xad» », -« Нәтиже »: Жалған, 'SEC': 897, 'siaddr': '8', 'sw_mac': '0.0.0.0eXNUMXebXNUMXad', 'sw_portXNUMX': 'XNUMX', 'xidbyte': b'

Сәйкесінше, біз кез келген айнымалы мәнді {} ішіне орап аламыз және ол SQL сұрауында пайдаланылады.

Клиенттің IP мекенжайын алғанын тарихқа жазып алайық:

Python тіліндегі DHCP+Mysql сервері

Python тіліндегі DHCP+Mysql сервері

Серверді іске қосу

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

— d консольдық шығыс режимі DEBUG
- c <файл аты> конфигурация файлы

Debriefing

Енді Python-да серверді енгізу туралы толығырақ. Бұл ауырсыну. Python жылдам үйренді. Көптеген сәттер «уау, мен оны қалай жасадым» стилінде жасалады. Мүлде оңтайландырылмаған және бұл пішінде негізінен Python әзірлеудегі тәжірибесі аз болғандықтан қалды. Мен «кодта» серверді енгізудің ең қызықты аспектілеріне тоқталатын боламын.

XML конфигурация файлының талдаушысы

Стандартты Python модулі xml.dom пайдаланылады. Бұл қарапайым болып көрінеді, бірақ іске асыру кезінде осы модульді пайдаланатын желіде нақты құжаттама мен мысалдардың жетіспеушілігі байқалды.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") mconfig ішіндегі elem үшін: gconfig["mysql_host"]=elem.getElementsByTagName("хост")[0]. gconfig["mysql_username"]=elem.getElementsByTagName("username")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("password")[0].firstChild_gsgss["tagname." =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") dconfig ішіндегі elem үшін: gconfig["broadcast"]=elem.getElementsByTagName("0."ad." firstChild.data gconfig["dhcp_host"]=elem.getElementsByTagName("хост")[0].firstChild.data gconfig["dhcp_LeaseTime"]=elem.getElementsByTagName("LeaseTime") gconfig[0]. DHCP_THEARDLIMIT «] = int (« getlimit ») [elem.gullimit ') [0] .firstchild.data) [0]. = elem. stelem.betelementsBamName («DefaultMask») [0] .FirstChild.data gconfig [dhcp_defaultrouter («DefaLtrtrutter») [0] .FirstChild.data gconfig [0] .FirstChild.data gconfig] = elem. stelem.TelementsByTagName (« defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("сұрау") qconfig ішіндегі elem: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[1].firstChild inta. диапазон(int(gconfig["offer_count"])): gconfig["offer_"+str(num+1)]=elem.getElementsByTagName("offer_"+str(num+0))[0].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[XNUMX].firstChild.data options=tree.getElementsByTagName("options") опциялардағы элемент үшін: node ішіндегі опциялар үшін node=elem.getElementsByTagName("option") : optionsMod.append(options.firstChild.data)

Көп ағынды

Бір қызығы, Python-да көп ағынды жұмыс өте анық және қарапайым жүзеге асырылады.

def PacketWork(data,addr): ... # кіріс пакетті талдауды және оған жауап беруді жүзеге асыру ... кезінде True: деректер, addr = udp_socket.recvfrom(1024) # UDP пакетінің ағынын күту = threading.Thread( target=PacketWork , args=(data,addr,)).start() # келді - біз threading.active_count() >gconfig["dhcp_ThreadLimit"] кезінде параметрлері бар фондық режимде бұрын анықталған PacketWork функциясын іске қосамыз: уақыт. ұйқы(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(packettack, (gconfig["хабар тарату"],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"]=data[4:8].hex() res["xidbyte"]=data[4:8]

, байттарды құрылымға жинаңыз:

res["жалаушалар"]=бума('BB',деректер[10],деректер[11])

Құрылымнан IP алыңыз:

res["ciaddr"]=socket.inet_ntoa(пакет('BBBB',деректер[12],деректер[13],деректер[14],деректер[15]));

Және керісінше:

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

Әзірше осымен 😉

Ақпарат көзі: www.habr.com

пікір қалдыру