DHCP+Mysql zerbitzaria Python-en

DHCP+Mysql zerbitzaria Python-en

Proiektu honen helburua hauxe izan zen:

  • DHCP-ri buruz ikastea IPv4 sare batean
  • Python ikasten (hutsetik baino pixka bat gehiago 😉)
  • zerbitzariaren ordezkapena DB2DHCP (nire sardexka), originala Hemen, gero eta zailagoa dena OS berrirako muntatzea. Eta ez zait gustatzen "oraintxe aldatzeko" modurik ez dagoen bitar bat dela
  • funtzionatzen duen DHCP zerbitzari bat lortzea, harpidedun baten IP helbidea hautatzeko gaitasuna duena, harpidedunaren mac edo aldatzeko mac+ataka konbinazioa erabiliz (82 aukera)
  • beste bizikleta bat idaztea (Oh! hau da nire jarduera gogokoena)
  • Habrahabr-en zure klubaren esku egoteari buruzko iruzkinak jasotzea (edo hobeto esanda, gonbidapena) 😉

Emaitza: funtzionatzen du 😉 FreeBSD eta Ubuntu OS-en probatua. Teorian, kodea edozein OStan lan egiteko eska daiteke, zeren Badirudi ez dagoela lotura zehatzik kodean.
Kontuz! Askoz gehiago dago etortzeko.

Afizionatuentzako biltegirako esteka "ukitu bizirik".

"Hardwarea aztertzearen" emaitza instalatzeko, konfiguratzeko eta erabiltzeko prozesua askoz txikiagoa da, eta gero DHCP protokoloari buruzko teoria txiki bat. Niretzat. Eta historiarako 😉

Teoria pixka bat

Zer da DHCP

Sare-protokolo bat da, gailu bati DHCP zerbitzari batetik bere IP helbidea (eta beste parametro batzuk, esaterako, atea, DNS, etab.) jakiteko. Paketeak UDP protokoloa erabiliz trukatzen dira. Sare-parametroak eskatzeko gailuaren funtzionamendu-printzipio orokorra honako hau da:

  1. Gailuak (bezeroak) UDP difusio eskaera (DHCPDISCOVER) sarean zehar bidaltzen du "beno, norbaitek IP helbide bat eman dit". Gainera, normalean (baina ez beti) eskaera 68 atakatik (iturburutik) gertatzen da, eta helmuga 67 ataka da (helmuga). Gailu batzuek 67 atakatik ere bidaltzen dituzte paketeak. Bezeroaren gailuaren MAC helbidea DHCPDISCOVER paketearen barruan sartzen da.
  2. Sarean kokatutako DHCP zerbitzari guztiek (eta horietako batzuk egon daitezke) DHCPOFFER eskaintza osatzen dute DHCPDISCOVER bidali duen gailuaren sareko ezarpenekin, eta sarean ere igortzen dute. Pakete hau nori zuzenduta dagoen identifikatzea DHCPDISCOVER eskaeran lehenago emandako bezeroaren MAC helbidean oinarritzen da.
  3. Bezeroak sare-ezarpenetarako proposamenak dituzten paketeak onartzen ditu, erakargarriena hautatzen du (irizpideak desberdinak izan daitezke, adibidez, paketeak bidaltzeko ordua, tarteko bide kopurua) eta sareko ezarpenekin DHCPREQUEST "eskaera ofiziala" egiten du. gustatzen zaion DHCP zerbitzaritik. Kasu honetan, paketea DHCP zerbitzari zehatz batera doa.
  4. DHCPREQUEST jaso duen zerbitzariak DHCPACK formatuko pakete bat bidaltzen du, eta bezero honi zuzendutako sare-ezarpenak zerrendatzen ditu berriro.

DHCP+Mysql zerbitzaria Python-en

Horrez gain, bezeroarengandik datozen DHCPINFORM paketeak daude, eta horien helburua da DHCP zerbitzariari jakinaraztea "bezeroa bizirik dagoela" eta emandako sarearen ezarpenak erabiltzen ari dela. Zerbitzari honen inplementazioan, pakete hauek ez dira aintzat hartzen.

Pakete formatua

Oro har, Ethernet pakete-marko batek honelako itxura du:

DHCP+Mysql zerbitzaria Python-en

Gure kasuan, UDP paketearen edukietatik zuzenean datuak soilik hartuko ditugu kontuan, OSI geruzako protokolo-goibururik gabe, hots, DHCP egitura:

DHCP EZAGUTU

Beraz, gailu baten IP helbidea lortzeko prozesua DHCP bezeroak 68 atakatik 255.255.255.255:67ra difusio eskaera bidaltzen hasten da. Pakete honetan, bezeroak bere MAC helbidea sartzen du, baita DHCP zerbitzaritik zer jaso nahi duen zehazki ere. Paketearen egitura beheko taulan deskribatzen da.

DHCPDISCOVER Pakete Egitura Taula

Kokatu paketean
Balioaren izena
Adibidea
ideia
Byte
Argitzeko

1
Abiarazteko eskaera
1
Hex
1
Mezu mota. 1 - bezerotik zerbitzarirako eskaera, 2 - zerbitzaritik bezerorako erantzuna

2
Hardware mota
1
Hex
1
Hardware helbide mota, protokolo honetan 1 - MAC

3
Hardware-helbideen luzera
6
Hex
1
Gailuaren MAC helbidearen luzera

4
Lupulua
1
Hex
1
Tarteko ibilbide kopurua

5
Transakzioaren IDa
23:cf:de:1d
Hex
4
Transakzio-identifikatzaile bakarra. Bezeroak eskaera-eragiketa baten hasieran sortutakoa

7
Bigarrena igaro da
0
Hex
4
Helbide bat lortzeko prozesua hasten denetik denbora segundotan

9
Boot banderak
0
Hex
2
Protokolo-parametroak adierazteko ezar daitezkeen zenbait bandera

11
Bezeroaren IP helbidea
0.0.0.0
ilara
4
Bezeroaren IP helbidea (baldin badago)

15
Zure bezeroaren IP helbidea
0.0.0.0
ilara
4
Zerbitzariak eskaintzen duen IP helbidea (eskuragarri badago)

19
Hurrengo zerbitzariaren IP helbidea
0.0.0.0
ilara
4
Zerbitzariaren IP helbidea (ezagutzen bada)

23
Relay agentearen IP helbidea
172.16.114.41
ilara
4
Errele-agentearen IP helbidea (adibidez, etengailua)

27
Bezeroaren MAC helbidea
14:d6:4d:a7:c9:55
Hex
6
Pakete-igorlearen MAC helbidea (bezeroa)

31
Bezeroaren hardware helbidea betetzea
 
Hex
10
Erreserbatutako eserlekua. Normalean zeroz beteta

41
Zerbitzariaren ostalari izena
 
ilara
64
DHCP zerbitzariaren izena. Normalean ez da transmititzen

105
Abiatzeko fitxategiaren izena
 
ilara
128
Abiatzerakoan diskorik gabeko geltokiek erabiltzen duten fitxategi-izena

235
Cookie magikoak
63: 82: 53: 63
Hex
4
Zenbaki "magikoa", horren arabera, barne. pakete hau DHCP protokoloari dagokiola zehaztu dezakezu

DHCP aukerak. Edozein ordenatan joan daiteke

236
Aukera zenbakia
53
Abendu
1
53 aukera, DHCP pakete mota zehazten duena

1 - DHCP DESKURTU
3 - DHCP ESKAERA
2 - DHCP ESKAINTZA
5 - DHCPACK
8 - DHCPINFORM

 
Aukera luzera
1
Abendu
1

 
Aukera balioa
1
Abendu
1

 
Aukera zenbakia
50
Abendu
1
Zein IP helbide jaso nahi du bezeroak?

 
Aukera luzera
4
Abendu
1

 
Aukera balioa
172.16.134.61
ilara
4

 
Aukera zenbakia
55
 
1
Bezeroak eskatutako sare-parametroak. Konposizioa alda daiteke

01 — Sareko maskara
03 - Pasabidea
06 - DNS
oc — Ostalari-izena
0f - sareko domeinu-izena
1c - igorpen-eskaeraren helbidea (difusioa)
42 - TFTP zerbitzariaren izena
79 - Klaserik gabeko ibilbide estatikoa

 
Aukera luzera
8
 
1

 
Aukera balioa
01:03:06:0c:0f:1c:42:79
 
8

 
Aukera zenbakia
82
Abendu
 
82 aukera, errepikagailuaren gailuaren MAC helbidea eta balio gehigarri batzuk transmititzen dituena.

Gehienetan, amaierako DHCP bezeroak exekutatzen duen etengailuaren ataka da. Aukera honek parametro gehigarriak ditu. Lehenengo bytea "azpiaukeraren" zenbakia da, bigarrena bere luzera da, eta gero bere balioa.

Kasu honetan, 82. aukeran, azpiaukerak habiaratzen dira:
Agentearen Zirkuituaren IDa = 00:04:00:01:00:04, non azken bi byteak eskaera etorri den DHCP bezeroaren ataka diren.

Agentearen urruneko IDa = 00:06:c8:be:19:93:11:48 - DHCP errepikagailuaren gailuaren MAC helbidea

 
Aukera luzera
18
Abendu
 

 
Aukera balioa
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Paketearen amaiera
255
Abendu
1
255 paketearen amaiera sinbolizatzen du

DHCP ESKAINTZA

Zerbitzariak DHCPDISCOVER paketea jaso bezain laster eta bezeroari eskatutako zerbait eskain diezaiokeela ikusten badu, erantzun bat sortzen du - DHCPDISCOVER. Erantzuna portura bidaltzen da “etorri zenetik”, emankizunez, zeren momentu honetan, bezeroak ez du oraindik IP helbiderik, beraz, paketea igorpen bidez bidaltzen bada soilik onartu dezake. Bezeroak bere pakete bat dela aitortzen du paketearen barruan duen MAC helbideagatik, baita lehen paketea sortzen den unean sortzen duen transakzio-zenbakiagatik ere.

DHCPOFFER Pakete Egitura Taula

Kokatu paketean
Balioaren izena (ohikoa)
Adibidea
ideia
Byte
Argitzeko

1
Abiarazteko eskaera
1
Hex
1
Mezu mota. 1 - bezerotik zerbitzarirako eskaera, 2 - zerbitzaritik bezerorako erantzuna

2
Hardware mota
1
Hex
1
Hardware helbide mota, protokolo honetan 1 - MAC

3
Hardware-helbideen luzera
6
Hex
1
Gailuaren MAC helbidearen luzera

4
Lupulua
1
Hex
1
Tarteko ibilbide kopurua

5
Transakzioaren IDa
23:cf:de:1d
Hex
4
Transakzio-identifikatzaile bakarra. Bezeroak eskaera-eragiketa baten hasieran sortutakoa

7
Bigarrena igaro da
0
Hex
4
Helbide bat lortzeko prozesua hasten denetik denbora segundotan

9
Boot banderak
0
Hex
2
Protokolo-parametroak adierazteko ezar daitezkeen zenbait bandera. Kasu honetan, 0 Unicast eskaera mota esan nahi du

11
Bezeroaren IP helbidea
0.0.0.0
ilara
4
Bezeroaren IP helbidea (baldin badago)

15
Zure bezeroaren IP helbidea
172.16.134.61
ilara
4
Zerbitzariak eskaintzen duen IP helbidea (eskuragarri badago)

19
Hurrengo zerbitzariaren IP helbidea
0.0.0.0
ilara
4
Zerbitzariaren IP helbidea (ezagutzen bada)

23
Relay agentearen IP helbidea
172.16.114.41
ilara
4
Errele-agentearen IP helbidea (adibidez, etengailua)

27
Bezeroaren MAC helbidea
14:d6:4d:a7:c9:55
Hex
6
Pakete-igorlearen MAC helbidea (bezeroa)

31
Bezeroaren hardware helbidea betetzea
 
Hex
10
Erreserbatutako eserlekua. Normalean zeroz beteta

41
Zerbitzariaren ostalari izena
 
ilara
64
DHCP zerbitzariaren izena. Normalean ez da transmititzen

105
Abiatzeko fitxategiaren izena
 
ilara
128
Abiatzerakoan diskorik gabeko geltokiek erabiltzen duten fitxategi-izena

235
Cookie magikoak
63: 82: 53: 63
Hex
4
Zenbaki "magikoa", horren arabera, barne. pakete hau DHCP protokoloari dagokiola zehaztu dezakezu

DHCP aukerak. Edozein ordenatan joan daiteke

236
Aukera zenbakia
53
Abendu
1
53 aukera, DHCP 2 pakete mota definitzen duena - DHCPOFFER

 
Aukera luzera
1
Abendu
1

 
Aukera balioa
2
Abendu
1

 
Aukera zenbakia
1
Abendu
1
DHCP bezeroari sare-maskara bat eskaintzeko aukera

 
Aukera luzera
4
Abendu
1

 
Aukera balioa
255.255.224.0
ilara
4

 
Aukera zenbakia
3
Abendu
1
DHCP bezeroari atebide lehenetsi bat eskaintzeko aukera

 
Aukera luzera
4
Abendu
1

 
Aukera balioa
172.16.12.1
ilara
4

 
Aukera zenbakia
6
Abendu
1
DNS bezeroari DHCP eskaintzeko aukera

 
Aukera luzera
4
Abendu
1

 
Aukera balioa
8.8.8.8
ilara
4

 
Aukera zenbakia
51
Abendu
1
Jaulkitako sare-parametroen iraupena segundotan, eta ondoren DHCP bezeroak berriro eskatu behar ditu

 
Aukera luzera
4
Abendu
1

 
Aukera balioa
86400
Abendu
4

 
Aukera zenbakia
82
Abendu
1
82. aukerak, DHCPDISCOVER-en jasotakoa errepikatzen du

 
Aukera luzera
18
Abendu
1

 
Aukera balioa
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Abendu
18

 
Paketearen amaiera
255
Abendu
1
255 paketearen amaiera sinbolizatzen du

DHCP ESKAERA

Bezeroak DHCPOFFER jaso ondoren, pakete bat osatzen du sareko parametroak eskatuz ez sareko DHCP zerbitzari guztiei, baizik eta berariazko bati soilik, zeinaren DHCPOFFER eskaintza gehien "gustatu zaion". "Atsegin dut" irizpideak desberdinak izan daitezke eta bezeroaren DHCP ezarpenaren araberakoak izan daitezke. Eskaeraren hartzailea DHCP zerbitzariaren MAC helbidea erabiliz zehazten da. Era berean, DHCPREQUEST pakete bat bidali dezake bezeroak DHCPDISCOVER sortu gabe, baldin eta zerbitzariaren IP helbidea aurretik lortu bada.

DHCPREQUEST Pakete Egitura Taula

Kokatu paketean
Balioaren izena (ohikoa)
Adibidea
ideia
Byte
Argitzeko

1
Abiarazteko eskaera
1
Hex
1
Mezu mota. 1 - bezerotik zerbitzarirako eskaera, 2 - zerbitzaritik bezerorako erantzuna

2
Hardware mota
1
Hex
1
Hardware helbide mota, protokolo honetan 1 - MAC

3
Hardware-helbideen luzera
6
Hex
1
Gailuaren MAC helbidearen luzera

4
Lupulua
1
Hex
1
Tarteko ibilbide kopurua

5
Transakzioaren IDa
23:cf:de:1d
Hex
4
Transakzio-identifikatzaile bakarra. Bezeroak eskaera-eragiketa baten hasieran sortutakoa

7
Bigarrena igaro da
0
Hex
4
Helbide bat lortzeko prozesua hasten denetik denbora segundotan

9
Boot banderak
8000
Hex
2
Protokolo-parametroak adierazteko ezar daitezkeen zenbait bandera. Kasu honetan, "difusioa" ezartzen da

11
Bezeroaren IP helbidea
0.0.0.0
ilara
4
Bezeroaren IP helbidea (baldin badago)

15
Zure bezeroaren IP helbidea
172.16.134.61
ilara
4
Zerbitzariak eskaintzen duen IP helbidea (eskuragarri badago)

19
Hurrengo zerbitzariaren IP helbidea
0.0.0.0
ilara
4
Zerbitzariaren IP helbidea (ezagutzen bada)

23
Relay agentearen IP helbidea
172.16.114.41
ilara
4
Errele-agentearen IP helbidea (adibidez, etengailua)

27
Bezeroaren MAC helbidea
14:d6:4d:a7:c9:55
Hex
6
Pakete-igorlearen MAC helbidea (bezeroa)

31
Bezeroaren hardware helbidea betetzea
 
Hex
10
Erreserbatutako eserlekua. Normalean zeroz beteta

41
Zerbitzariaren ostalari izena
 
ilara
64
DHCP zerbitzariaren izena. Normalean ez da transmititzen

105
Abiatzeko fitxategiaren izena
 
ilara
128
Abiatzerakoan diskorik gabeko geltokiek erabiltzen duten fitxategi-izena

235
Cookie magikoak
63: 82: 53: 63
Hex
4
Zenbaki "magikoa", horren arabera, barne. pakete hau DHCP protokoloari dagokiola zehaztu dezakezu

DHCP aukerak. Edozein ordenatan joan daiteke

236
Aukera zenbakia
53
Abendu
3
53 aukera, DHCP pakete mota 3 definitzen duena - DHCPREQUEST

 
Aukera luzera
1
Abendu
1

 
Aukera balioa
3
Abendu
1

 
Aukera zenbakia
61
Abendu
1
Bezeroaren IDa: 01 (Ehernet-erako) + bezeroaren MAC helbidea

 
Aukera luzera
7
Abendu
1

 
Aukera balioa
01:2c:ab:25:ff:72:a6
Hex
7

 
Aukera zenbakia
60
Abendu
 
"Saltzaile klasearen identifikatzailea". Nire kasuan, DHCP bezeroaren bertsioaren berri ematen du. Agian beste gailu batzuek zerbait desberdina itzultzen dute. Windows-ek adibidez MSFT 5.0-ren berri ematen du

 
Aukera luzera
11
Abendu
 

 
Aukera balioa
udhcp 0.9.8
ilara
 

 
Aukera zenbakia
55
 
1
Bezeroak eskatutako sare-parametroak. Konposizioa alda daiteke

01 — Sareko maskara
03 - Pasabidea
06 - DNS
oc — Ostalari-izena
0f - sareko domeinu-izena
1c - igorpen-eskaeraren helbidea (difusioa)
42 - TFTP zerbitzariaren izena
79 - Klaserik gabeko ibilbide estatikoa

 
Aukera luzera
8
 
1

 
Aukera balioa
01:03:06:0c:0f:1c:42:79
 
8

 
Aukera zenbakia
82
Abendu
1
82. aukerak, DHCPDISCOVER-en jasotakoa errepikatzen du

 
Aukera luzera
18
Abendu
1

 
Aukera balioa
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Abendu
18

 
Paketearen amaiera
255
Abendu
1
255 paketearen amaiera sinbolizatzen du

DHCPACK

DHCP zerbitzaritik "bai, hori da, hau da zure IP helbidea, eta ez diot beste inori emango" baieztapen gisa, zerbitzaritik bezeroari DHCPACK formatuan dagoen pakete batek balio du. Beste pakete batzuk bezala emitituta bidaltzen da. Nahiz eta, beheko kodean Python-en inplementatutako DHCP zerbitzari baterako, badaezpada, edozein igorpen-eskaera bikoiztu egiten dut bezero IP zehatz batera pakete bat bidaliz, dagoeneko ezagutzen bada. Gainera, DHCP zerbitzariari ez zaio batere axola DHCPACK paketea bezeroarengana iritsi ote den. Bezeroak DHCPACK jasotzen ez badu, pixka bat igaro ondoren, DHCPREQUEST errepikatuko du

DHCPACK Pakete Egitura Taula

Kokatu paketean
Balioaren izena (ohikoa)
Adibidea
ideia
Byte
Argitzeko

1
Abiarazteko eskaera
2
Hex
1
Mezu mota. 1 - bezerotik zerbitzarirako eskaera, 2 - zerbitzaritik bezerorako erantzuna

2
Hardware mota
1
Hex
1
Hardware helbide mota, protokolo honetan 1 - MAC

3
Hardware-helbideen luzera
6
Hex
1
Gailuaren MAC helbidearen luzera

4
Lupulua
1
Hex
1
Tarteko ibilbide kopurua

5
Transakzioaren IDa
23:cf:de:1d
Hex
4
Transakzio-identifikatzaile bakarra. Bezeroak eskaera-eragiketa baten hasieran sortutakoa

7
Bigarrena igaro da
0
Hex
4
Helbide bat lortzeko prozesua hasten denetik denbora segundotan

9
Boot banderak
8000
Hex
2
Protokolo-parametroak adierazteko ezar daitezkeen zenbait bandera. Kasu honetan, "difusioa" ezartzen da

11
Bezeroaren IP helbidea
0.0.0.0
ilara
4
Bezeroaren IP helbidea (baldin badago)

15
Zure bezeroaren IP helbidea
172.16.134.61
ilara
4
Zerbitzariak eskaintzen duen IP helbidea (eskuragarri badago)

19
Hurrengo zerbitzariaren IP helbidea
0.0.0.0
ilara
4
Zerbitzariaren IP helbidea (ezagutzen bada)

23
Relay agentearen IP helbidea
172.16.114.41
ilara
4
Errele-agentearen IP helbidea (adibidez, etengailua)

27
Bezeroaren MAC helbidea
14:d6:4d:a7:c9:55
Hex
6
Pakete-igorlearen MAC helbidea (bezeroa)

31
Bezeroaren hardware helbidea betetzea
 
Hex
10
Erreserbatutako eserlekua. Normalean zeroz beteta

41
Zerbitzariaren ostalari izena
 
ilara
64
DHCP zerbitzariaren izena. Normalean ez da transmititzen

105
Abiatzeko fitxategiaren izena
 
ilara
128
Abiatzerakoan diskorik gabeko geltokiek erabiltzen duten fitxategi-izena

235
Cookie magikoak
63: 82: 53: 63
Hex
4
Zenbaki "magikoa", horren arabera, barne. pakete hau DHCP protokoloari dagokiola zehaztu dezakezu

DHCP aukerak. Edozein ordenatan joan daiteke

236
Aukera zenbakia
53
Abendu
3
53 aukera, DHCP pakete mota 5 definitzen duena - DHCPACK

 
Aukera luzera
1
Abendu
1

 
Aukera balioa
5
Abendu
1

 
Aukera zenbakia
1
Abendu
1
DHCP bezeroari sare-maskara bat eskaintzeko aukera

 
Aukera luzera
4
Abendu
1

 
Aukera balioa
255.255.224.0
ilara
4

 
Aukera zenbakia
3
Abendu
1
DHCP bezeroari atebide lehenetsi bat eskaintzeko aukera

 
Aukera luzera
4
Abendu
1

 
Aukera balioa
172.16.12.1
ilara
4

 
Aukera zenbakia
6
Abendu
1
DNS bezeroari DHCP eskaintzeko aukera

 
Aukera luzera
4
Abendu
1

 
Aukera balioa
8.8.8.8
ilara
4

 
Aukera zenbakia
51
Abendu
1
Jaulkitako sare-parametroen iraupena segundotan, eta ondoren DHCP bezeroak berriro eskatu behar ditu

 
Aukera luzera
4
Abendu
1

 
Aukera balioa
86400
Abendu
4

 
Aukera zenbakia
82
Abendu
1
82. aukerak, DHCPDISCOVER-en jasotakoa errepikatzen du

 
Aukera luzera
18
Abendu
1

 
Aukera balioa
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Abendu
18

 
Paketearen amaiera
255
Abendu
1
255 paketearen amaiera sinbolizatzen du

Instalazio-

Instalazioa lanerako beharrezkoak diren python moduluak instalatzean datza. MySQL dagoeneko instalatuta eta konfiguratuta dagoela suposatzen da.

FreeBSD

pkg instalatu python3 python3 -m assurepip pip3 instalatu mysql-konektorea

Ubuntu

sudo apt-get install python3 sudo apt-get install pip3 sudo pip3 instalatu mysql-konektorea

MySQL datu-base bat sortzen dugu, pydhcp.sql zabortegia bertan kargatzen dugu eta konfigurazio fitxategia konfiguratzen dugu.

konfigurazioa

Zerbitzariaren ezarpen guztiak xml fitxategi batean daude. Erreferentzia fitxategia:

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 proba proba 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 hautatu ip, maskara, bideratzailea, dns erabiltzaileetatik non upper(mac)=upper('{option_3_AgentRemoteId_hex}') eta upper(port)=upper('{option_1_AgentCircuitId_port_hex}') hautatu ip, maskara, bideratzailea, dns erabiltzaileetatik non upper(mac)=upper('{sw_mac}') eta upper(port)=upper('{sw_port82}') hautatu ip, maskara, bideratzailea, dns erabiltzaileetatik where upper(mac)=upper('{ClientMacAddress}') txertatu historian (id,dt,mac,ip,comment) balioak (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Orain etiketei buruzko xehetasun gehiago:

dhcpserver atalean zerbitzaria abiarazteko oinarrizko ezarpenak deskribatzen dira, hau da:

  • host - zer IP helbide entzuten duen zerbitzariak 67 atakan
  • broadcast - zein ip den DHCPOFFER eta DHCPACK-en igorpena
  • DHCPServer - zein da DHCP zerbitzariaren ip-a
  • LeaseTime emandako IP helbidearen errentamendu-denbora
  • ThreadLimit - zenbat hari exekutatzen ari diren aldi berean sarrerako UDP paketeak prozesatzeko 67 atakan. Karga handiko proiektuetan lagunduko omen du 😉
  • defaultMask,defaultRouter,defaultDNS - zer eskaintzen zaio lehenespenez harpidedunari datu-basean IP bat aurkitzen bada, baina parametro gehigarriak ez badira zehaztu.

mysql atala:

ostalaria, erabiltzaile-izena, pasahitza, oinarrizko izena - dena berez hitz egiten du. Datu-basearen gutxi gorabeherako egitura bat argitaratzen da GitHub

Kontsulten atala: ESKAINTZA/ACK jasotzeko eskaerak deskribatzen dira hemen:

  • offer_count — ip, maskara, bideratzailea, dns bezalako emaitza bat itzultzen duten eskaerak dituzten lerro kopurua
  • offer_n — kontsulta-katea. Itzultzea hutsik badago, hurrengo eskaintza eskaera exekutatzen du
  • history_sql - adibidez, harpidedun baten "baimenen historia" idazten duen kontsulta.

Eskaerek aukerak ataleko edozein aldagai edo DHCP protokoloko aukerak izan ditzakete.

Aukerak atala. Hemen interesgarriagoa da. Hemen kontsulta atalean geroago erabil ditzakegun aldagaiak sor ditzakegu.

Adibidez:

option_82_hex:sw_port1:20:22

, komando-lerro honek DHCP eskaeraren 82 aukeran zetorren lerro osoa hartzen du, hex formatuan, 20 eta 22 byte arteko tartean eta sw_port1 aldagai berrian jartzen du (aldatu ataka nondik eskaera)

option_82_hex:sw_mac:26:40

, definitu sw_mac aldagaia, 26:40 barrutitik hex

Kontsultetan erabil daitezkeen aukera guztiak ikus ditzakezu zerbitzaria -d etengailuarekin abiaraziz. Log hau bezalako zerbait ikusiko dugu:

--DHCPINFORM pakete bat 67 atakara iritsi da, 0025224ad764-tik, b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress': '0025224', 764) {'ClientMacAddress': '00ad7': 'ClientMacAddress': 'ClientMacAddress': '91:'5 Address' %0"Jxd3d" , ' HType': 'Ethernet', 'HostName': b'x5xa9xe8xa8xa43xa0.0.0.0-x5.0fx0025224a', 'ReqListDNS': True, 'ReqListDomainName': True, 'ReqListPerfowmRouterDiscover': True, 'ReqList:StruetauRoute': True, 'ReqList:StruetauRoute' 'ReqListSubnetM ask': True, 'ReqListVendorSpecInfo': 764, 'RequestedIpAddress': '172.30.128.13', 'Vendor': b'MSFT 00', 'chaddr': '00ad172.30.114.25', 'ciaddr.':308', '6.':1 , 'flags': b'x82x12', 'giaddr': '12', 'gpoz': 53, 'hlen': 53, 'hops': 55, 'htype': 'MAC', 'magic_cookie': b'cx55Sc ', 'op': 'DHCPINFORM', 'option60': 60, 'option61': 61, 'option82': 82, 'option82': 12, 'option01': 06, 'option00': 04, ' option_00_byte': b'x01x00x06x02x08x00x06x00x1x9x2x82' b'x12010600040001000602080006001x589x2eXx82exb18xad', 'option_82_hex': '12 01_len': 06 00, 'option_04_str': "b'x00x01x00x06x02x08x00x06x00x1x9x2x768x0.0.0.0x001eXx589exb2xad'", 'emaitza': Faltsua, 'secs': 1, 'siaddr': '06', 'sw_mac': '89e8eb3ad', 'sw_port897': '8', 'xidbyte': b'

Horren arabera, edozein aldagai bil ditzakegu {}-n eta SQL kontsultan erabiliko da.

Grabatu dezagun historiarako bezeroak IP helbidea jaso zuela:

DHCP+Mysql zerbitzaria Python-en

DHCP+Mysql zerbitzaria Python-en

Zerbitzariaren hasiera

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

— d kontsolaren irteera modua ARAZKETA
- c <fitxategi-izena> konfigurazio fitxategia

Azalpena

Eta orain zerbitzaria Python-en ezartzeari buruzko xehetasun gehiago. Mina da. Python hegan ikasi zen. Momentu asko "wow, nolabait funtzionatu dut" estiloan egiten dira. Ez da batere optimizatua, eta forma honetan utzi, batez ere, Python garapenean esperientzia gutxigatik. Zerbitzariaren ezarpenaren alderdirik interesgarrienetan arituko naiz "kode"n.

XML konfigurazio fitxategi analizatzailea

xml.dom Python modulu estandarra erabiltzen da. Erraza dirudi, baina inplementazioan zehar modulu hau erabiliz sarean dokumentazio eta adibide argien falta nabaria izan zen.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") elementurako mconfig-en: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["mysql_username"]=elem.getElementsByTagName("erabiltzaile-izena")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("pasahitza")[0].firstChild.data gconfig["mysql_basename"] =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") elementurako dconfig-en: gconfig["broadcast"]=elem.getElementsByTagName("igorpena")[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 "fault] =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName ("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultRouter"]=NameDefault.DNS"] defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("kontsulta") qconfig-en elementurako: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[1].firstChild.data num-rako barrutia(int(gconfig["eskaintza_zenbakia"])): gconfig["eskaintza_"+str(zenbakia+1)]=elem.getElementsByTagName ("eskaintza_"+str(zenbakia+0))[0].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[XNUMX].firstChild.data options=tree.getElementsByTagName("aukerak") elementuetarako aukeretan: node=elem.getElementsByTagName("aukera") nodoko aukeretarako : optionsMod.append(aukerak.firstChild.data)

Hari anitzekoa

Bitxia bada ere, multithreading Python-en oso argi eta erraz inplementatzen da.

def PacketWork(data,addr): ... # sarrerako paketea analizatu eta hari erantzuteko ezarpenaren ezarpena ... bitartean True: data, addr = udp_socket.recvfrom(1024) # UDP paketearen haria zain = threading.Thread( target=PacketWork , args=(data,addr,)).start() # etorri zen bezala - aldez aurretik definitutako PacketWork funtzioa parametroekin abiarazten dugu atzeko planoan.active_count() >gconfig["dhcp_ThreadLimit"]: denbora. sleep(1) # zenbakia ezarpenetan baino hari gehiago exekutatzen ari badira, gutxiago dauden arte itxarongo dugu

DHCP paketea jaso/bidali

Sareko txarteletik datozen UDP paketeak atzemateko, socketa "goratu" behar duzu:

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

, non banderak dauden:

  • AF_INET - helbidearen formatua IP: ataka izango dela esan nahi du. AF_UNIX ere egon daiteke, non helbidea fitxategiaren izenak ematen duen.
  • SOCK_DGRAM - esan nahi du ez dugula "pakete gordina" onartzen, suebakitik dagoeneko pasa den bat baizik eta partzialki moztutako pakete batekin. Horiek. UDP pakete bat baino ez dugu jasotzen UDP pakete-bilgarriaren osagai "fisikorik" gabe. SOCK_RAW bandera erabiltzen baduzu, "bilgarri" hau ere analizatu beharko duzu.

Pakete bat bidaltzea igorpen baten modukoa izan daiteke:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #switch socket-a difusio modura rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

, eta "paketea nondik datorren" helbidera:

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # aldatu socketa entzule anitzeko modura rz=udp_socket.sendto(packetack, addr)

, non SOL_SOCKET aukerak ezartzeko "protokolo maila" esan nahi du,

, SO_BROADCAST aukera kaskoaren paketea "igortzen" dela

  ,SO_REUSEADDR aukerak socketa "entzule asko" modura aldatzen du. Teorian, kasu honetan ez da beharrezkoa, baina probatu nuen FreeBSD zerbitzarietako batean, kodeak ez zuen funtzionatu aukera hori gabe.

DHCP pakete bat analizatzen

Hemen asko gustatu zitzaidan Python. Bihurtzen da kutxatik kanpo bytecodearekin nahiko malgua izatea ahalbidetzen duela. Balio hamartar, kate eta hexadegietara oso erraz itzultzeko aukera emanez, hau da. hau da paketearen egitura ulertzeko benetan behar duguna. Beraz, adibidez, byte sorta bat lor dezakezu HEX-n eta byte besterik ez:

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

, paketatu byteak egitura batean:

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

Lortu IP egituratik:

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

Eta alderantziz:

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

Hori da dena oraingoz 😉

Iturria: www.habr.com

Gehitu iruzkin berria