DHCP+Mysql-server i Python

DHCP+Mysql-server i Python

Syftet med detta projekt var:

  • LĂ€r dig om DHCP i ett IPv4-nĂ€tverk
  • Att lĂ€ra sig Python (lite mer Ă€n frĂ„n början 😉)
  • serverbyte DB2DHCP (min gaffel), original hĂ€r, som blir svĂ„rare och svĂ„rare att montera för det nya operativsystemet. Och jag gillar inte att det Ă€r binĂ€rt att det inte finns nĂ„got sĂ€tt att "Ă€ndra just nu"
  • skaffa en fungerande DHCP-server med möjlighet att vĂ€lja en abonnents IP-adress med hjĂ€lp av abonnentens mac eller byta mac+port-kombination (alternativ 82)
  • skriva en annan cykel (Åh! det hĂ€r Ă€r min favoritaktivitet)
  • fĂ„ kommentarer om din klubbhĂ€ndelse pĂ„ Habrahabr (eller Ă€nnu bĂ€ttre, en inbjudan) 😉

Resultat: det fungerar 😉 Testat pĂ„ FreeBSD OS och UbuntuTeoretiskt sett kan koden fĂ„s att fungera pĂ„ vilket operativsystem som helst, eftersom det inte finns nĂ„gra specifika bindningar i koden.
Försiktigt! Det kommer mycket mer.

LÀnk till arkiv för amatörer "beröra vid liv".

Processen att installera, konfigurera och anvĂ€nda resultatet av att "studera hĂ„rdvaran" Ă€r mycket lĂ€gre, och sedan lite teori om DHCP-protokollet. För mig sjĂ€lv. Och för historien 😉

Lite teori

Vad Àr DHCP

Detta Àr ett nÀtverksprotokoll som gör att en enhet kan ta reda pÄ sin IP-adress (och andra parametrar som gateway, DNS, etc.) frÄn en DHCP-server. Paket utbyts med UDP-protokollet. Den allmÀnna principen för enhetens drift nÀr du begÀr nÀtverksparametrar Àr som följer:

  1. Enheten (klienten) skickar en UDP-sÀndningsbegÀran (DHCPDISCOVER) i hela nÀtverket med begÀran "ja, nÄgon ger mig en IP-adress." Dessutom sker vanligtvis (men inte alltid) begÀran frÄn port 68 (kÀlla), och destinationen Àr port 67 (destination). Vissa enheter skickar Àven paket frÄn port 67. MAC-adressen för klientenheten ingÄr i DHCPDISCOVER-paketet.
  2. Alla DHCP-servrar som finns pÄ nÀtverket (och det kan finnas flera av dem) bildar ett DHCPOFFER-erbjudande med nÀtverksinstÀllningar för enheten som skickade DHCPDISCOVER, och sÀnder Àven det över nÀtverket. Identifiering av vem detta paket Àr avsett för baseras pÄ MAC-adressen för klienten som angavs tidigare i DHCPDISCOVER-begÀran.
  3. Klienten accepterar paket med förslag pÄ nÀtverksinstÀllningar, vÀljer den mest attraktiva (kriterierna kan vara olika, till exempel tidpunkten för paketleverans, antalet mellanvÀgar) och gör en "officiell begÀran" DHCPREQUEST med nÀtverksinstÀllningarna frÄn DHCP-servern den gillar. I det hÀr fallet gÄr paketet till en specifik DHCP-server.
  4. Servern som tog emot DHCPREQUEST skickar ett paket i DHCPACK-format, dÀr den Äterigen listar nÀtverksinstÀllningarna avsedda för denna klient

DHCP+Mysql-server i Python

Dessutom finns det DHCPINFORM-paket som kommer frÄn klienten, och syftet med dessa Àr att informera DHCP-servern om att "klienten Àr vid liv" och anvÀnder de utfÀrdade nÀtverksinstÀllningarna. I den hÀr serverns implementering ignoreras dessa paket.

Paketformat

I allmÀnhet ser en Ethernet-paketram ut ungefÀr sÄ hÀr:

DHCP+Mysql-server i Python

I vÄrt fall kommer vi endast att övervÀga data direkt frÄn innehÄllet i UDP-paketet, utan OSI-lagerprotokollhuvuden, nÀmligen DHCP-strukturen:

DHCPUPPTÄCK

SÄ processen att erhÄlla en IP-adress för en enhet börjar med att DHCP-klienten skickar en sÀndningsförfrÄgan frÄn port 68 till 255.255.255.255:67. I detta paket inkluderar klienten sin MAC-adress, samt vad den exakt vill ta emot frÄn DHCP-servern. Paketstrukturen beskrivs i tabellen nedan.

DHCPDISCOVER Paketstrukturtabell

Position i förpackningen
VĂ€rdenamn
Exempel
idé
bitgrupp
klargörande

1
StartbegÀran
1
Hex
1
Meddelandetyp. 1 - begÀran frÄn klient till server, 2 - svar frÄn server till klient

2
HÄrdvarutyp
1
Hex
1
Typ av hÄrdvaruadress, i detta protokoll 1 - MAC

3
HÄrdvaruadressers lÀngd
6
Hex
1
Enhetens MAC-adress lÀngd

4
Humle
1
Hex
1
Antal mellanvÀgar

5
Transaktions ID
23:cf:de:1d
Hex
4
Unik transaktionsidentifierare. Genereras av klienten i början av en begÀran

7
Andra förflutit
0
Hex
4
Tid i sekunder frÄn början av processen att erhÄlla en adress

9
Boot flaggor
0
Hex
2
Vissa flaggor som kan stÀllas in för att indikera protokollparametrar

11
Klientens IP-adress
0.0.0.0
Linje
4
Klientens IP-adress (om nÄgon)

15
Din klients IP-adress
0.0.0.0
Linje
4
IP-adress som erbjuds av servern (om tillgÀnglig)

19
NĂ€sta server IP-adress
0.0.0.0
Linje
4
Serverns IP-adress (om kÀnd)

23
RelÀagentens IP-adress
172.16.114.41
Linje
4
IP-adress för relÀagenten (till exempel en switch)

27
Klientens MAC-adress
14:d6:4d:a7:c9:55
Hex
6
MAC-adress för paketavsÀndaren (klienten)

31
Adressutfyllnad för klienthÄrdvara
 
Hex
10
Reserverat sÀte. Vanligtvis fylld med nollor

41
Serverns vÀrdnamn
 
Linje
64
DHCP-servernamn. Överförs vanligtvis inte

105
Startfilens namn
 
Linje
128
Filnamn pÄ servern som anvÀnds av disklösa stationer vid uppstart

235
Magisk kaka
63: 82: 53: 63
Hex
4
"Magiskt" nummer, enligt vilket, inkl. du kan faststÀlla att detta paket tillhör DHCP-protokollet

DHCP-alternativ. Kan gÄ i vilken ordning som helst

236
Alternativnummer
53
december
1
Alternativ 53, som specificerar DHCP-pakettypen

1 - DHCPUPPTÄCK
3 - DHCPREQUEST
2 - DHCPERBJUDANDE
5 - DHCPACK
8 - DHCPINFORM

 
Alternativ lÀngd
1
december
1

 
OptionsvÀrde
1
december
1

 
Alternativnummer
50
december
1
Vilken IP-adress vill klienten fÄ?

 
Alternativ lÀngd
4
december
1

 
OptionsvÀrde
172.16.134.61
Linje
4

 
Alternativnummer
55
 
1
NÀtverksparametrar som begÀrs av klienten. SammansÀttningen kan variera

01 — NĂ€tverksmask
03 - Gateway
06 - DNS
oc — VĂ€rdnamn
0f - nÀtverksdomÀnnamn
1c - adress för sÀndningsbegÀran (sÀndning)
42 - TFTP-servernamn
79 - Klasslös statisk vÀg

 
Alternativ lÀngd
8
 
1

 
OptionsvÀrde
01:03:06:0c:0f:1c:42:79
 
8

 
Alternativnummer
82
december
 
Alternativ 82, som sÀnder MAC-adressen för repeaterenheten och nÄgra ytterligare vÀrden.

Oftast Àr detta porten för switchen som slut-DHCP-klienten körs pÄ. Det hÀr alternativet innehÄller ytterligare parametrar. Den första byten Àr numret pÄ "underalternativet", den andra Àr dess lÀngd, sedan dess vÀrde.

I det hÀr fallet, i alternativ 82, Àr underalternativen kapslade:
Agentkrets-ID = 00:04:00:01:00:04, dÀr de tvÄ sista byten Àr DHCP-klientporten frÄn vilken begÀran kom

Agent Remote ID = 00:06:c8:be:19:93:11:48 - MAC-adress för DHCP-repeaterenheten

 
Alternativ lÀngd
18
december
 

 
OptionsvÀrde
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Slutet pÄ paketet
255
december
1
255 symboliserar slutet pÄ paketet

DHCPERBJUDANDE

SÄ snart servern tar emot DHCPDISCOVER-paketet och om den ser att den kan erbjuda klienten nÄgot frÄn den begÀrda, genererar den ett svar för det - DHCPDISCOVER. Svaret skickas till hamnen "dÀr det kom ifrÄn", via sÀndning, eftersom för nÀrvarande har klienten Ànnu ingen IP-adress, dÀrför kan den bara acceptera paketet om det skickas via broadcast. Klienten kÀnner igen att detta Àr ett paket för honom genom sin MAC-adress inuti paketet, sÄvÀl som transaktionsnumret som han genererar nÀr det första paketet skapas.

DHCPOFFER Paketstrukturtabell

Position i förpackningen
VĂ€rdenamn (vanligt)
Exempel
idé
bitgrupp
klargörande

1
StartbegÀran
1
Hex
1
Meddelandetyp. 1 - begÀran frÄn klient till server, 2 - svar frÄn server till klient

2
HÄrdvarutyp
1
Hex
1
Typ av hÄrdvaruadress, i detta protokoll 1 - MAC

3
HÄrdvaruadressers lÀngd
6
Hex
1
Enhetens MAC-adress lÀngd

4
Humle
1
Hex
1
Antal mellanvÀgar

5
Transaktions ID
23:cf:de:1d
Hex
4
Unik transaktionsidentifierare. Genereras av klienten i början av en begÀran

7
Andra förflutit
0
Hex
4
Tid i sekunder frÄn början av processen att erhÄlla en adress

9
Boot flaggor
0
Hex
2
Vissa flaggor som kan stÀllas in för att indikera protokollparametrar. I det hÀr fallet betyder 0 typen Unicast-begÀran

11
Klientens IP-adress
0.0.0.0
Linje
4
Klientens IP-adress (om nÄgon)

15
Din klients IP-adress
172.16.134.61
Linje
4
IP-adress som erbjuds av servern (om tillgÀnglig)

19
NĂ€sta server IP-adress
0.0.0.0
Linje
4
Serverns IP-adress (om kÀnd)

23
RelÀagentens IP-adress
172.16.114.41
Linje
4
IP-adress för relÀagenten (till exempel en switch)

27
Klientens MAC-adress
14:d6:4d:a7:c9:55
Hex
6
MAC-adress för paketavsÀndaren (klienten)

31
Adressutfyllnad för klienthÄrdvara
 
Hex
10
Reserverat sÀte. Vanligtvis fylld med nollor

41
Serverns vÀrdnamn
 
Linje
64
DHCP-servernamn. Överförs vanligtvis inte

105
Startfilens namn
 
Linje
128
Filnamn pÄ servern som anvÀnds av disklösa stationer vid uppstart

235
Magisk kaka
63: 82: 53: 63
Hex
4
"Magiskt" nummer, enligt vilket, inkl. du kan faststÀlla att detta paket tillhör DHCP-protokollet

DHCP-alternativ. Kan gÄ i vilken ordning som helst

236
Alternativnummer
53
december
1
Alternativ 53, som definierar pakettypen DHCP 2 - DHCPOFFER

 
Alternativ lÀngd
1
december
1

 
OptionsvÀrde
2
december
1

 
Alternativnummer
1
december
1
Möjlighet att erbjuda DHCP-klienten en nÀtverksmask

 
Alternativ lÀngd
4
december
1

 
OptionsvÀrde
255.255.224.0
Linje
4

 
Alternativnummer
3
december
1
Möjlighet att erbjuda DHCP-klienten en standardgateway

 
Alternativ lÀngd
4
december
1

 
OptionsvÀrde
172.16.12.1
Linje
4

 
Alternativnummer
6
december
1
Möjlighet att erbjuda DHCP till DNS-klient

 
Alternativ lÀngd
4
december
1

 
OptionsvÀrde
8.8.8.8
Linje
4

 
Alternativnummer
51
december
1
LivslÀngden för de utfÀrdade nÀtverksparametrarna i sekunder, varefter DHCP-klienten mÄste begÀra dem igen

 
Alternativ lÀngd
4
december
1

 
OptionsvÀrde
86400
december
4

 
Alternativnummer
82
december
1
Alternativ 82, upprepar det som kom i DHCPDISCOVER

 
Alternativ lÀngd
18
december
1

 
OptionsvÀrde
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
december
18

 
Slutet pÄ paketet
255
december
1
255 symboliserar slutet pÄ paketet

DHC -FÖRFRÅGA

Efter att klienten tagit emot DHCPOFFER, bildar han ett paket som begÀr nÀtverksparametrar inte till alla DHCP-servrar i nÀtverket, utan bara till en specifik, vars DHCPOFFER-erbjudande han "gillade" mest. "Gilla"-kriterierna kan vara olika och beror pÄ klientens DHCP-implementering. Mottagaren av begÀran anges med MAC-adressen för DHCP-servern. Dessutom kan ett DHCPREQUEST-paket skickas av klienten utan att först generera DHCPDISCOVER, om serverns IP-adress redan har erhÄllits tidigare.

DHCPREQUEST Paketstrukturtabell

Position i förpackningen
VĂ€rdenamn (vanligt)
Exempel
idé
bitgrupp
klargörande

1
StartbegÀran
1
Hex
1
Meddelandetyp. 1 - begÀran frÄn klient till server, 2 - svar frÄn server till klient

2
HÄrdvarutyp
1
Hex
1
Typ av hÄrdvaruadress, i detta protokoll 1 - MAC

3
HÄrdvaruadressers lÀngd
6
Hex
1
Enhetens MAC-adress lÀngd

4
Humle
1
Hex
1
Antal mellanvÀgar

5
Transaktions ID
23:cf:de:1d
Hex
4
Unik transaktionsidentifierare. Genereras av klienten i början av en begÀran

7
Andra förflutit
0
Hex
4
Tid i sekunder frÄn början av processen att erhÄlla en adress

9
Boot flaggor
8000
Hex
2
Vissa flaggor som kan stÀllas in för att indikera protokollparametrar. I det hÀr fallet Àr "sÀndning" instÀlld

11
Klientens IP-adress
0.0.0.0
Linje
4
Klientens IP-adress (om nÄgon)

15
Din klients IP-adress
172.16.134.61
Linje
4
IP-adress som erbjuds av servern (om tillgÀnglig)

19
NĂ€sta server IP-adress
0.0.0.0
Linje
4
Serverns IP-adress (om kÀnd)

23
RelÀagentens IP-adress
172.16.114.41
Linje
4
IP-adress för relÀagenten (till exempel en switch)

27
Klientens MAC-adress
14:d6:4d:a7:c9:55
Hex
6
MAC-adress för paketavsÀndaren (klienten)

31
Adressutfyllnad för klienthÄrdvara
 
Hex
10
Reserverat sÀte. Vanligtvis fylld med nollor

41
Serverns vÀrdnamn
 
Linje
64
DHCP-servernamn. Överförs vanligtvis inte

105
Startfilens namn
 
Linje
128
Filnamn pÄ servern som anvÀnds av disklösa stationer vid uppstart

235
Magisk kaka
63: 82: 53: 63
Hex
4
"Magiskt" nummer, enligt vilket, inkl. du kan faststÀlla att detta paket tillhör DHCP-protokollet

DHCP-alternativ. Kan gÄ i vilken ordning som helst

236
Alternativnummer
53
december
3
Alternativ 53, som definierar DHCP-pakettyp 3 - DHCPREQUEST

 
Alternativ lÀngd
1
december
1

 
OptionsvÀrde
3
december
1

 
Alternativnummer
61
december
1
Klient-ID: 01 (för Ehernet) + klientens MAC-adress

 
Alternativ lÀngd
7
december
1

 
OptionsvÀrde
01:2c:ab:25:ff:72:a6
Hex
7

 
Alternativnummer
60
december
 
"Leverantörsklassidentifierare." I mitt fall rapporterar den DHCP-klientversionen. Andra enheter kan returnera nÄgot annat. Windows till exempel MSFT 5.0-rapporter

 
Alternativ lÀngd
11
december
 

 
OptionsvÀrde
udhcp 0.9.8
Linje
 

 
Alternativnummer
55
 
1
NÀtverksparametrar som begÀrs av klienten. SammansÀttningen kan variera

01 — NĂ€tverksmask
03 - Gateway
06 - DNS
oc — VĂ€rdnamn
0f - nÀtverksdomÀnnamn
1c - adress för sÀndningsbegÀran (sÀndning)
42 - TFTP-servernamn
79 - Klasslös statisk vÀg

 
Alternativ lÀngd
8
 
1

 
OptionsvÀrde
01:03:06:0c:0f:1c:42:79
 
8

 
Alternativnummer
82
december
1
Alternativ 82, upprepar det som kom i DHCPDISCOVER

 
Alternativ lÀngd
18
december
1

 
OptionsvÀrde
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
december
18

 
Slutet pÄ paketet
255
december
1
255 symboliserar slutet pÄ paketet

DHCPACK

Som bekrĂ€ftelse pĂ„ att "ja, det stĂ€mmer, det hĂ€r Ă€r din IP-adress, och jag kommer inte att ge ut den till nĂ„gon annan" frĂ„n DHCP-servern, serverar ett paket i DHCPACK-format frĂ„n servern till klienten. Det skickas som broadcast precis som andra paket. Även om jag i koden nedan för en DHCP-server implementerad i Python, för sĂ€kerhets skull, duplicerar en sĂ€ndningsförfrĂ„gan genom att skicka ett paket till en specifik klient-IP, om den redan Ă€r kĂ€nd. Dessutom bryr sig DHCP-servern inte alls om DHCPACK-paketet har nĂ„tt klienten. Om klienten inte tar emot DHCPACK, upprepar den efter ett tag helt enkelt DHCPREQUEST

DHCPACK-paketstrukturtabell

Position i förpackningen
VĂ€rdenamn (vanligt)
Exempel
idé
bitgrupp
klargörande

1
StartbegÀran
2
Hex
1
Meddelandetyp. 1 - begÀran frÄn klient till server, 2 - svar frÄn server till klient

2
HÄrdvarutyp
1
Hex
1
Typ av hÄrdvaruadress, i detta protokoll 1 - MAC

3
HÄrdvaruadressers lÀngd
6
Hex
1
Enhetens MAC-adress lÀngd

4
Humle
1
Hex
1
Antal mellanvÀgar

5
Transaktions ID
23:cf:de:1d
Hex
4
Unik transaktionsidentifierare. Genereras av klienten i början av en begÀran

7
Andra förflutit
0
Hex
4
Tid i sekunder frÄn början av processen att erhÄlla en adress

9
Boot flaggor
8000
Hex
2
Vissa flaggor som kan stÀllas in för att indikera protokollparametrar. I det hÀr fallet Àr "sÀndning" instÀlld

11
Klientens IP-adress
0.0.0.0
Linje
4
Klientens IP-adress (om nÄgon)

15
Din klients IP-adress
172.16.134.61
Linje
4
IP-adress som erbjuds av servern (om tillgÀnglig)

19
NĂ€sta server IP-adress
0.0.0.0
Linje
4
Serverns IP-adress (om kÀnd)

23
RelÀagentens IP-adress
172.16.114.41
Linje
4
IP-adress för relÀagenten (till exempel en switch)

27
Klientens MAC-adress
14:d6:4d:a7:c9:55
Hex
6
MAC-adress för paketavsÀndaren (klienten)

31
Adressutfyllnad för klienthÄrdvara
 
Hex
10
Reserverat sÀte. Vanligtvis fylld med nollor

41
Serverns vÀrdnamn
 
Linje
64
DHCP-servernamn. Överförs vanligtvis inte

105
Startfilens namn
 
Linje
128
Filnamn pÄ servern som anvÀnds av disklösa stationer vid uppstart

235
Magisk kaka
63: 82: 53: 63
Hex
4
"Magiskt" nummer, enligt vilket, inkl. du kan faststÀlla att detta paket tillhör DHCP-protokollet

DHCP-alternativ. Kan gÄ i vilken ordning som helst

236
Alternativnummer
53
december
3
Alternativ 53, som definierar DHCP-pakettyp 5 - DHCPACK

 
Alternativ lÀngd
1
december
1

 
OptionsvÀrde
5
december
1

 
Alternativnummer
1
december
1
Möjlighet att erbjuda DHCP-klienten en nÀtverksmask

 
Alternativ lÀngd
4
december
1

 
OptionsvÀrde
255.255.224.0
Linje
4

 
Alternativnummer
3
december
1
Möjlighet att erbjuda DHCP-klienten en standardgateway

 
Alternativ lÀngd
4
december
1

 
OptionsvÀrde
172.16.12.1
Linje
4

 
Alternativnummer
6
december
1
Möjlighet att erbjuda DHCP till DNS-klient

 
Alternativ lÀngd
4
december
1

 
OptionsvÀrde
8.8.8.8
Linje
4

 
Alternativnummer
51
december
1
LivslÀngden för de utfÀrdade nÀtverksparametrarna i sekunder, varefter DHCP-klienten mÄste begÀra dem igen

 
Alternativ lÀngd
4
december
1

 
OptionsvÀrde
86400
december
4

 
Alternativnummer
82
december
1
Alternativ 82, upprepar det som kom i DHCPDISCOVER

 
Alternativ lÀngd
18
december
1

 
OptionsvÀrde
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
december
18

 
Slutet pÄ paketet
255
december
1
255 symboliserar slutet pÄ paketet

Installation

Installationen bestÄr egentligen av att installera de pythonmoduler som behövs för arbetet. Det antas att MySQL redan Àr installerat och konfigurerat.

FreeBSD

pkg installera python3 python3 -m surepip pip3 installera mysql-connector

Ubuntu

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

Vi skapar en MySQL-databas, laddar upp pydhcp.sql-dumpen till den och konfigurerar konfigurationsfilen.

konfiguration

Alla serverinstÀllningar finns i en xml-fil. Referensfil:

1.0 0.0.0.0 255.255.255.255 192.168.0.71 8600 1 255.255.255.0 192.168.0.1 lokal vÀrd testa testa 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Àlj ip,mask,router,dns frÄn anvÀndare dÀr upper(mac)=upper('{option_3_AgentRemoteId_hex}') och upper(port)=upper('{option_1_AgentCircuitId_port_hex}') vÀlj ip,mask,router,dns frÄn anvÀndare dÀr upper(mac)=upper('{sw_mac}') och upper(port)=upper('{sw_port82}') vÀlj ip,mask,router,dns frÄn anvÀndare dÀr upper(mac)=upper('{ClientMacAddress}') infoga vÀrden i historik (id,dt,mac,ip,comment) (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Nu mer detaljerat om taggarna:

Avsnittet dhcpserver beskriver de grundlÀggande instÀllningarna för att starta servern, nÀmligen:

  • vĂ€rd - vilken IP-adress servern lyssnar pĂ„ pĂ„ port 67
  • broadcast - vilken ip Ă€r sĂ€ndningen för DHCPOFFER och DHCPACK
  • DHCPServer - vad Ă€r IP-adressen för DHCP-servern
  • LeaseTime leasingtid för den utfĂ€rdade IP-adressen
  • ThreadLimit - hur mĂ„nga trĂ„dar körs samtidigt för att bearbeta inkommande UDP-paket pĂ„ port 67. Det Ă€r tĂ€nkt att hjĂ€lpa till i högbelastningsprojekt 😉
  • defaultMask,defaultRouter,defaultDNS - vad som erbjuds abonnenten som standard om en IP hittas i databasen, men ytterligare parametrar Ă€r inte specificerade för den

mysql avsnitt:

vÀrd, anvÀndarnamn, lösenord, basnamn - allt talar för sig sjÀlv. En ungefÀrlig databasstruktur publiceras pÄ GitHub

FrÄgeavsnitt: förfrÄgningar om att ta emot ERBJUDANDE/ACK beskrivs hÀr:

  • offer_count — antalet rader med förfrĂ„gningar som returnerar ett resultat som ip,mask,router,dns
  • offer_n — frĂ„gestrĂ€ng. Om returen Ă€r tom, utförs följande erbjudandeförfrĂ„gan
  • history_sql - en frĂ„ga som till exempel skriver till "auktoriseringshistoriken" för en prenumerant

FörfrÄgningar kan inkludera alla variabler frÄn alternativsektionen eller alternativ frÄn DHCP-protokollet.

Avsnittet Alternativ. Det Àr hÀr det blir mer intressant. HÀr kan vi skapa variabler som vi kan anvÀnda senare i frÄgeavsnittet.

Till exempel:

option_82_hex:sw_port1:20:22

, tar denna kommandorad hela raden som kom i DHCP-begÀran alternativ 82, i hex-format, i intervallet frÄn 20 till 22 byte inklusive och placerar den i den nya variabeln sw_port1 (vÀxelport dÀr begÀran kom)

option_82_hex:sw_mac:26:40

, definiera variabeln sw_mac, ta hex frÄn intervallet 26:40

Du kan se alla möjliga alternativ som kan anvÀndas i frÄgor genom att starta servern med -d-vÀxeln. Vi kommer att se nÄgot sÄnt hÀr:

--ett DHCPINFORM-paket anlÀnde till port 67, frÄn 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress': 'b'ClientMacAddress': '0025224teMac 764 00%"Jxd7d' , 'Htype': 'Ethernet', 'HostName': B'x91xa5xe0xa3xa5xa9-x8fx8a ',' reqlistdns ': True,' reqlistdomaName ': true,' reqlistperfowmrouerdiscover ' 'ReqListSubnetM ask ': True, 'ReqListVendorSpecInfo': 43, 'RequestedIpAddress': '0.0.0.0', 'Vendor': b'MSFT 5.0', 'chaddr': '0025224ad764', 'ciaddr'.172.30.128.13'.00'. , 'flags': 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': '589e2 _82_len': 18 82, 'option_12_str': "b'x01x06x00x04x00x01x00x06x02x08x00x06x00x1x9eXx2exb768xad'", 'result': False, 'secs': 0.0.0.0 'siaddr': '001', 'sw_mac': '589e2eb1ad', 'sw_port06': '89', 'xidbyte': b'

Följaktligen kan vi linda vilken variabel som helst i {} och den kommer att anvÀndas i SQL-frÄgan.

LÄt oss registrera för historik att klienten fick IP-adressen:

DHCP+Mysql-server i Python

DHCP+Mysql-server i Python

Startar servern

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

— d konsolutgĂ„ngslĂ€ge DEBUG
- c <filnamn> konfigurationsfil

Briefing

Och nu mer information om implementering av servern i Python. Det Àr en smÀrta. Python lÀrdes in i farten. MÄnga ögonblick Àr gjorda i stil med "wow, pÄ nÄgot sÀtt fick jag det att fungera." Inte optimerad alls, och kvar i denna form frÀmst pÄ grund av liten erfarenhet av Python-utveckling. Jag kommer att uppehÄlla mig vid de mest intressanta aspekterna av serverimplementeringen i "kod".

XML konfigurationsfil parser

Standard Python-modulen xml.dom anvÀnds. Det verkar enkelt, men under implementeringen var det en mÀrkbar brist pÄ tydlig dokumentation och exempel pÄ nÀtverket med denna modul.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") för elem i mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firstChild. gconfig["mysql_username"]=elem.getElementsByTagName("anvÀndarnamn")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("lösenord")[0].firstChild.data gconfig_basenamesq] =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") för elem i 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"]defaultMacsk"default =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDgetElement"]=seBlemyTagElement defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") för elem i qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild.data för num in 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("options") för elem i optioner: node=elem.getElementsByTagName("option") för alternativ i nod : optionsMod.append(options.firstChild.data)

Multithreading

MÀrkligt nog Àr multithreading i Python implementerat vÀldigt tydligt och enkelt.

def PacketWork(data,addr): ... # implementering av att analysera det inkommande paketet och svara pÄ det ... medan True: data, addr = udp_socket.recvfrom(1024) # vÀntar pÄ UDP-pakettrÄden = threading.Thread( target=PacketWork , args=(data,addr,)).start() # som det kom - vi startar den tidigare definierade PacketWork-funktionen i bakgrunden med parametrar medan threading.active_count() >gconfig["dhcp_ThreadLimit"]: tid. sleep(1) # om numret Det finns fler trÄdar som redan körs Àn i instÀllningarna, vi vÀntar tills det finns fÀrre av dem

Ta emot/skicka DHCP-paket

För att fÄnga upp UDP-paket som kommer genom nÀtverkskortet mÄste du "höja" uttaget:

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

, dÀr flaggorna Àr:

  • AF_INET - betyder att adressformatet kommer att vara IP: port. Det kan ocksĂ„ finnas AF_UNIX - dĂ€r adressen ges av filnamnet.
  • SOCK_DGRAM - betyder att vi inte accepterar ett "rĂ„paket", utan ett som redan har passerat genom brandvĂ€ggen och med ett delvis trimmat paket. De dĂ€r. vi tar bara emot ett UDP-paket utan den "fysiska" komponenten i UDP-paketomslaget. Om du anvĂ€nder SOCK_RAW-flaggan mĂ„ste du ocksĂ„ analysera denna "wrapper".

Att skicka ett paket kan vara som en sÀndning:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #vÀxla socket till broadcast-lÀge rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

, och till adressen "varifrÄn paketet kom":

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # byt uttaget till multilyssnarlÀge rz=udp_socket.sendto(packetack, addr)

, dÀr SOL_SOCKET betyder "protokollnivÄn" för instÀllningsalternativ,

, SO_BROADCAST alternativ att hjÀlmpaketet Àr "broadcast"

  ,SO_REUSEADDR-alternativet vĂ€xlar uttaget till "mĂ„nga lyssnare"-lĂ€ge. I teorin Ă€r det onödigt i det hĂ€r fallet, men pĂ„ en av FreeBSD-servrarna som jag testade pĂ„ fungerade inte koden utan detta alternativ.

Parsar ett DHCP-paket

Det var hÀr jag verkligen gillade Python. Det visar sig att ur lÄdan lÄter det dig vara ganska flexibel med bytekoden. LÄter det mycket enkelt översÀttas till decimalvÀrden, strÀngar och hex - d.v.s. detta Àr vad vi faktiskt behöver för att förstÄ paketets struktur. SÄ, till exempel, kan du fÄ en rad byte i HEX och bara byte:

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

, packa byten i en struktur:

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

FÄ IP frÄn struktur:

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

Och vice versa:

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

Det var allt för nu 😉

KĂ€lla: will.com

Köp pĂ„litlig hosting för webbplatser med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster