DHCP+Mysql szerver Pythonban

DHCP+Mysql szerver Pythonban

Ennek a projektnek a célja a következő volt:

  • A DHCP megismerése IPv4 hálózaton
  • Python tanulása (kicsit több, mint a semmiből 😉)
  • szerver csere DB2DHCP (az én villám), eredeti itt, amelyet az új operációs rendszerhez egyre nehezebb összeszerelni. És nem tetszik, hogy ez egy bináris, amelyen nincs mód "most megváltoztatni"
  • működő DHCP-kiszolgáló beszerzése, amely képes kiválasztani az előfizető IP-címét az előfizető mac-je vagy switch mac+port kombinációjával (82-es opció)
  • még egy kerékpár írása (Ó! ez a kedvenc tevékenységem)
  • megjegyzések fogadása a Habrahabron való klubszerűségedről (vagy ami még jobb, meghívó) 😉

Eredmény: működik 😉 FreeBSD-n és Ubuntu OS-en tesztelve. Elméletileg a kódot bármilyen operációs rendszer alatt meg lehet kérni, mert Úgy tűnik, hogy a kódban nincsenek konkrét kötések.
Gondosan! Még sok minden jön.

Link az amatőrök tárházához "élő érintés".

A „hardver tanulmányozása” telepítési, konfigurálási és felhasználási folyamata jóval alacsonyabb, majd egy kis elmélet a DHCP protokollról. Magamnak. És a történelemnek 😉

Egy kis elmélet

Mi az a DHCP

Ez egy hálózati protokoll, amely lehetővé teszi az eszköz számára, hogy megtudja az IP-címét (és egyéb paramétereit, például az átjárót, DNS-t stb.) a DHCP-kiszolgálóról. A csomagok cseréje UDP protokoll használatával történik. Az eszköz általános működési elve a hálózati paraméterek lekérésekor a következő:

  1. Az eszköz (kliens) UDP-szórási kérést (DHCPDISCOVER) küld az egész hálózaton, azzal a kéréssel, hogy „jó, valaki adjon meg egy IP-címet”. Ezenkívül általában (de nem mindig) a kérés a 68-as portról érkezik (forrás), és a cél a 67-es port (cél). Egyes eszközök a 67-es portról is küldenek csomagokat. Az ügyféleszköz MAC-címe a DHCPDISCOVER csomagban található.
  2. A hálózaton található összes DHCP-szerver (lehet több is) egy DHCPOFFER-ajánlatot alkot a DHCPDISCOVER-t küldő eszköz hálózati beállításaival, és azt a hálózaton keresztül is sugározza. Annak azonosítása, hogy kinek szánták ezt a csomagot, a kliens DHCPDISCOVER kérésben korábban megadott MAC-címén alapul.
  3. A kliens elfogadja a hálózati beállításokra vonatkozó javaslatokat tartalmazó csomagokat, kiválasztja a legvonzóbbat (a kritériumok eltérőek lehetnek, például a csomag kézbesítésének időpontja, a közbenső útvonalak száma), és a hálózati beállításokkal „hivatalos kérést” küld DHCPREQUEST. a neki tetsző DHCP szerverről. Ebben az esetben a csomag egy adott DHCP-kiszolgálóhoz kerül.
  4. A DHCPREQUEST-et fogadó szerver egy DHCPACK formátumú csomagot küld, amelyben ismét felsorolja az ehhez a klienshez szánt hálózati beállításokat.

DHCP+Mysql szerver Pythonban

Ezen kívül vannak a klienstől érkező DHCPINFORM csomagok, amelyek célja, hogy tájékoztassák a DHCP szervert arról, hogy a „kliens él” és a kiadott hálózati beállításokat használja. A kiszolgáló megvalósítása során ezeket a csomagokat figyelmen kívül hagyja.

Csomag formátum

Általában egy Ethernet csomagkeret valahogy így néz ki:

DHCP+Mysql szerver Pythonban

Esetünkben csak a közvetlenül az UDP csomag tartalmából származó adatokat vesszük figyelembe, OSI réteg protokoll fejlécek nélkül, nevezetesen a DHCP struktúrát:

DHCPDISCOVER

Tehát az eszköz IP-címének megszerzésének folyamata azzal kezdődik, hogy a DHCP-kliens üzenetszórási kérést küld a 68-as portról a 255.255.255.255:67-re. Ebben a csomagban a kliens tartalmazza a MAC címét, valamint azt, hogy pontosan mit is szeretne kapni a DHCP szervertől. A csomag felépítését az alábbi táblázat ismerteti.

DHCPDISCOVER csomagstruktúra táblázat

Elhelyezés a csomagban
Érték neve
Példa
gondolat
byte
derítés

1
Boot kérés
1
Hex
1
Üzenet típusa. 1 - kérés a klienstől a szerverig, 2 - válasz a szervertől a kliensig

2
Hardver típus
1
Hex
1
Hardvercím típusa, ebben a protokollban 1 - MAC

3
Hardvercímek hossza
6
Hex
1
Az eszköz MAC-címének hossza

4
Komló
1
Hex
1
Köztes útvonalak száma

5
Tranzakció azonosítója
23:cf:de:1d
Hex
4
Egyedi tranzakcióazonosító. Az ügyfél által generált kérési művelet elején

7
Eltelt a második
0
Hex
4
Idő másodpercben a címszerzési folyamat kezdetétől számítva

9
Boot zászlók
0
Hex
2
Bizonyos zászlók, amelyek beállíthatók a protokoll paramétereinek jelzésére

11
Kliens IP-címe
0.0.0.0
Vonal
4
Ügyfél IP-címe (ha van)

15
A kliens IP-címe
0.0.0.0
Vonal
4
A szerver által kínált IP-cím (ha van)

19
Következő szerver IP-címe
0.0.0.0
Vonal
4
Szerver IP-címe (ha ismert)

23
Továbbító ügynök IP-címe
172.16.114.41
Vonal
4
A közvetítő ügynök IP-címe (például egy kapcsoló)

27
Ügyfél MAC-címe
14:d6:4d:a7:c9:55
Hex
6
A csomagküldő (kliens) MAC-címe

31
Kliens hardvercímének kitöltése
 
Hex
10
Fenntartott ülés. Általában nullákkal van kitöltve

41
Szerver gazdagép neve
 
Vonal
64
DHCP szerver neve. Általában nem továbbítják

105
Boot fájl neve
 
Vonal
128
A lemez nélküli állomások által rendszerindításkor használt fájlnév a szerveren

235
Mágikus süti
63: 82: 53: 63
Hex
4
„Varázslatos” szám, amely szerint pl. megállapíthatja, hogy ez a csomag a DHCP protokollhoz tartozik-e

DHCP opciók. Bármilyen sorrendben mehet

236
Opció száma
53
december
1
53. opció, amely a DHCP-csomag típusát határozza meg

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

 
Opció hossza
1
december
1

 
Opció értéke
1
december
1

 
Opció száma
50
december
1
Milyen IP-címet szeretne kapni a kliens?

 
Opció hossza
4
december
1

 
Opció értéke
172.16.134.61
Vonal
4

 
Opció száma
55
 
1
Az ügyfél által kért hálózati paraméterek. Az összetétel változhat

01 — Hálózati maszk
03 - Átjáró
06 - DNS
oc – Gazdanév
0f - hálózati tartománynév
1c – a sugárzási kérelem címe (közvetítés)
42 - TFTP-kiszolgáló neve
79 - Osztály nélküli statikus útvonal

 
Opció hossza
8
 
1

 
Opció értéke
01:03:06:0c:0f:1c:42:79
 
8

 
Opció száma
82
december
 
82. opció, amely továbbítja az átjátszó eszköz MAC-címét és néhány további értéket.

Leggyakrabban ez a kapcsoló portja, amelyen a vég DHCP kliens fut, ez az opció további paramétereket tartalmaz, az első bájt az „alopció” száma, a második a hossza, majd az értéke.

Ebben az esetben a 82. opcióban az alehetőségek egymásba vannak ágyazva:
Ügynök áramkörazonosító = 00:04:00:01:00:04, ahol az utolsó két bájt az a DHCP-kliens port, amelyről a kérés érkezett

Agent Remote ID = 00:06:c8:be:19:93:11:48 - A DHCP átjátszó eszköz MAC-címe

 
Opció hossza
18
december
 

 
Opció értéke
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Csomag vége
255
december
1
A 255 a csomag végét szimbolizálja

DHCPOFFER

Amint a szerver megkapja a DHCPDISCOVER csomagot, és ha látja, hogy tud valamit felajánlani a kliensnek a kértből, akkor választ generál rá - DHCPDISCOVER. A választ „ahonnan jött”, sugárzott portra küldik, mert a kliensnek jelenleg még nincs IP címe, ezért csak akkor tudja fogadni a csomagot, ha azt broadcast úton küldik. Az ügyfél a csomagon belüli MAC-címéről, valamint az első csomag létrehozásakor generált tranzakciószámról ismeri fel, hogy ez egy neki való csomag.

DHCPOFFER csomagstruktúra táblázat

Elhelyezés a csomagban
Az érték neve (általános)
Példa
gondolat
byte
derítés

1
Boot kérés
1
Hex
1
Üzenet típusa. 1 - kérés a klienstől a szerverig, 2 - válasz a szervertől a kliensig

2
Hardver típus
1
Hex
1
Hardvercím típusa, ebben a protokollban 1 - MAC

3
Hardvercímek hossza
6
Hex
1
Az eszköz MAC-címének hossza

4
Komló
1
Hex
1
Köztes útvonalak száma

5
Tranzakció azonosítója
23:cf:de:1d
Hex
4
Egyedi tranzakcióazonosító. Az ügyfél által generált kérési művelet elején

7
Eltelt a második
0
Hex
4
Idő másodpercben a címszerzési folyamat kezdetétől számítva

9
Boot zászlók
0
Hex
2
Bizonyos zászlók, amelyek beállíthatók a protokoll paramétereinek jelzésére. Ebben az esetben a 0 az Unicast kérés típusát jelenti

11
Kliens IP-címe
0.0.0.0
Vonal
4
Ügyfél IP-címe (ha van)

15
A kliens IP-címe
172.16.134.61
Vonal
4
A szerver által kínált IP-cím (ha van)

19
Következő szerver IP-címe
0.0.0.0
Vonal
4
Szerver IP-címe (ha ismert)

23
Továbbító ügynök IP-címe
172.16.114.41
Vonal
4
A közvetítő ügynök IP-címe (például egy kapcsoló)

27
Ügyfél MAC-címe
14:d6:4d:a7:c9:55
Hex
6
A csomagküldő (kliens) MAC-címe

31
Kliens hardvercímének kitöltése
 
Hex
10
Fenntartott ülés. Általában nullákkal van kitöltve

41
Szerver gazdagép neve
 
Vonal
64
DHCP szerver neve. Általában nem továbbítják

105
Boot fájl neve
 
Vonal
128
A lemez nélküli állomások által rendszerindításkor használt fájlnév a szerveren

235
Mágikus süti
63: 82: 53: 63
Hex
4
„Varázslatos” szám, amely szerint pl. megállapíthatja, hogy ez a csomag a DHCP protokollhoz tartozik-e

DHCP opciók. Bármilyen sorrendben mehet

236
Opció száma
53
december
1
53. opció, amely meghatározza a DHCP 2 csomagtípust - DHCPOFFER

 
Opció hossza
1
december
1

 
Opció értéke
2
december
1

 
Opció száma
1
december
1
Lehetőség a DHCP kliensnek hálózati maszk felajánlására

 
Opció hossza
4
december
1

 
Opció értéke
255.255.224.0
Vonal
4

 
Opció száma
3
december
1
Lehetőség a DHCP-kliensnek alapértelmezett átjáró felajánlására

 
Opció hossza
4
december
1

 
Opció értéke
172.16.12.1
Vonal
4

 
Opció száma
6
december
1
Lehetőség DHCP felajánlására a DNS-kliens számára

 
Opció hossza
4
december
1

 
Opció értéke
8.8.8.8
Vonal
4

 
Opció száma
51
december
1
A kiadott hálózati paraméterek élettartama másodpercben, ami után a DHCP kliensnek újra le kell kérnie azokat

 
Opció hossza
4
december
1

 
Opció értéke
86400
december
4

 
Opció száma
82
december
1
A 82-es opció megismétli a DHCPDISCOVER-ben kapottakat

 
Opció hossza
18
december
1

 
Opció értéke
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
december
18

 
Csomag vége
255
december
1
A 255 a csomag végét szimbolizálja

DHCPREQUEST

Miután a kliens megkapta a DHCPOFFER-t, nem a hálózat összes DHCP-kiszolgálójához kér hálózati paramétereket, hanem csak egy meghatározott DHCP-kiszolgálóhoz csomagot képez, amelynek a DHCPOFFER ajánlata a legjobban „tetszett”. A „tetszik” kritériumok eltérőek lehetnek, és az ügyfél DHCP-megvalósításától függenek. A kérés címzettje a DHCP-szerver MAC-címével van megadva. Ezenkívül a kliens a DHCPDISCOVER generálása nélkül is küldhet DHCPREQUEST csomagot, ha a szerver IP-címét már korábban megszerezték.

DHCPREQUEST csomagstruktúra táblázat

Elhelyezés a csomagban
Az érték neve (általános)
Példa
gondolat
byte
derítés

1
Boot kérés
1
Hex
1
Üzenet típusa. 1 - kérés a klienstől a szerverig, 2 - válasz a szervertől a kliensig

2
Hardver típus
1
Hex
1
Hardvercím típusa, ebben a protokollban 1 - MAC

3
Hardvercímek hossza
6
Hex
1
Az eszköz MAC-címének hossza

4
Komló
1
Hex
1
Köztes útvonalak száma

5
Tranzakció azonosítója
23:cf:de:1d
Hex
4
Egyedi tranzakcióazonosító. Az ügyfél által generált kérési művelet elején

7
Eltelt a második
0
Hex
4
Idő másodpercben a címszerzési folyamat kezdetétől számítva

9
Boot zászlók
8000
Hex
2
Bizonyos zászlók, amelyek beállíthatók a protokoll paramétereinek jelzésére. Ebben az esetben a „sugárzás” van beállítva

11
Kliens IP-címe
0.0.0.0
Vonal
4
Ügyfél IP-címe (ha van)

15
A kliens IP-címe
172.16.134.61
Vonal
4
A szerver által kínált IP-cím (ha van)

19
Következő szerver IP-címe
0.0.0.0
Vonal
4
Szerver IP-címe (ha ismert)

23
Továbbító ügynök IP-címe
172.16.114.41
Vonal
4
A közvetítő ügynök IP-címe (például egy kapcsoló)

27
Ügyfél MAC-címe
14:d6:4d:a7:c9:55
Hex
6
A csomagküldő (kliens) MAC-címe

31
Kliens hardvercímének kitöltése
 
Hex
10
Fenntartott ülés. Általában nullákkal van kitöltve

41
Szerver gazdagép neve
 
Vonal
64
DHCP szerver neve. Általában nem továbbítják

105
Boot fájl neve
 
Vonal
128
A lemez nélküli állomások által rendszerindításkor használt fájlnév a szerveren

235
Mágikus süti
63: 82: 53: 63
Hex
4
„Varázslatos” szám, amely szerint pl. megállapíthatja, hogy ez a csomag a DHCP protokollhoz tartozik-e

DHCP opciók. Bármilyen sorrendben mehet

236
Opció száma
53
december
3
53. opció, amely a 3-as DHCP-csomagtípust határozza meg – DHCPREQUEST

 
Opció hossza
1
december
1

 
Opció értéke
3
december
1

 
Opció száma
61
december
1
Ügyfélazonosító: 01 (Ehernethez) + kliens MAC-címe

 
Opció hossza
7
december
1

 
Opció értéke
01:2c:ab:25:ff:72:a6
Hex
7

 
Opció száma
60
december
 
"Vendor class azonosító". Az én esetemben a DHCP kliens verzióját jelenti. Lehet, hogy más eszközök mást adnak vissza. A Windows például az MSFT 5.0-t jelenti

 
Opció hossza
11
december
 

 
Opció értéke
udhcp 0.9.8
Vonal
 

 
Opció száma
55
 
1
Az ügyfél által kért hálózati paraméterek. Az összetétel változhat

01 — Hálózati maszk
03 - Átjáró
06 - DNS
oc – Gazdanév
0f - hálózati tartománynév
1c – a sugárzási kérelem címe (közvetítés)
42 - TFTP-kiszolgáló neve
79 - Osztály nélküli statikus útvonal

 
Opció hossza
8
 
1

 
Opció értéke
01:03:06:0c:0f:1c:42:79
 
8

 
Opció száma
82
december
1
A 82-es opció megismétli a DHCPDISCOVER-ben kapottakat

 
Opció hossza
18
december
1

 
Opció értéke
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
december
18

 
Csomag vége
255
december
1
A 255 a csomag végét szimbolizálja

DHCPACK

Annak megerősítéseként, hogy „igen, ez az Ön IP-címe, és nem adom ki másnak” a DHCP szervertől egy DHCPACK formátumú csomagot szolgál ki a szervertől a kliens felé. A többi csomaghoz hasonlóan sugárzott formában kerül elküldésre. Bár az alábbi kódban egy Pythonban implementált DHCP-kiszolgálóhoz minden esetben megduplázok minden broadcast kérést úgy, hogy csomagot küldök egy adott kliens IP-címére, ha az már ismert. Ráadásul a DHCP szervert egyáltalán nem érdekli, hogy a DHCPACK csomag elérte-e a klienst. Ha a kliens nem kap DHCPACK-t, akkor egy idő után egyszerűen megismétli a DHCPREQUEST-et

DHCPACK csomagstruktúra táblázat

Elhelyezés a csomagban
Az érték neve (általános)
Példa
gondolat
byte
derítés

1
Boot kérés
2
Hex
1
Üzenet típusa. 1 - kérés a klienstől a szerverig, 2 - válasz a szervertől a kliensig

2
Hardver típus
1
Hex
1
Hardvercím típusa, ebben a protokollban 1 - MAC

3
Hardvercímek hossza
6
Hex
1
Az eszköz MAC-címének hossza

4
Komló
1
Hex
1
Köztes útvonalak száma

5
Tranzakció azonosítója
23:cf:de:1d
Hex
4
Egyedi tranzakcióazonosító. Az ügyfél által generált kérési művelet elején

7
Eltelt a második
0
Hex
4
Idő másodpercben a címszerzési folyamat kezdetétől számítva

9
Boot zászlók
8000
Hex
2
Bizonyos zászlók, amelyek beállíthatók a protokoll paramétereinek jelzésére. Ebben az esetben a „sugárzás” van beállítva

11
Kliens IP-címe
0.0.0.0
Vonal
4
Ügyfél IP-címe (ha van)

15
A kliens IP-címe
172.16.134.61
Vonal
4
A szerver által kínált IP-cím (ha van)

19
Következő szerver IP-címe
0.0.0.0
Vonal
4
Szerver IP-címe (ha ismert)

23
Továbbító ügynök IP-címe
172.16.114.41
Vonal
4
A közvetítő ügynök IP-címe (például egy kapcsoló)

27
Ügyfél MAC-címe
14:d6:4d:a7:c9:55
Hex
6
A csomagküldő (kliens) MAC-címe

31
Kliens hardvercímének kitöltése
 
Hex
10
Fenntartott ülés. Általában nullákkal van kitöltve

41
Szerver gazdagép neve
 
Vonal
64
DHCP szerver neve. Általában nem továbbítják

105
Boot fájl neve
 
Vonal
128
A lemez nélküli állomások által rendszerindításkor használt fájlnév a szerveren

235
Mágikus süti
63: 82: 53: 63
Hex
4
„Varázslatos” szám, amely szerint pl. megállapíthatja, hogy ez a csomag a DHCP protokollhoz tartozik-e

DHCP opciók. Bármilyen sorrendben mehet

236
Opció száma
53
december
3
53. opció, amely az 5-ös DHCP-csomagtípust határozza meg – DHCPACK

 
Opció hossza
1
december
1

 
Opció értéke
5
december
1

 
Opció száma
1
december
1
Lehetőség a DHCP kliensnek hálózati maszk felajánlására

 
Opció hossza
4
december
1

 
Opció értéke
255.255.224.0
Vonal
4

 
Opció száma
3
december
1
Lehetőség a DHCP-kliensnek alapértelmezett átjáró felajánlására

 
Opció hossza
4
december
1

 
Opció értéke
172.16.12.1
Vonal
4

 
Opció száma
6
december
1
Lehetőség DHCP felajánlására a DNS-kliens számára

 
Opció hossza
4
december
1

 
Opció értéke
8.8.8.8
Vonal
4

 
Opció száma
51
december
1
A kiadott hálózati paraméterek élettartama másodpercben, ami után a DHCP kliensnek újra le kell kérnie azokat

 
Opció hossza
4
december
1

 
Opció értéke
86400
december
4

 
Opció száma
82
december
1
A 82-es opció megismétli a DHCPDISCOVER-ben kapottakat

 
Opció hossza
18
december
1

 
Opció értéke
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
december
18

 
Csomag vége
255
december
1
A 255 a csomag végét szimbolizálja

Telepítés

A telepítés tulajdonképpen a munkához szükséges python modulok telepítéséből áll. Feltételezzük, hogy a MySQL már telepítve és konfigurálva van.

FreeBSD

pkg telepítés python3 python3 -m biztosipip pip3 mysql-csatlakozó telepítése

Ubuntu

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

Létrehozunk egy MySQL adatbázist, feltöltjük a pydhcp.sql dump-et, és beállítjuk a konfigurációs fájlt.

Configuration

Minden szerverbeállítás xml fájlban található. Referencia fájl:

1.0 0.0.0.0 255.255.255.255 192.168.0.71 8600 1 255.255.255.0 192.168.0.1 helyi kiszolgáló teszt teszt 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 válassza ki az ip,mask,router,dns-t a felhasználóktól, ahol felső(mac)=upper('{option_3_AgentRemoteId_hex}') és felső(port)=upper('{option_1_AgentCircuitId_port_hex}') válasszon ip,mask,router,dns-t olyan felhasználóktól, ahol felső(mac)=upper('{sw_mac}') és felső(port)=upper('{sw_port82}') válassza ki az ip,mask,router,dns-t olyan felhasználóktól, ahol felső(mac)=upper('{ClientMacAddress}') szúrjon be az előzményekbe (id,dt,mac,ip,comment) értékeket (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Most részletesebben a címkékről:

A dhcpserver szakasz leírja a szerver indításának alapvető beállításait, nevezetesen:

  • host - milyen IP-címet figyel a szerver a 67-es porton
  • broadcast – melyik ip a DHCPOFFER és a DHCPACK adása
  • DHCPServer – mi a DHCP szerver IP címe
  • A kiadott IP-cím LeaseTime bérleti ideje
  • ThreadLimit – hány szál fut egyidejűleg a bejövő UDP-csomagok feldolgozásához a 67-es porton. Feltételezhető, hogy segít a nagy terhelésű projektekben 😉
  • defaultMask,defaultRouter,defaultDNS - amit alapértelmezés szerint kínálnak az előfizetőnek, ha az adatbázisban található IP-cím, de további paraméterek nincsenek megadva hozzá

mysql szakasz:

gazdagép, felhasználónév, jelszó, alapnév – minden önmagáért beszél. Egy hozzávetőleges adatbázis-struktúra a következő helyen található: GitHub

Lekérdezési szakasz: az AJÁNLAT/ACK fogadására vonatkozó kérések leírása itt található:

  • offer_count – azoknak a soroknak a száma, amelyek olyan kéréseket tartalmaznak, amelyek olyan eredményt adnak vissza, mint ip,mask,router,dns
  • ajánlat_n — lekérdezési karakterlánc. Ha a return üres, akkor végrehajtja a következő ajánlatkérést
  • history_sql - olyan lekérdezés, amely például egy előfizető „engedélyezési előzményeibe” ír

A kérések bármilyen változót tartalmazhatnak az opciók szakaszból vagy a DHCP protokoll beállításait.

Opciók szakasz. Itt válik érdekesebbé a dolog. Itt olyan változókat hozhatunk létre, amelyeket később a lekérdező részben használhatunk.

Például:

option_82_hex:sw_port1:20:22

, ez a parancssor átveszi a teljes sort, amely a 82-es DHCP-kérés opcióban érkezett, hexadecimális formátumban, a 20 és 22 bájt közötti tartományban, és az új sw_port1 változóba helyezi (portváltás, ahonnan a kérés érkezett)

option_82_hex:sw_mac:26:40

, adja meg az sw_mac változót, a hexadecimális értéket a 26:40 tartományból

A lekérdezésekben használható összes opciót megtekintheti, ha a szervert a -d kapcsolóval indítja. Valami ehhez hasonló naplót fogunk látni:

--a DHCPINFORM csomag a 67-es porton érkezett, innen: 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress'B,0025224'764Cím00t,7'91 ': b'x5 0%"Jxd3d" , ' HType': 'Ethernet', 'HostName': b'x5xa9xe8xa8xa43xa0.0.0.0-x5.0fx0025224a', 'ReqListDNS': Igaz, 'ReqListDomainName': Igaz, 'ReqListPerfowmRouterL:Disco''ReqL:Disco''' ReqListStaticRoute': Igaz, 'ReqListSubnetM ask ': True, 'ReqListVendorSpecInfo': 764, 'RequestedIpAddress': '172.30.128.13', 'Vendor': b'MSFT 00', 'chaddr': '00ad172.30.114.25'308'.6:1.'ciad'82'.12'. , 'flags': b'x12x53', 'giaddr': '53', 'gpoz': 55, 'hlen': 55, 'hops': 60, 'htype': 'MAC', 'magic_cookie': b'cx60Sc ', 'op': 'DHCPINFORM', 'opció61': 61, 'opció82': 82, 'opció82': 12, 'opció 01': 06, 'opció 00': 04, 'opció00': 01 option_00_byte': b'x06x02x08x00x06x00x1x9x2x82x12010600040001000602080006001x589' b'x2x82x18eXx82exb12xad', 'opció_01_hex': '06 'option_00_len': 04 00, 'option_01_str': "b'x00x06x02x08x00x06x00x1x9x2x768x0.0.0.0x001x589x2eXx1exb06xad'", 'eredmény': False,', '89se8 'siaddr': '3', 'sw_mac': '897e8eb0.0.0.0ad', 'sw_portXNUMX': 'XNUMX', 'xidbyte': b'

Ennek megfelelően tetszőleges változót becsomagolhatunk a {}-ba, és ez kerül felhasználásra az SQL lekérdezésben.

Rögzítsük az előzményekhez, hogy az ügyfél megkapta az IP-címet:

DHCP+Mysql szerver Pythonban

DHCP+Mysql szerver Pythonban

Szerver indítása

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

— d konzol kimeneti mód DEBUG
- c <fájlnév> konfigurációs fájl

Kikérdezés

És most további részletek a szerver Pythonban való megvalósításáról. Ez egy fájdalom. A Pythont menet közben tanulták meg. Sok pillanat a „hú, valahogy sikerült a dolog” stílusában készült. Egyáltalán nincs optimalizálva, és főleg a Python fejlesztésben szerzett kevés tapasztalat miatt maradt ebben a formában. A szerver implementáció legérdekesebb aspektusainál fogok időzni a „kódban”.

XML konfigurációs fájl elemző

A szabványos Python xml.dom modult használják. Egyszerűnek tűnik, de a megvalósítás során észrevehetően hiányzott az egyértelmű dokumentáció és a példák a hálózaton a modul használatával.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") for elem in mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firtast[0].fi gconfig["mysql_username"]=elem.getElementsByTagName("felhasználónév")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("jelszó")[0].first"gconqlda["enmy"gconqlda["enmy"gconqlda. =elem.getElementsByTagName("alapnév")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") az elemhez a dconfigban: gconfig["broadcast"]=elem.getElementsByTagcast"("br0]. firstChild.data gconfig["dhcp_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["dhcp_LeaseTime"]=elem.getElementsByTagName("LeaseTime")[0]LeaseTime")stcon[0]. dhcp_threadlimit "] = int (Elem.getElementsByTagname (" ThreadLimit ") [0] .FirstChild.Data) GCONFIG [" DHCP_SERVER "] = Elem.getElementsByTagname (" Dhcpserver ") =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gcongfig"Tagame " defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") for elem in qconfig: gconfig["offer_count"]=elem.getElementsByTagName("ajánlatok_száma")[1].firstChild in. range(int(gconfig["ajánlat_száma"])): gconfig["ajánlat_"+str(num+1)]=elem.getElementsByTagName("ajánlat_"+str(szám+0))[0].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[XNUMX].firstChild.data options=tree.getElementsByTagName("options") for elem in options: node=elem.getElementsByTagName("option") for option in options : optionsMod.append(options.firstChild.data)

Többszálú

Furcsa módon a többszálú Pythonban nagyon világosan és egyszerűen van megvalósítva.

def PacketWork(data,addr): ... # a bejövő csomag elemzésének és a rá adott válasznak a megvalósítása ... while True: data, addr = udp_socket.recvfrom(1024) # az UDP csomagra várakozó szál = threading.Thread( target=PacketWork , args=(data,addr,)).start() # ahogy jött - elindítjuk a háttérben a korábban meghatározott PacketWork függvényt paraméterekkel, miközben threading.active_count() >gconfig["dhcp_ThreadLimit"]: idő. sleep(1) # ha a szám Több szál fut már, mint a beállításokban, várunk míg kevesebb lesz belőlük

DHCP-csomag fogadása/küldése

A hálózati kártyán keresztül érkező UDP-csomagok elfogásához fel kell emelni a foglalatot:

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

, ahol a zászlók:

  • AF_INET - azt jelenti, hogy a cím formátuma IP: port lesz. Előfordulhat AF_UNIX is, ahol a címet a fájlnév adja meg.
  • SOCK_DGRAM - azt jelenti, hogy nem „nyers csomagot” fogadunk el, hanem olyat, amely már átment a tűzfalon, és részben levágott csomaggal. Azok. csak egy UDP-csomagot kapunk az UDP-csomagcsomagoló „fizikai” komponense nélkül. Ha a SOCK_RAW jelzőt használja, akkor ezt a „burkolót” is elemeznie kell.

A csomag küldése olyan lehet, mint egy adás:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #átkapcsolja a socketet broadcast módba rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

és a „honnan a csomag jött” címre:

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # kapcsolja át a socketet többhallgatós módba rz=udp_socket.sendto(packetack, addr)

, ahol a SOL_SOCKET a beállítási lehetőségek „protokollszintjét” jelenti,

, SO_BROADCAST opció, hogy a sisakcsomag „sugárzott”

  A ,SO_REUSEADDR opció a socketet „sok hallgató” módba kapcsolja. Elméletileg ebben az esetben szükségtelen, de az egyik FreeBSD-szerveren, amelyen teszteltem, a kód nem működött e lehetőség nélkül.

DHCP-csomag elemzése

Itt nagyon megszerettem a Python-t. Kiderült, hogy a dobozból kiindulva meglehetősen rugalmas lehet a bájtkóddal. Lehetővé téve, hogy nagyon könnyen lefordítható legyen decimális értékekre, karakterláncokra és hexa - azaz pl. ez az, amire valójában szükségünk van ahhoz, hogy megértsük a csomag szerkezetét. Így például egy bájttartományt kaphat HEX-ben és csak bájtokat:

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

, csomagolja be a bájtokat egy szerkezetbe:

res["zászlók"]=csomag('BB',data[10],data[11])

IP lekérése a szerkezetből:

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

És fordítva:

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

Egyelőre ennyi 😉

Forrás: will.com

Hozzászólás