DHCP + Mysql server ile Python

DHCP + Mysql server ile Python

O le fa'amoemoega o lenei poloketi:

  • Aoao e uiga ile DHCP ile IPv4 network
  • A'oa'oina le Python (sili atu teisi nai lo le sasa 😉)
  • suitulaga server DB2DHCP (мой форк), оригинал iinei, lea ua atili ai ona faigata ona faʻapipiʻi mo le OS fou. Ma ou te le fiafia i lena mea o se binary e leai se auala e "suia ai nei"
  • mauaina o se server DHCP galue ma le tomai e filifili ai le tuatusi IP a le tagata fai saofaga e faʻaaoga ai le mac a le tagata fai saofaga poʻo le sui mac + port tuʻufaʻatasia (Filifiliga 82)
  • tusi se isi uila (Oi! o le mea lea e sili ona ou fiafia i ai)
  • mauaina o faʻamatalaga e uiga i lau kalapu-lima i luga o Habrahabr (pe sili atu, o se valaaulia) 😉

I'uga: e aoga 😉 Fa'ata'ita'i ile FreeBSD ma le Ubuntu OS. I le talitonuga, e mafai ona talosagaina le code e galue i lalo o soʻo se OS, aua E foliga mai e leai ni faʻamaufaʻailoga faʻapitoa i le code.
Fa'aeteete! E tele isi mea o le a o'o mai.

So'oga ile fale teu oloa mo amateurs "pa'i ola".

O le faagasologa o le faʻapipiʻiina, faʻatulagaina ma le faʻaaogaina o le taunuuga o le "suʻesuʻeina o meafaigaluega" e sili atu ona maualalo, ona fai ai lea o sina manatu itiiti e uiga i le DHCP protocol. Mo a'u lava. Ma mo talafaasolopito 😉

O sina manatu itiiti

Что такое DHCP

Ole fesoʻotaʻiga fesoʻotaʻiga lea e mafai ai e se masini ona suʻe lona tuatusi IP (ma isi faʻamaufaʻailoga e pei ole faitotoa, DNS, ma isi) mai le DHCP server. E fa'afesuia'i afifi e fa'aaoga ai le UDP protocol. O le taʻiala lautele o le faʻaogaina o le masini pe a talosagaina faʻasologa o fesoʻotaʻiga e faʻapea:

  1. O le masini (client) e tuʻuina atu se talosaga faʻasalalauga UDP (DHCPDISCOVER) i luga o le fesoʻotaʻiga ma le talosaga "lelei, sei tuʻuina mai ia te aʻu se tuatusi IP." E le gata i lea, e masani lava (ae le o taimi uma) o le talosaga e tupu mai le taulaga 68 (punaoa), ma o le taunuuga o le taulaga 67 (taulaga). O nisi masini e auina atu foi afifi mai le taulaga 67. O le tuatusi MAC o le masini kalani o loʻo aofia i totonu o le DHCPDISCOVER package.
  2. Все сервера DHCP, находящиеся в сети (а их может быть несколько), формируют для устройства отправившего DHCPDISCOVER, предложение DHCPOFFER с сетевыми настройками, и так-же широковещательно его отсылает его по сети. Идентификация кому предназначен этот пакет идет по MAC адресу клиента, предоставленного ранее в запросе DHCPDISCOVER.
  3. E talia e le kalani ia pepa o loʻo i ai talosaga mo fesoʻotaʻiga fesoʻotaʻiga, filifili le mea e sili ona manaia (atonu e ese le taʻiala, mo se faʻataʻitaʻiga, le taimi o le tuʻuina atu o pepa, le numera o auala vavalalata), ma faia se "talosaga aloaʻia" DHCPREQUEST faʻatasi ai ma tulaga fesoʻotaʻiga. mai le DHCP server e fiafia i ai. I lenei tulaga, o le afifi e alu i se DHCP server patino.
  4. O le 'au'aunaga na mauaina le DHCPREQUEST na te lafoina se pepa fa'atulagaina o le DHCPACK, lea e toe lisi ai le feso'ota'iga fa'atatau mo lenei tagata fa'atau.

DHCP + Mysql server ile Python

Кроме того, есть пакеты DHCPINFORM, которые ходят от клиента, и цель которых проинформировать DHCP сервер о том, что «клиент жив» и пользуется выданными сетевыми настройками. В реализации данного сервера эти пакеты игнорируются.

Fa'asologa o afifi

В целом фрейм пакета Ethernet выглядит примерно так:

DHCP + Mysql server ile Python

I la matou tulaga, o le a matou iloiloina naʻo faʻamatalaga saʻo mai mea o loʻo i totonu o le UDP packet, e aunoa ma le OSI layer protocol headers, e taʻua o le DHCP structure:

DHCPDISCOVER

O lea la, o le faagasologa o le mauaina o se tuatusi IP mo se masini e amata i le DHCP client e auina atu se talosaga faasalalau mai le taulaga 68 i le 255.255.255.255:67. I totonu o lenei afifi, o le kalani e aofia ai lona tuatusi MAC, faʻapea foʻi ma le mea tonu e manaʻo e maua mai le DHCP server. O lo'o fa'amatalaina le fa'atulagaga o afifi i le laulau o lo'o i lalo.

DHCPDISCOVER Peke Fa'atulagaina Laulau

Tulaga i totonu o le afifi
igoa taua
Faataitaiga:
Faatomuaga
Fa-byte
Faamalamalamaga

1
Talosaga Fa'avae
1
Hex
1
Тип сообщения. 1 — запрос от клиента к серверу, 2 — ответ от сервера клиенту

2
Hardware type
1
Hex
1
Тип аппаратного адреса, в данном протоколе 1 — MAC

3
Hardware adrees length
6
Hex
1
Ole umi ole tuatusi MAC ole masini

4
Hops
1
Hex
1
Numera o auala feololo

5
Faʻamatalaga ID
23:cf:de:1d
Hex
4
Fa'ailoga tau fefa'ataua'iga tulaga ese. Fausia e le kalani ile amataga ole fa'agaioiga ole talosaga

7
Ua mavae lona lua
0
Hex
4
Taimi i sekone mai le amataga o le faagasologa o le mauaina o se tuatusi

9
Fu'a seevae
0
Hex
2
Некие флаги, которые могут устанавливаться, в качестве указания параметров протокола

11
Client IP address
0.0.0.0
Laina
4
IP адрес клиента (если есть)

15
Lau tuatusi IP tagata fa'atau
0.0.0.0
Laina
4
tuatusi IP na ofoina mai e le server (pe a maua)

19
Le isi tuatusi IP server
0.0.0.0
Laina
4
tuatusi IP server (pe a iloa)

23
tuatusi IP sui sooupu
172.16.114.41
Laina
4
IP адрес агента ретрансляции (например свича)

27
tuatusi MAC tagata fa'atau
14:d6:4d:a7:c9:55
Hex
6
tuatusi MAC ole tagata e auina atu pepa (tagata fa'atau)

31
Fa'alava ole tuatusi o mea faigaluega
 
Hex
10
Nofo fa'apolopolo. E masani ona fa'atumu i zeros

41
Server host name
 
Laina
64
Имя сервера DHCP. Обычно не передается

105
Igoa faila faila
 
Laina
128
Igoa faila i luga o le server o loʻo faʻaogaina e nofoaga e leai ni disk pe a faʻapipiʻi

235
Magic cookie
63: 82: 53: 63
Hex
4
«Магическое» число, по которому в т.ч. можно определить, что этот пакет — принадлежит протоколу DHCP

DHCP filifiliga. E mafai ona alu i soo se faasologa

236
Numera filifiliga
53
Tesema
1
Filifiliga 53, o loʻo faʻamaonia ai le ituaiga o pusa DHCP

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

 
Filifiliga umi
1
Tesema
1

 
Значение опции
1
Tesema
1

 
Numera filifiliga
50
Tesema
1
O le a le tuatusi IP e mana'o le kalani e maua?

 
Filifiliga umi
4
Tesema
1

 
Значение опции
172.16.134.61
Laina
4

 
Numera filifiliga
55
 
1
Fa'asologa o feso'otaiga e mana'omia e le kalani. E mafai ona eseese le tuufaatasiga

01 — Маска сети
03 - Faitotoa
06 — DNS
oc — Hostname
0f — имя домена сети
1c - tuatusi o fa'asalalauga talosaga (fa'asalalauga)
42 - TFTP igoa server
79 - Auala Tuto'atasi leai se Vasega

 
Filifiliga umi
8
 
1

 
Значение опции
01:03:06:0c:0f:1c:42:79
 
8

 
Numera filifiliga
82
Tesema
 
Filifiliga 82, lea e tuʻuina atu le tuatusi MAC o le masini toe fai ma nisi faʻaopoopoga o mea taua.

O le tele o taimi, o le taulaga lea o le ki lea e fa'asolo ai le fa'ai'uga o le DHCP client. O lenei filifiliga o lo'o i ai fa'aopoopoga fa'aopoopo, O le byte muamua o le numera o le "suboption", o le lona lua o lona umi, ona taua lea.

I lenei tulaga, i le filifiliga 82, o vaega laiti o loʻo faʻapipiʻiina:
Agent Circuit ID = 00:04:00:01:00:04, lea o le lua bytes mulimuli o le DHCP client port na sau ai le talosaga.

Agent Remote ID = 00:06:c8:be:19:93:11:48 — MAC адрес устройства ретранслятора DHCP

 
Filifiliga umi
18
Tesema
 

 
Значение опции
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Окончание пакета
255
Tesema
1
255 o loʻo faʻatusalia le pito o le afifi

DHCPOFFER

O le taimi lava e maua ai e le 'auʻaunaga le DHCPDISCOVER packet ma afai e vaʻaia e mafai ona ofoina atu i le kalani se mea mai le mea na talosagaina, ona faʻatupuina lea o se tali mo ia - DHCPDISCOVER. O le tali e auina atu i le taulaga "mai le mea na sau ai", e ala i faasalalauga, aua i le taimi nei, e leʻi maua e le kalani se tuatusi IP, o le mea lea e naʻo le taliaina o le pepa pe a lafoina e ala i faʻasalalauga. E iloa e le tagata o tausia o se afifi lea mo ia e ala i lona tuatusi MAC i totonu o le afifi, faʻapea foʻi ma le numera o fefaʻatauaiga na te faia i le taimi na faia ai le afifi muamua.

Таблица структуры пакета DHCPOFFER

Tulaga i totonu o le afifi
Igoa o le tau (masani)
Faataitaiga:
Faatomuaga
Fa-byte
Faamalamalamaga

1
Talosaga Fa'avae
1
Hex
1
Тип сообщения. 1 — запрос от клиента к серверу, 2 — ответ от сервера клиенту

2
Hardware type
1
Hex
1
Тип аппаратного адреса, в данном протоколе 1 — MAC

3
Hardware adrees length
6
Hex
1
Ole umi ole tuatusi MAC ole masini

4
Hops
1
Hex
1
Numera o auala feololo

5
Faʻamatalaga ID
23:cf:de:1d
Hex
4
Fa'ailoga tau fefa'ataua'iga tulaga ese. Fausia e le kalani ile amataga ole fa'agaioiga ole talosaga

7
Ua mavae lona lua
0
Hex
4
Taimi i sekone mai le amataga o le faagasologa o le mauaina o se tuatusi

9
Fu'a seevae
0
Hex
2
O nisi fu'a e mafai ona fa'atulaga e fa'ailoa ai fa'amaufa'ailoga. I lenei tulaga, 0 o lona uiga o le ituaiga talosaga Unicast

11
Client IP address
0.0.0.0
Laina
4
IP адрес клиента (если есть)

15
Lau tuatusi IP tagata fa'atau
172.16.134.61
Laina
4
tuatusi IP na ofoina mai e le server (pe a maua)

19
Le isi tuatusi IP server
0.0.0.0
Laina
4
tuatusi IP server (pe a iloa)

23
tuatusi IP sui sooupu
172.16.114.41
Laina
4
IP адрес агента ретрансляции (например свича)

27
tuatusi MAC tagata fa'atau
14:d6:4d:a7:c9:55
Hex
6
tuatusi MAC ole tagata e auina atu pepa (tagata fa'atau)

31
Fa'alava ole tuatusi o mea faigaluega
 
Hex
10
Nofo fa'apolopolo. E masani ona fa'atumu i zeros

41
Server host name
 
Laina
64
Имя сервера DHCP. Обычно не передается

105
Igoa faila faila
 
Laina
128
Igoa faila i luga o le server o loʻo faʻaogaina e nofoaga e leai ni disk pe a faʻapipiʻi

235
Magic cookie
63: 82: 53: 63
Hex
4
«Магическое» число, по которому в т.ч. можно определить, что этот пакет — принадлежит протоколу DHCP

DHCP filifiliga. E mafai ona alu i soo se faasologa

236
Numera filifiliga
53
Tesema
1
Filifiliga 53, o loʻo faʻamatalaina le ituaiga DHCP 2 packet - DHCPOFFER

 
Filifiliga umi
1
Tesema
1

 
Значение опции
2
Tesema
1

 
Numera filifiliga
1
Tesema
1
Filifiliga e ofo atu i le tagata o tausia le DHCP se masini fesoʻotaʻiga

 
Filifiliga umi
4
Tesema
1

 
Значение опции
255.255.224.0
Laina
4

 
Numera filifiliga
3
Tesema
1
Filifiliga e ofo atu i le kalani DHCP se faitotoa e le mafai

 
Filifiliga umi
4
Tesema
1

 
Значение опции
172.16.12.1
Laina
4

 
Numera filifiliga
6
Tesema
1
Filifiliga e ofo atu le DHCP ile DNS client

 
Filifiliga umi
4
Tesema
1

 
Значение опции
8.8.8.8
Laina
4

 
Numera filifiliga
51
Tesema
1
O le olaga atoa o laina fesoʻotaʻiga tuʻuina atu i sekone, a maeʻa e tatau ona toe talosagaina e le DHCP client

 
Filifiliga umi
4
Tesema
1

 
Значение опции
86400
Tesema
4

 
Numera filifiliga
82
Tesema
1
Опция 82, повторяет то что пришло в DHCPDISCOVER

 
Filifiliga umi
18
Tesema
1

 
Значение опции
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:e
Tesema
18

 
Окончание пакета
255
Tesema
1
255 o loʻo faʻatusalia le pito o le afifi

DHCPREQUEST

A mae'a ona maua e le kalani le DHCPOFFER, na te faia se pepa e talosagaina ai laina feso'otaiga e le o DHCP uma i luga o le upega tafailagi, ae na'o le tasi le mea patino, o lana DHCPOFFER ofo atu na te "fiafia i ai". Ole "pei" e mafai ona 'ese'ese ma fa'alagolago ile fa'atinoga ole DHCP ale kalani. O le tagata e mauaina le talosaga e faʻamaonia e faʻaaoga ai le tuatusi MAC o le DHCP server. E le gata i lea, o le DHCPREQUEST packet e mafai ona lafo e le kalani e aunoa ma le faia muamua o le DHCPDISCOVER, pe afai o le tuatusi IP a le server ua uma ona maua muamua.

DHCPREQUEST Peke Fa'atulagaina Laulau

Tulaga i totonu o le afifi
Igoa o le tau (masani)
Faataitaiga:
Faatomuaga
Fa-byte
Faamalamalamaga

1
Talosaga Fa'avae
1
Hex
1
Тип сообщения. 1 — запрос от клиента к серверу, 2 — ответ от сервера клиенту

2
Hardware type
1
Hex
1
Тип аппаратного адреса, в данном протоколе 1 — MAC

3
Hardware adrees length
6
Hex
1
Ole umi ole tuatusi MAC ole masini

4
Hops
1
Hex
1
Numera o auala feololo

5
Faʻamatalaga ID
23:cf:de:1d
Hex
4
Fa'ailoga tau fefa'ataua'iga tulaga ese. Fausia e le kalani ile amataga ole fa'agaioiga ole talosaga

7
Ua mavae lona lua
0
Hex
4
Taimi i sekone mai le amataga o le faagasologa o le mauaina o se tuatusi

9
Fu'a seevae
8000
Hex
2
Некие флаги, которые могут устанавливаться, в качестве указания параметров протокол. В данном случае выставлено «бродкаст»

11
Client IP address
0.0.0.0
Laina
4
IP адрес клиента (если есть)

15
Lau tuatusi IP tagata fa'atau
172.16.134.61
Laina
4
tuatusi IP na ofoina mai e le server (pe a maua)

19
Le isi tuatusi IP server
0.0.0.0
Laina
4
tuatusi IP server (pe a iloa)

23
tuatusi IP sui sooupu
172.16.114.41
Laina
4
IP адрес агента ретрансляции (например свича)

27
tuatusi MAC tagata fa'atau
14:d6:4d:a7:c9:55
Hex
6
tuatusi MAC ole tagata e auina atu pepa (tagata fa'atau)

31
Fa'alava ole tuatusi o mea faigaluega
 
Hex
10
Nofo fa'apolopolo. E masani ona fa'atumu i zeros

41
Server host name
 
Laina
64
Имя сервера DHCP. Обычно не передается

105
Igoa faila faila
 
Laina
128
Igoa faila i luga o le server o loʻo faʻaogaina e nofoaga e leai ni disk pe a faʻapipiʻi

235
Magic cookie
63: 82: 53: 63
Hex
4
«Магическое» число, по которому в т.ч. можно определить, что этот пакет — принадлежит протоколу DHCP

DHCP filifiliga. E mafai ona alu i soo se faasologa

236
Numera filifiliga
53
Tesema
3
Опция 53, определяющая тип пакета DHCP 3 — DHCPREQUEST

 
Filifiliga umi
1
Tesema
1

 
Значение опции
3
Tesema
1

 
Numera filifiliga
61
Tesema
1
Идентификатор клиента: 01 (для Ehernet) + MAC адрес клиента

 
Filifiliga umi
7
Tesema
1

 
Значение опции
01:2c:ab:25:ff:72:a6
Hex
7

 
Numera filifiliga
60
Tesema
 
"Fa'ailoa vasega fa'atau". I loʻu tulaga, e lipotia le DHCP client version. Masalo o isi masini e toe faafoi mai se mea ese. Windows mo se faʻataʻitaʻiga lipoti MSFT 5.0

 
Filifiliga umi
11
Tesema
 

 
Значение опции
udhcp 0.9.8
Laina
 

 
Numera filifiliga
55
 
1
Fa'asologa o feso'otaiga e mana'omia e le kalani. E mafai ona eseese le tuufaatasiga

01 — Маска сети
03 - Faitotoa
06 — DNS
oc — Hostname
0f — имя домена сети
1c - tuatusi o fa'asalalauga talosaga (fa'asalalauga)
42 - TFTP igoa server
79 - Auala Tuto'atasi leai se Vasega

 
Filifiliga umi
8
 
1

 
Значение опции
01:03:06:0c:0f:1c:42:79
 
8

 
Numera filifiliga
82
Tesema
1
Опция 82, повторяет то что пришло в DHCPDISCOVER

 
Filifiliga umi
18
Tesema
1

 
Значение опции
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:e
Tesema
18

 
Окончание пакета
255
Tesema
1
255 o loʻo faʻatusalia le pito o le afifi

DHCPACK

В качестве подтверждения того, что «да точно, это твой IP адрес, и больше я его никому не выдам» от DHCP сервера, служит пакет в формате DHCPACK от сервера клиенту. Он так-же как и остальные пакеты высылается широковещательно. Хотя, в ниже приведенном коде DHCP сервера реализованного на Python, я на всякий случай дублирую любой широковещательный запрос, отправкой пакета на конкретный IP клиента, если он уже известен. Причем DHCP сервер совершенно не волнует, дошел ли до клиента пакет DHCPACK. Если клиент не получает DHCPACK, то через некоторое время он просто повторяет DHCPREQUEST

Таблица структуры пакета DHCPACK

Tulaga i totonu o le afifi
Igoa o le tau (masani)
Faataitaiga:
Faatomuaga
Fa-byte
Faamalamalamaga

1
Talosaga Fa'avae
2
Hex
1
Тип сообщения. 1 — запрос от клиента к серверу, 2 — ответ от сервера клиенту

2
Hardware type
1
Hex
1
Тип аппаратного адреса, в данном протоколе 1 — MAC

3
Hardware adrees length
6
Hex
1
Ole umi ole tuatusi MAC ole masini

4
Hops
1
Hex
1
Numera o auala feololo

5
Faʻamatalaga ID
23:cf:de:1d
Hex
4
Fa'ailoga tau fefa'ataua'iga tulaga ese. Fausia e le kalani ile amataga ole fa'agaioiga ole talosaga

7
Ua mavae lona lua
0
Hex
4
Taimi i sekone mai le amataga o le faagasologa o le mauaina o se tuatusi

9
Fu'a seevae
8000
Hex
2
Некие флаги, которые могут устанавливаться, в качестве указания параметров протокол. В данном случае выставлено «бродкаст»

11
Client IP address
0.0.0.0
Laina
4
IP адрес клиента (если есть)

15
Lau tuatusi IP tagata fa'atau
172.16.134.61
Laina
4
tuatusi IP na ofoina mai e le server (pe a maua)

19
Le isi tuatusi IP server
0.0.0.0
Laina
4
tuatusi IP server (pe a iloa)

23
tuatusi IP sui sooupu
172.16.114.41
Laina
4
IP адрес агента ретрансляции (например свича)

27
tuatusi MAC tagata fa'atau
14:d6:4d:a7:c9:55
Hex
6
tuatusi MAC ole tagata e auina atu pepa (tagata fa'atau)

31
Fa'alava ole tuatusi o mea faigaluega
 
Hex
10
Nofo fa'apolopolo. E masani ona fa'atumu i zeros

41
Server host name
 
Laina
64
Имя сервера DHCP. Обычно не передается

105
Igoa faila faila
 
Laina
128
Igoa faila i luga o le server o loʻo faʻaogaina e nofoaga e leai ni disk pe a faʻapipiʻi

235
Magic cookie
63: 82: 53: 63
Hex
4
«Магическое» число, по которому в т.ч. можно определить, что этот пакет — принадлежит протоколу DHCP

DHCP filifiliga. E mafai ona alu i soo se faasologa

236
Numera filifiliga
53
Tesema
3
Filifiliga 53, o loʻo faʻamatalaina le ituaiga DHCP packet 5 - DHCPACK

 
Filifiliga umi
1
Tesema
1

 
Значение опции
5
Tesema
1

 
Numera filifiliga
1
Tesema
1
Filifiliga e ofo atu i le tagata o tausia le DHCP se masini fesoʻotaʻiga

 
Filifiliga umi
4
Tesema
1

 
Значение опции
255.255.224.0
Laina
4

 
Numera filifiliga
3
Tesema
1
Filifiliga e ofo atu i le kalani DHCP se faitotoa e le mafai

 
Filifiliga umi
4
Tesema
1

 
Значение опции
172.16.12.1
Laina
4

 
Numera filifiliga
6
Tesema
1
Filifiliga e ofo atu le DHCP ile DNS client

 
Filifiliga umi
4
Tesema
1

 
Значение опции
8.8.8.8
Laina
4

 
Numera filifiliga
51
Tesema
1
O le olaga atoa o laina fesoʻotaʻiga tuʻuina atu i sekone, a maeʻa e tatau ona toe talosagaina e le DHCP client

 
Filifiliga umi
4
Tesema
1

 
Значение опции
86400
Tesema
4

 
Numera filifiliga
82
Tesema
1
Опция 82, повторяет то что пришло в DHCPDISCOVER

 
Filifiliga umi
18
Tesema
1

 
Значение опции
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:e
Tesema
18

 
Окончание пакета
255
Tesema
1
255 o loʻo faʻatusalia le pito o le afifi

faatulagaga

O le faʻapipiʻi e aofia ai le faʻapipiʻiina o modules python e manaʻomia mo galuega. E manatu ua uma ona faʻapipiʻi ma faʻatulagaina MySQL.

FreeBSD

pkg faʻapipiʻi python3 python3 -m faʻamautinoapip pip3 faʻapipiʻi mysql-fesoʻotaʻi

Ubuntu

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

Matou te fatuina se database MySQL, faʻapipiʻi le pydhcp.sql tuʻuina i totonu, ma faʻapipiʻi le faila faila.

Fetuunaiga

O fa'atonuga uma o lo'o i totonu o se faila xml. Fa'asinoga faila:

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 suega suega 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 filifili ip, mask, router, dns mai tagata faʻaoga i luga (mac) = luga ('{option_3_AgentRemoteId_hex}') ma luga (taulaga) = luga ('{option_1_AgentCircuitId_port_hex}') filifili ip, mask, router, dns mai tagata faʻaoga i luga (mac) = luga ('{sw_mac}') ma luga (taulaga) = luga ('{sw_port82}') filifili ip, mask, router, dns mai tagata faʻaoga i luga (mac) = luga ('{ClientMacAddress}') fa'aofi i totonu o tala fa'asolopito (id,dt,mac,ip,comment) tau (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Ole taimi nei ile fa'amatalaga atili ile pine:

O le dhcpserver vaega o loʻo faʻamatalaina tulaga faʻavae mo le amataina o le server, e pei o:

  • talimalo - o le a le tuatusi IP e faʻalogo i ai le 'auʻaunaga ile taulaga 67
  • faʻasalalauga - lea ip o le faʻasalalauga mo DHCPOFFER ma DHCPACK
  • DHCPServer — какой ip у DHCP сервера
  • LeaseTime время аренды выданного ip адреса
  • ThreadLimit - e fia filo o loʻo taʻavale i le taimi e tasi e faʻatautaia ai pusa UDP o loʻo oʻo mai i luga o le taulaga 67. E tatau ona fesoasoani i luga o galuega tetele 😉
  • defaultMask,defaultRouter,defaultDNS - o le a le mea e ofoina atu i le tagata fai saofaga e ala i le faaletonu pe a maua se IP i totonu o faʻamaumauga, ae e le o faʻamaonia mai ni faʻaopoopoga faaopoopo mo ia.

Секция mysql:

host,username,password,basename  — всё говорит само за себя. Примерная структура базы данных выложена на GitHub

Секция query: здесь описываются запросы для получения OFFER/ACK:

  • ofo_count - o le numera o laina ma talosaga e toe faʻafoʻi mai ai se iʻuga e pei o le ip,mask,router,dns
  • ofo_n — manoa fesili. Afai e gaogao le toe faafoi, ona faatino lea ole talosaga ole ofo
  • history_sql - o se fesili e tusi, mo se faʻataʻitaʻiga, i le "faʻatagaina talafaasolopito" mo se tagata fai saofaga

В запросах могут участвовать любые переменные из секции options или опции из протокола DHCP.

Vaega o filifiliga. O le mea lea e sili atu ona manaia. O iinei e mafai ai ona tatou fatuina ni fesuiaiga e mafai ona tatou faʻaogaina mulimuli ane i le vaega o fesili.

Mo se faʻataʻitaʻiga:

option_82_hex:sw_port1:20:22

, эта строчка-команда взять всю строку пришедшую в DHCP запросе опции 82, в формате hex, в диапазоне с 20 по 22 байт фключительно и положить её в новую переменную sw_port1  (порт свича откуда пришел запрос)

option_82_hex:sw_mac:26:40

, опеределяем переменную sw_mac, взяв hex из диапазона 26:40

Увидеть все возможные опции которые можно использовать в запросах, можно при помощи запуска сервера с ключем -d. Увидим примерно такой лог:

--пришел пакет  DHCPINFORM  на 67 порт,от  0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68)
{'ClientMacAddress': '0025224ad764',
 'ClientMacAddressByte': b'x00%"Jxd7d',
 'HType': 'Ethernet',
 'HostName': b'x91xa5xe0xa3xa5xa9-x8fx8a',
 'ReqListDNS': True,
 'ReqListDomainName': True,
 'ReqListPerfowmRouterDiscover': True,
 'ReqListRouter': True,
 'ReqListStaticRoute': True,
 'ReqListSubnetMask': True,
 'ReqListVendorSpecInfo': 43,
 'RequestedIpAddress': '0.0.0.0',
 'Vendor': b'MSFT 5.0',
 'chaddr': '0025224ad764',
 'ciaddr': '172.30.128.13',
 'flags': b'x00x00',
 'giaddr': '172.30.114.25',
 'gpoz': 308,
 'hlen': 6,
 'hops': 1,
 'htype': 'MAC',
 'magic_cookie': b'cx82Sc',
 'op': 'DHCPINFORM',
 'option12': 12,
 'option53': 53,
 'option55': 55,
 'option60': 60,
 'option61': 61,
 'option82': 82,
 'option_82_byte': b'x12x01x06x00x04x00x01x00x06x02x08x00'
                   b'x06x00x1eXx9exb2xad',
 'option_82_hex': '12010600040001000602080006001e589eb2ad',
 'option_82_len': 18,
 'option_82_str': "b'x12x01x06x00x04x00x01x00x06x02x08x00x06x00x1eXx9exb2xad'",
 'result': False,
 'secs': 768,
 'siaddr': '0.0.0.0',
 'sw_mac': '001e589eb2ad',
 'sw_port1': '06',
 'xidbyte': b'<x89}x8c',
 'xidhex': '3c897d8c',
 'yiaddr': '0.0.0.0'}

Соответственно мы можем любую переменную обернуть в {} и она будет использована в SQL запросе.

Sei o tatou faamaumauina mo talafaasolopito na maua e le kalani le tuatusi IP:

DHCP + Mysql server ile Python

DHCP + Mysql server ile Python

Amataina le server

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

— d режим вывода в консоль DEBUG
— c <имя_файла> конфигурационный файл

Разбор полетов

Ma o lea ua sili atu faʻamatalaga i le faʻatinoina o le server i Python. O se tiga. Na a'oa'oina le Python i le lele. O le tele o taimi e faia i le sitaili o le "wow, i se auala na ou faia ai le aoga." E le'i fa'atumauina, ma tu'u i lenei fomu e mafua ona o le itiiti o le poto masani i le atina'eina o le Python. O le a ou nofo i luga o vaega sili ona manaia o le faʻatinoina o le server i le "code".

Парсер файла конфигурации XML

O le masani Python module xml.dom o loʻo faʻaaogaina. E foliga mai e faigofie, ae i le taimi o le faʻatinoga sa i ai le leai o ni faʻamatalaga manino ma faʻataʻitaʻiga i luga o le upega tafailagi e faʻaaoga ai lenei module.

    laau = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") mo elem i 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") mo elem i le 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["dhcp"_default =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDNS"]=elem.getNaElementsBy defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") mo elem i qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild.data mo num in laina(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("options") mo elem i filifiliga: node=elem.getElementsByTagName("filifiliga") mo filifiliga i le node : optionsMod.append(options.firstChild.data)

Multithreading

Как ни странно, многопоточность в Python реализована очень понятно и просто.

def PacketWork(fa'amatalaga, fa'aopoopo): ... # fa'atinoga o le fa'avasegaina o le pepa o lo'o sau ma tali atu i ai ... a'o Moni: fa'amaumauga, addr = udp_socket.recvfrom(1024) # fa'atali mo le UDP packet thread = threading.Thread( sini = PacketWork , args = (faʻamatalaga, addr,)). amata () # e pei ona oʻo mai - matou te faʻalauiloaina le galuega PacketWork na faʻamatalaina muamua i tua ma faʻamaufaʻailoga ao threading.active_count() >gconfig ["dhcp_ThreadLimit"]: taimi. moe(1) # pe afai o le numera E tele atu filo o loʻo taʻavale nai lo tulaga, matou te faʻatali seʻi itiiti ifo i latou.

Maua / lafo le DHCP pepa

Для того чтобы перехватить пакеты UDP идущие через сетевую карту, нужно «поднять» сокет:

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

, o iai fu'a:

  • AF_INET - o lona uiga o le faʻasologa o le tuatusi o le IP: port. Atonu e iai fo'i le AF_UNIX - lea e tu'u mai ai le tuatusi ile igoa faila.
  • SOCK_DGRAM - o lona uiga tatou te le taliaina se "pa'u mata", ae o se tasi ua uma ona pasia i totonu o le pa puipui, ma faʻatasi ai ma se vaega faʻapipiʻiina. O na. matou te mauaina na o se pusa UDP e aunoa ma le vaega "faaletino" o le afifi UDP afifi. Afai e te faʻaogaina le fuʻa SOCK_RAW, e manaʻomia foʻi ona e faʻapipiʻi lenei "afifi".

Отправка пакета может быть как бродкастом:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #switch the socket to broadcast mode rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

, ma le tuatusi "o fea na sau ai le afifi":

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # переключаем сокет в режим "много слушаетелей"
                        rz=udp_socket.sendto(packetack, addr)

, где SOL_SOCKET означает «уровень протокола» для выставления опций,

, SO_BROADCAST filifiliga o le afifi pulou e "faasalalau"

  , SO_REUSEADDR filifiliga sui le socket i le "tele faalogologo" mode. I le teori, e le manaʻomia i lenei tulaga, ae i luga o se tasi o le FreeBSD servers lea na ou faʻataʻitaʻia ai, e leʻi galue le code e aunoa ma lenei filifiliga.

Fa'asalalau se pepa DHCP

Вот тут мне действительно понравился Python. Оказывается из «коробки» он позволяет довольно вольно обходится с байт-кодом. Позволяя его очень просто переводить в десятичные значения, строки и hex — т.е. то что нам собственно и нужно, чтобы понять структуру пакета. Так например можно получить диапазон байт в HEX и просто байтах:

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

, fa'apipi'i bytes i se fausaga:

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

Maua le IP mai le fausaga:

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

Ma le isi itu:

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

Ona pau lea mo le taimi nei 😉

puna: www.habr.com

Faaopoopo i ai se faamatalaga