DHCP + Mysql sèvè nan Python

DHCP + Mysql sèvè nan Python

Objektif pwojè sa a se te:

  • Aprann sou DHCP sou yon rezo IPv4
  • Aprann Python (yon ti kras plis pase nan grafouyen 😉)
  • ranplasman sèvè DB2DHCP (fouchèt mwen an), orijinal isit la, ki ap vin pi plis ak pi difisil pou rasanble pou nouvo eksplwatasyon an. Apre sa, mwen pa renmen ke li se yon binè ke pa gen okenn fason yo "chanje kounye a"
  • jwenn yon sèvè DHCP k ap travay ak kapasite pou chwazi adrès IP yon abònen lè l sèvi avèk mac abònen an oswa switch mac + pò konbinezon (Opsyon 82)
  • ekri yon lòt bisiklèt (Oh! sa a se aktivite mwen pi renmen)
  • k ap resevwa kòmantè sou klib ou sou Habrahabr (oswa pi byen toujou, yon envite) 😉

Rezilta: li travay 😉 Teste sou FreeBSD ak Ubuntu OS. Teyorikman, kòd la ka mande pou travay anba nenpòt OS, paske Sanble pa gen okenn koneksyon espesifik nan kòd la.
Ak anpil atansyon! Gen anpil plis k ap vini.

Link nan depo pou amatè "manyen vivan".

Pwosesis la nan enstale, konfigirasyon ak itilize rezilta a nan "etidye pyès ki nan konpitè" se pi ba anpil, ak Lè sa a, yon ti kras teyori sou pwotokòl la DHCP. Pou tèt mwen. E pou listwa 😉

Yon ti teori

ki sa ki DHCP?

Sa a se yon pwotokòl rezo ki pèmèt yon aparèy jwenn adrès IP li (ak lòt paramèt tankou pòtay, DNS, elatriye) nan yon sèvè DHCP. Pake yo echanje lè l sèvi avèk pwotokòl la UDP. Prensip jeneral operasyon aparèy la lè w mande paramèt rezo a se jan sa a:

  1. Aparèy la (kliyan) voye yon demann emisyon UDP (DHCPDISCOVER) nan tout rezo a ak demann lan "byen, yon moun ban mwen yon adrès IP." Anplis, anjeneral (men se pa toujou) demann lan fèt soti nan pò 68 (sous), ak destinasyon an se pò 67 (destinasyon). Gen kèk aparèy tou ki voye pake soti nan pò 67. Adrès MAC aparèy kliyan an enkli andedan pake DHCPDISCOVER la.
  2. Tout sèvè DHCP ki sitiye sou rezo a (e ka gen plizyè nan yo) fòme yon òf DHCPOFFER ak paramèt rezo pou aparèy ki voye DHCPDISCOVER a, epi tou li difize sou rezo a. Idantifikasyon pou ki moun pake sa a fèt baze sou adrès MAC kliyan an te bay pi bonè nan demann DHCPDISCOVER la.
  3. Kliyan an aksepte pake ki gen pwopozisyon pou anviwònman rezo a, chwazi youn ki pi atiran (kritè yo ka diferan, pou egzanp, lè livrezon pake a, kantite wout entèmedyè), epi li fè yon "demann ofisyèl" DHCPREQUEST ak paramèt rezo a. soti nan sèvè DHCP li renmen. Nan ka sa a, pake a ale nan yon sèvè DHCP espesifik.
  4. Sèvè a ki te resevwa DHCPREQUEST voye yon pake fòma DHCPACK, kote li yon lòt fwa ankò bay lis paramèt rezo ki fèt pou kliyan sa a.

DHCP + Mysql sèvè nan Python

Anplis de sa, gen pake DHCPINFORM ki soti nan kliyan an, ak objektif sa a se enfòme sèvè a DHCP ke "kliyan an vivan" epi li ap itilize paramèt rezo yo bay yo. Nan aplikasyon sèvè sa a, pake sa yo inyore.

Fòma pake

An jeneral, yon ankadreman pake Ethernet sanble yon bagay tankou sa a:

DHCP + Mysql sèvè nan Python

Nan ka nou an, nou pral konsidere sèlman done ki soti dirèkteman nan sa ki nan pake UDP a, san yo pa Tèt pwotokòl kouch OSI, sètadi estrikti DHCP:

DHCPDISCOVER

Se konsa, pwosesis pou jwenn yon adrès IP pou yon aparèy kòmanse ak kliyan DHCP voye yon demann emisyon soti nan pò 68 a 255.255.255.255:67. Nan pake sa a, kliyan an gen ladan adrès MAC li yo, osi byen ke sa egzakteman li vle resevwa nan men sèvè DHCP la. Estrikti pake a dekri nan tablo ki anba a.

DHCPDISCOVER Tablo Estrikti Pake

Pozisyon nan pake a
Valè non
Egzanp
Entwodiksyon
Byte
Eksplikasyon

1
Demann bòt
1
Egzagòn
1
Kalite mesaj. 1 - demann soti nan kliyan an sèvè, 2 - repons soti nan sèvè a kliyan

2
Kalite pyès ki nan konpitè
1
Egzagòn
1
Kalite adrès pyès ki nan konpitè, nan pwotokòl sa a 1 - MAC

3
Materyèl adrese longè
6
Egzagòn
1
Longè adrès MAC aparèy

4
Oublions
1
Egzagòn
1
Kantite wout entèmedyè

5
ID tranzaksyon
23:cf:de:1d
Egzagòn
4
Idantifyan tranzaksyon inik. Jenere pa kliyan an nan kòmansman an nan yon operasyon demann

7
Dezyèm pase
0
Egzagòn
4
Tan an segonn depi nan konmansman an nan pwosesis pou jwenn yon adrès

9
Drapo bòt
0
Egzagòn
2
Sèten drapo ki ka mete pou endike paramèt pwotokòl

11
Adrès IP kliyan an
0.0.0.0
Fisèl
4
Adrès IP kliyan (si genyen)

15
Adrès IP kliyan ou a
0.0.0.0
Fisèl
4
Adrès IP sèvè a ofri (si disponib)

19
Pwochen adrès IP sèvè
0.0.0.0
Fisèl
4
Adrès IP sèvè (si li konnen)

23
Rele ajan adrès IP
172.16.114.41
Fisèl
4
Adrès IP ajan relè a (pa egzanp, yon switch)

27
Adrès MAC kliyan an
14:d6:4d:a7:c9:55
Egzagòn
6
adrès MAC moun k ap voye pake a (kliyan)

31
Kliyan pyès ki nan konpitè adrès padding
 
Egzagòn
10
Syèj rezève. Anjeneral plen ak zewo

41
Non lame sèvè a
 
Fisèl
64
Non sèvè DHCP. Anjeneral pa transmèt

105
Non dosye bòt
 
Fisèl
128
Non fichye sou sèvè a itilize pa estasyon disk lè demaraj

235
Bonbon majik
63: 82: 53: 63
Egzagòn
4
"Majik" nimewo, dapre ki, enkli. ou ka detèmine ke pake sa a fè pati pwotokòl DHCP la

Opsyon DHCP. Ka ale nan nenpòt lòd

236
Nimewo opsyon
53
Le
1
Opsyon 53, ki presize kalite pake DHCP

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

 
Longè opsyon
1
Le
1

 
Valè opsyon
1
Le
1

 
Nimewo opsyon
50
Le
1
Ki adrès IP kliyan an vle resevwa?

 
Longè opsyon
4
Le
1

 
Valè opsyon
172.16.134.61
Fisèl
4

 
Nimewo opsyon
55
 
1
Paramèt rezo kliyan an mande yo. Konpozisyon ka varye

01 — Mask rezo
03 - Gateway
06 - DNS
oc — Non animatè
0f - non domèn rezo
1c - adrès demann emisyon (emisyon)
42 - Non sèvè TFTP
79 - Wout estatik san klas

 
Longè opsyon
8
 
1

 
Valè opsyon
01:03:06:0c:0f:1c:42:79
 
8

 
Nimewo opsyon
82
Le
 
Opsyon 82, ki transmèt adrès MAC la nan aparèy la repete ak kèk valè adisyonèl.

Pi souvan, sa a se pò a nan switch la sou ki fen kliyan an DHCP kouri.Opsyon sa a gen paramèt adisyonèl.Premye byte a se nimewo a nan "subopsyon an", dezyèm lan se longè li yo, Lè sa a, valè li yo.

Nan ka sa a, nan opsyon 82, sub-opsyon yo enbrike:
Ajan Circuit ID = 00:04:00:01:00:04, kote de dènye bytes yo se pò kliyan DHCP kote demann lan soti.

Ajan Remote ID = 00:06:c8:be:19:93:11:48 - adrès MAC nan aparèy la repete DHCP

 
Longè opsyon
18
Le
 

 
Valè opsyon
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Egzagòn
 

 
Fen pake
255
Le
1
255 senbolize fen pake a

DHCPOFFRE

Le pli vit ke sèvè a resevwa pake a DHCPDISCOVER epi si li wè ke li ka ofri kliyan an yon bagay soti nan youn nan mande a, Lè sa a, li jenere yon repons pou li - DHCPDISCOVER. Se repons lan voye nan pò a "soti nan kote li soti", pa emisyon, paske nan moman sa a, kliyan an poko gen yon adrès IP, kidonk li ka aksepte pake a sèlman si li voye pa emisyon. Kliyan an rekonèt ke sa a se yon pake pou li pa adrès MAC li andedan pake a, osi byen ke nimewo tranzaksyon an ke li jenere nan moman an premye pake a se kreye.

Tablo Estrikti Pake DHCPOFFER

Pozisyon nan pake a
Non valè (komen)
Egzanp
Entwodiksyon
Byte
Eksplikasyon

1
Demann bòt
1
Egzagòn
1
Kalite mesaj. 1 - demann soti nan kliyan an sèvè, 2 - repons soti nan sèvè a kliyan

2
Kalite pyès ki nan konpitè
1
Egzagòn
1
Kalite adrès pyès ki nan konpitè, nan pwotokòl sa a 1 - MAC

3
Materyèl adrese longè
6
Egzagòn
1
Longè adrès MAC aparèy

4
Oublions
1
Egzagòn
1
Kantite wout entèmedyè

5
ID tranzaksyon
23:cf:de:1d
Egzagòn
4
Idantifyan tranzaksyon inik. Jenere pa kliyan an nan kòmansman an nan yon operasyon demann

7
Dezyèm pase
0
Egzagòn
4
Tan an segonn depi nan konmansman an nan pwosesis pou jwenn yon adrès

9
Drapo bòt
0
Egzagòn
2
Sèten drapo ki ka mete pou endike paramèt pwotokòl. Nan ka sa a, 0 vle di kalite demann Unicast

11
Adrès IP kliyan an
0.0.0.0
Fisèl
4
Adrès IP kliyan (si genyen)

15
Adrès IP kliyan ou a
172.16.134.61
Fisèl
4
Adrès IP sèvè a ofri (si disponib)

19
Pwochen adrès IP sèvè
0.0.0.0
Fisèl
4
Adrès IP sèvè (si li konnen)

23
Rele ajan adrès IP
172.16.114.41
Fisèl
4
Adrès IP ajan relè a (pa egzanp, yon switch)

27
Adrès MAC kliyan an
14:d6:4d:a7:c9:55
Egzagòn
6
adrès MAC moun k ap voye pake a (kliyan)

31
Kliyan pyès ki nan konpitè adrès padding
 
Egzagòn
10
Syèj rezève. Anjeneral plen ak zewo

41
Non lame sèvè a
 
Fisèl
64
Non sèvè DHCP. Anjeneral pa transmèt

105
Non dosye bòt
 
Fisèl
128
Non fichye sou sèvè a itilize pa estasyon disk lè demaraj

235
Bonbon majik
63: 82: 53: 63
Egzagòn
4
"Majik" nimewo, dapre ki, enkli. ou ka detèmine ke pake sa a fè pati pwotokòl DHCP la

Opsyon DHCP. Ka ale nan nenpòt lòd

236
Nimewo opsyon
53
Le
1
Opsyon 53, ki defini kalite pake DHCP 2 - DHCPOFFER

 
Longè opsyon
1
Le
1

 
Valè opsyon
2
Le
1

 
Nimewo opsyon
1
Le
1
Opsyon pou ofri kliyan DHCP a yon mask rezo

 
Longè opsyon
4
Le
1

 
Valè opsyon
255.255.224.0
Fisèl
4

 
Nimewo opsyon
3
Le
1
Opsyon pou ofri kliyan DHCP a yon pòtay default

 
Longè opsyon
4
Le
1

 
Valè opsyon
172.16.12.1
Fisèl
4

 
Nimewo opsyon
6
Le
1
Opsyon pou ofri DHCP pou kliyan DNS

 
Longè opsyon
4
Le
1

 
Valè opsyon
8.8.8.8
Fisèl
4

 
Nimewo opsyon
51
Le
1
Tout lavi paramèt rezo yo bay yo an segonn, apre sa kliyan DHCP la dwe mande yo ankò

 
Longè opsyon
4
Le
1

 
Valè opsyon
86400
Le
4

 
Nimewo opsyon
82
Le
1
Opsyon 82, repete sa ki te vini nan DHCPDISCOVER

 
Longè opsyon
18
Le
1

 
Valè opsyon
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Le
18

 
Fen pake
255
Le
1
255 senbolize fen pake a

DHCPREQUEST

Apre kliyan an resevwa DHCPOFFER, li fòme yon pake ki mande paramèt rezo pa tout sèvè DHCP sou rezo a, men sèlman nan yon sèl espesifik, ki gen DHCPOFFER ofri li "renmen" pi plis. Kritè "tankou" yo ka diferan epi depann sou aplikasyon DHCP kliyan an. Yo espesifye moun k ap resevwa demann lan lè l sèvi avèk adrès MAC sèvè DHCP la. Epitou, yon pake DHCPREQUEST ka voye pa kliyan an san yo pa jenere DHCPDISCOVER anvan, si adrès IP sèvè a te deja jwenn deja.

DHCPREQUEST Tablo Estrikti Pake

Pozisyon nan pake a
Non valè (komen)
Egzanp
Entwodiksyon
Byte
Eksplikasyon

1
Demann bòt
1
Egzagòn
1
Kalite mesaj. 1 - demann soti nan kliyan an sèvè, 2 - repons soti nan sèvè a kliyan

2
Kalite pyès ki nan konpitè
1
Egzagòn
1
Kalite adrès pyès ki nan konpitè, nan pwotokòl sa a 1 - MAC

3
Materyèl adrese longè
6
Egzagòn
1
Longè adrès MAC aparèy

4
Oublions
1
Egzagòn
1
Kantite wout entèmedyè

5
ID tranzaksyon
23:cf:de:1d
Egzagòn
4
Idantifyan tranzaksyon inik. Jenere pa kliyan an nan kòmansman an nan yon operasyon demann

7
Dezyèm pase
0
Egzagòn
4
Tan an segonn depi nan konmansman an nan pwosesis pou jwenn yon adrès

9
Drapo bòt
8000
Egzagòn
2
Sèten drapo ki ka mete pou endike paramèt pwotokòl. Nan ka sa a, "emisyon" yo mete

11
Adrès IP kliyan an
0.0.0.0
Fisèl
4
Adrès IP kliyan (si genyen)

15
Adrès IP kliyan ou a
172.16.134.61
Fisèl
4
Adrès IP sèvè a ofri (si disponib)

19
Pwochen adrès IP sèvè
0.0.0.0
Fisèl
4
Adrès IP sèvè (si li konnen)

23
Rele ajan adrès IP
172.16.114.41
Fisèl
4
Adrès IP ajan relè a (pa egzanp, yon switch)

27
Adrès MAC kliyan an
14:d6:4d:a7:c9:55
Egzagòn
6
adrès MAC moun k ap voye pake a (kliyan)

31
Kliyan pyès ki nan konpitè adrès padding
 
Egzagòn
10
Syèj rezève. Anjeneral plen ak zewo

41
Non lame sèvè a
 
Fisèl
64
Non sèvè DHCP. Anjeneral pa transmèt

105
Non dosye bòt
 
Fisèl
128
Non fichye sou sèvè a itilize pa estasyon disk lè demaraj

235
Bonbon majik
63: 82: 53: 63
Egzagòn
4
"Majik" nimewo, dapre ki, enkli. ou ka detèmine ke pake sa a fè pati pwotokòl DHCP la

Opsyon DHCP. Ka ale nan nenpòt lòd

236
Nimewo opsyon
53
Le
3
Opsyon 53, ki defini pake DHCP tip 3 - DHCPREQUEST

 
Longè opsyon
1
Le
1

 
Valè opsyon
3
Le
1

 
Nimewo opsyon
61
Le
1
Kliyan ID: 01 (pou Ehernet) + adrès MAC kliyan an

 
Longè opsyon
7
Le
1

 
Valè opsyon
01:2c:ab:25:ff:72:a6
Egzagòn
7

 
Nimewo opsyon
60
Le
 
"Idantifyan klas vandè". Nan ka mwen an, li rapòte vèsyon an kliyan DHCP. Petèt lòt aparèy retounen yon bagay diferan. Windows pa egzanp rapò MSFT 5.0

 
Longè opsyon
11
Le
 

 
Valè opsyon
udhcp 0.9.8
Fisèl
 

 
Nimewo opsyon
55
 
1
Paramèt rezo kliyan an mande yo. Konpozisyon ka varye

01 — Mask rezo
03 - Gateway
06 - DNS
oc — Non animatè
0f - non domèn rezo
1c - adrès demann emisyon (emisyon)
42 - Non sèvè TFTP
79 - Wout estatik san klas

 
Longè opsyon
8
 
1

 
Valè opsyon
01:03:06:0c:0f:1c:42:79
 
8

 
Nimewo opsyon
82
Le
1
Opsyon 82, repete sa ki te vini nan DHCPDISCOVER

 
Longè opsyon
18
Le
1

 
Valè opsyon
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Le
18

 
Fen pake
255
Le
1
255 senbolize fen pake a

DHCPACK

Kòm konfimasyon ke "wi, se dwa, sa a se adrès IP ou, epi mwen pa pral bay li soti nan nenpòt lòt moun" soti nan sèvè a DHCP, yon pake nan fòma DHCPACK soti nan sèvè a kliyan an sèvi. Li voye emisyon menm jan ak lòt pake. Malgre ke, nan kòd ki anba a pou yon sèvè DHCP aplike nan Python, jis nan ka, mwen kopi nenpòt demann emisyon lè mwen voye yon pake nan yon IP kliyan espesifik, si li deja konnen. Anplis, sèvè DHCP a pa pran swen ditou si pake DHCPACK la rive nan kliyan an. Si kliyan an pa resevwa DHCPACK, apre yon ti tan li tou senpleman repete DHCPREQUEST

Tablo Estrikti Pake DHCPACK

Pozisyon nan pake a
Non valè (komen)
Egzanp
Entwodiksyon
Byte
Eksplikasyon

1
Demann bòt
2
Egzagòn
1
Kalite mesaj. 1 - demann soti nan kliyan an sèvè, 2 - repons soti nan sèvè a kliyan

2
Kalite pyès ki nan konpitè
1
Egzagòn
1
Kalite adrès pyès ki nan konpitè, nan pwotokòl sa a 1 - MAC

3
Materyèl adrese longè
6
Egzagòn
1
Longè adrès MAC aparèy

4
Oublions
1
Egzagòn
1
Kantite wout entèmedyè

5
ID tranzaksyon
23:cf:de:1d
Egzagòn
4
Idantifyan tranzaksyon inik. Jenere pa kliyan an nan kòmansman an nan yon operasyon demann

7
Dezyèm pase
0
Egzagòn
4
Tan an segonn depi nan konmansman an nan pwosesis pou jwenn yon adrès

9
Drapo bòt
8000
Egzagòn
2
Sèten drapo ki ka mete pou endike paramèt pwotokòl. Nan ka sa a, "emisyon" yo mete

11
Adrès IP kliyan an
0.0.0.0
Fisèl
4
Adrès IP kliyan (si genyen)

15
Adrès IP kliyan ou a
172.16.134.61
Fisèl
4
Adrès IP sèvè a ofri (si disponib)

19
Pwochen adrès IP sèvè
0.0.0.0
Fisèl
4
Adrès IP sèvè (si li konnen)

23
Rele ajan adrès IP
172.16.114.41
Fisèl
4
Adrès IP ajan relè a (pa egzanp, yon switch)

27
Adrès MAC kliyan an
14:d6:4d:a7:c9:55
Egzagòn
6
adrès MAC moun k ap voye pake a (kliyan)

31
Kliyan pyès ki nan konpitè adrès padding
 
Egzagòn
10
Syèj rezève. Anjeneral plen ak zewo

41
Non lame sèvè a
 
Fisèl
64
Non sèvè DHCP. Anjeneral pa transmèt

105
Non dosye bòt
 
Fisèl
128
Non fichye sou sèvè a itilize pa estasyon disk lè demaraj

235
Bonbon majik
63: 82: 53: 63
Egzagòn
4
"Majik" nimewo, dapre ki, enkli. ou ka detèmine ke pake sa a fè pati pwotokòl DHCP la

Opsyon DHCP. Ka ale nan nenpòt lòd

236
Nimewo opsyon
53
Le
3
Opsyon 53, ki defini kalite pake DHCP 5 - DHCPACK

 
Longè opsyon
1
Le
1

 
Valè opsyon
5
Le
1

 
Nimewo opsyon
1
Le
1
Opsyon pou ofri kliyan DHCP a yon mask rezo

 
Longè opsyon
4
Le
1

 
Valè opsyon
255.255.224.0
Fisèl
4

 
Nimewo opsyon
3
Le
1
Opsyon pou ofri kliyan DHCP a yon pòtay default

 
Longè opsyon
4
Le
1

 
Valè opsyon
172.16.12.1
Fisèl
4

 
Nimewo opsyon
6
Le
1
Opsyon pou ofri DHCP pou kliyan DNS

 
Longè opsyon
4
Le
1

 
Valè opsyon
8.8.8.8
Fisèl
4

 
Nimewo opsyon
51
Le
1
Tout lavi paramèt rezo yo bay yo an segonn, apre sa kliyan DHCP la dwe mande yo ankò

 
Longè opsyon
4
Le
1

 
Valè opsyon
86400
Le
4

 
Nimewo opsyon
82
Le
1
Opsyon 82, repete sa ki te vini nan DHCPDISCOVER

 
Longè opsyon
18
Le
1

 
Valè opsyon
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Le
18

 
Fen pake
255
Le
1
255 senbolize fen pake a

Enstalasyon

Enstalasyon an aktyèlman konsiste de enstale modil python ki nesesè pou travay. Li sipoze ke MySQL deja enstale ak configuré.

FreeBSD

pkg enstale python3 python3 -m asirepip pip3 enstale mysql-connector

Ubentu

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

Nou kreye yon baz done MySQL, telechaje pil fatra pydhcp.sql la nan li, epi konfigirasyon fichye konfigirasyon an.

Konfigirasyon

Tout paramèt sèvè yo nan yon fichye xml. Fichye referans:

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 tès tès 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 chwazi ip, mask, routeur, dns nan itilizatè yo kote upper(mac)=upper('{option_3_AgentRemoteId_hex}') ak upper(port)=upper('{option_1_AgentCircuitId_port_hex}') chwazi ip, mask, routeur, dns nan itilizatè kote anwo (mac) = anwo ('{sw_mac}') ak anwo (pò) = anwo ('{sw_port82}') chwazi ip, mask, routeur, dns nan itilizatè kote upper(mac)=upper('{ClientMacAddress}') mete nan istwa (id, dt, mac, ip, kòmantè) valè (nil, kounye a (), '{ClientMacAddress}', '{RequestedIpAddress}', 'DHCPACK/INFORM')

Koulye a, an plis detay sou tags yo:

Seksyon dhcpserver la dekri paramèt debaz yo pou kòmanse sèvè a, sètadi:

  • host - ki adrès IP sèvè a koute sou pò 67
  • emisyon - ki ip se emisyon an pou DHCPOFFER ak DHCPACK
  • DHCPServer - ki sa ki IP sèvè DHCP la
  • LeaseTime tan kontra lwaye adrès IP yo bay la
  • ThreadLimit - konbyen fil k ap kouri an menm tan pou trete pake UDP k ap rantre sou pò 67. Li sipoze ede sou pwojè ki gen gwo chaj 😉
  • defaultMask,defaultRouter,defaultDNS - sa ki ofri abònen an pa default si yo jwenn yon IP nan baz done a, men paramèt adisyonèl yo pa espesifye pou li

seksyon mysql:

lame, non itilizatè, modpas, non de baz - tout bagay pale pou tèt li. Yon estrikti baz done apwoksimatif afiche sou GitHub

Seksyon demann: demann pou resevwa ÒF/ACK yo dekri isit la:

  • offer_count — kantite liy ki gen demann ki retounen yon rezilta tankou ip, mask, routeur, dns.
  • offer_n — chèn rechèch. Si retounen vid, Lè sa a, egzekite demann òf sa a
  • history_sql - yon rechèch ki ekri, pou egzanp, nan "istwa otorizasyon" pou yon abònen.

Demann yo ka gen ladan nenpòt varyab nan seksyon opsyon oswa opsyon nan pwotokòl DHCP la.

Opsyon seksyon. Sa a se kote li vin pi enteresan. Isit la nou ka kreye varyab ke nou ka itilize pita nan seksyon rechèch la.

Pou egzanp:

option_82_hex:sw_port1:20:22

, liy kòmand sa a pran tout liy ki te vini nan opsyon demann DHCP 82, nan fòma hex, nan ranje ki soti nan 20 a 22 bytes enklizif epi li mete l nan nouvo varyab sw_port1 (chanje pò soti nan kote demann lan soti)

option_82_hex:sw_mac:26:40

, defini varyab sw_mac la, pran hex la nan seri a 26:40

Ou ka wè tout opsyon ki posib ke yo ka itilize nan demann lè w kòmanse sèvè a ak switch la -d. Nou pral wè yon bagay tankou log sa a:

--yon pake DHCPINFORM te rive sou pò 67, ki soti nan 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress': '0025224ad764': '00d':'Address:'ClientMacAddress':'ClientMacAddress':'ClientMacAddress':'Address Jxd7d', ' HType': 'Ethernet', 'HostName': b'x91xa5xe0xa3xa5xa9-x8fx8a', 'ReqListDNS': Vre, 'ReqListDomainName': Vrè, 'ReqListPerfowmRouterDiscover': Vrè, 'ReqList: TrueRouter': 'ReqList:, 'ReqListRouterRouter' ReqListSubnetMask ': Vre, 'ReqListVendorSpecInfo': 43, 'RequestedIpAddress': '0.0.0.0', 'Vandè': b'MSFT 5.0', 'chaddr': '0025224ad764', 'ciaddr.', '172.30.128.13': 00. drapo ': b'x00x172.30.114.25', 'giaddr': '308', 'gpoz': 6, 'hlen': 1, 'hops': 82, 'htype': 'MAC', 'magic_cookie': b' cx12Sc ', 'op': 'DHCPINFORM', 'option12': 53, 'option53': 55, 'option55': 60, 'option60': 61, 'option61': 82, 'option82': 82, 'option_12_byte' : b'x01x06x00x04x00x01x00x06x02x08x00x06' b'x00x1x9eXx2exb82xad', 'option_12010600040001000602080006001_hex': '589:2 option_82_str': "b'x18x82x12x01x06x00x04x00x01x00x06x02x08x00x06eXx00exb1xad'", 'rezilta': Fo, 'secs': 9, 'siaddr' : '2', 'sw_mac': '768e0.0.0.0eb001ad', 'sw_port589': '2', 'xidbyte': b'

An konsekans, nou ka vlope nenpòt varyab nan {} epi li pral itilize nan rechèch la SQL.

Se pou nou anrejistre pou istwa ke kliyan an te resevwa adrès IP la:

DHCP + Mysql sèvè nan Python

DHCP + Mysql sèvè nan Python

Sèvè kòmanse

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

— d konsole pwodiksyon mòd DEBUG
- c <filename> fichye konfigirasyon

Debriefing

Epi, koulye a plis detay sou aplikasyon sèvè a nan Python. Se yon doulè. Python te aprann sou vole. Anpil moman yo fèt nan style "wow, yon jan kanmenm mwen te fè li travay." Pa optimisé ditou, epi kite nan fòm sa a sitou akòz ti eksperyans nan devlopman Python. Mwen pral rete sou aspè ki pi enteresan nan aplikasyon an sèvè nan "kòd".

Analyseur fichye konfigirasyon XML

Yo itilize estanda modil Python xml.dom. Li sanble senp, men pandan aplikasyon te gen yon mank aparan nan dokiman klè ak egzanp sou rezo a lè l sèvi avèk modil sa a.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") pou elem nan mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["mysql_username"]=elem.getElementsByTagName("username")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("modpas")[0].firstChild.data gconfig["mysql_basename"] =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") pou elem nan 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"Maskp_default] =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultRouter"](NameElementsByTag"] defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("rekèt") pou elem nan qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild.data pou num nan 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("opsyon") pou elem nan opsyon: node=elem.getElementsByTagName("opsyon") pou opsyon nan ne : optionsMod.append(options.firstChild.data)

Multithreading

Etranj ase, multithreading nan Python aplike trè klè ak tou senpleman.

def PacketWork(done,adr): ... # aplikasyon analize pake a fèk ap rantre epi reponn a li ... pandan y ap Vrè: done, addr = udp_socket.recvfrom(1024) # ap tann pou fil pake UDP = threading.Thread( target=PacketWork , args=(data,addr,)).start() # jan li te vini - nou lanse fonksyon PacketWork ki te deja defini nan background nan ak paramèt pandan threading.active_count() >gconfig["dhcp_ThreadLimit"]: tan. dòmi(1) # si nimewo a Gen plis fil ki deja kouri pase nan paramèt yo, nou tann jiskaske gen mwens ladan yo

Resevwa/voye pake DHCP

Yo nan lòd yo entèsepte pake UDP ki vini nan kat rezo a, ou bezwen "leve" priz la:

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

, kote drapo yo ye:

  • AF_INET - vle di ke fòma adrès la pral IP: pò. Kapab genyen tou AF_UNIX - kote adrès la bay non fichye a.
  • SOCK_DGRAM - vle di ke nou pa aksepte yon "pake anvan tout koreksyon", men yon sèl ki te deja pase nan firewall la, ak yon pake pasyèlman taye. Moun sa yo. nou resevwa sèlman yon pake UDP san eleman "fizik" nan anbalaj pake UDP. Si w itilize drapo SOCK_RAW la, w ap bezwen analize "wrapper" sa a tou.

Voye yon pake ka tankou yon emisyon:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #chanje priz la nan mòd emisyon rz=udp_socket.sendto(packetack, (gconfig["emisyon"],68))

, ak adrès "kote pake a soti":

                        udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR,1) # chanje priz la nan mòd milti-koutè rz=udp_socket.sendto(packetack, addr)

, kote SOL_SOCKET vle di "nivo pwotokòl" pou mete opsyon,

, SO_BROADCAST opsyon ke pake kas la se "emisyon"

  ,SO_REUSEADDR opsyon chanje priz la nan mòd "anpil koute". Nan teyori, li pa nesesè nan ka sa a, men sou youn nan sèvè FreeBSD kote mwen te teste, kòd la pa t travay san opsyon sa a.

Analize yon pake DHCP

Sa a se kote mwen vrèman te renmen Python. Li sanble ke soti nan bwat la li pèmèt ou yo dwe byen fleksib ak bytecode la. Ki pèmèt li trè fasil tradui nan valè desimal, strings ak hex - i.e. sa a se sa nou aktyèlman bezwen konprann estrikti a nan pake a. Se konsa, pou egzanp, ou ka jwenn yon seri de bytes nan HEX ak jis bytes:

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

, pake bytes yo nan yon estrikti:

res["drapo"]=pake('BB',done[10],done[11])

Jwenn IP nan estrikti:

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

Ak vis vèrsa:

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

Se tout pou kounye a 😉

Sous: www.habr.com

Add nouvo kòmantè