DHCP+Mysql server v Pythone

DHCP+Mysql server v Pythone

Účelom tohto projektu bolo:

  • Informácie o DHCP v sieti IPv4
  • Učenie Pythonu (trochu viac ako od nuly 😉)
  • výmena servera DB2DHCP (moja vidlička), originál tu, ktorého montáž pre nový OS je čoraz náročnejšia. A nepáči sa mi, že je to binárne číslo, ktoré nie je možné „zmeniť hneď teraz“
  • získanie funkčného servera DHCP s možnosťou vybrať si IP adresu predplatiteľa pomocou kombinácie mac alebo switch mac+port (možnosť 82)
  • písanie ďalšieho bicykla (Oh! toto je moja obľúbená činnosť)
  • prijímanie komentárov o tvojej klubovosti na Habrahabr (alebo ešte lepšie, pozvánka) 😉

Výsledok: funguje 😉 Testované na OS FreeBSD a Ubuntu. Teoreticky môže byť kód požiadaný, aby fungoval pod akýmkoľvek OS, pretože Zdá sa, že v kóde nie sú žiadne špecifické väzby.
Opatrne! Je toho ešte veľa.

Odkaz na úložisko pre amatérov "dotknúť sa nažive".

Proces inštalácie, konfigurácie a používania výsledku „štúdia hardvéru“ je oveľa nižší a potom trochu teórie o protokole DHCP. Pre mňa. A k histórii 😉

Trochu teórie

Čo je DHCP

Toto je sieťový protokol, ktorý umožňuje zariadeniu zistiť svoju IP adresu (a ďalšie parametre, ako je brána, DNS atď.) zo servera DHCP. Pakety sa vymieňajú pomocou protokolu UDP. Všeobecný princíp fungovania zariadenia pri požadovaní sieťových parametrov je nasledovný:

  1. Zariadenie (klient) odošle požiadavku vysielania UDP (DHCPDISCOVER) do celej siete s požiadavkou „no, dajte mi niekto IP adresu“. Okrem toho zvyčajne (ale nie vždy) požiadavka prichádza z portu 68 (zdroj) a cieľom je port 67 (cieľ). Niektoré zariadenia tiež odosielajú pakety z portu 67. MAC adresa klientskeho zariadenia je zahrnutá v pakete DHCPDISCOVER.
  2. Všetky servery DHCP umiestnené v sieti (a môže ich byť niekoľko) tvoria ponuku DHCPOFFER so sieťovými nastaveniami pre zariadenie, ktoré odoslalo DHCPDISCOVER, a tiež ju vysielajú cez sieť. Identifikácia toho, komu je tento paket určený, je založená na MAC adrese klienta uvedenej skôr v požiadavke DHCPDISCOVER.
  3. Klient prijme pakety s návrhmi sieťových nastavení, vyberie ten najatraktívnejšie (kritériá môžu byť odlišné, napr. čas doručenia paketu, počet medziľahlých trás) a zadá „oficiálnu požiadavku“ DHCPREQUEST so sieťovými nastaveniami. zo servera DHCP, ktorý sa mu páči. V tomto prípade ide paket na konkrétny server DHCP.
  4. Server, ktorý prijal DHCPREQUEST, odošle paket vo formáte DHCPACK, v ktorom ešte raz vypíše sieťové nastavenia určené pre tohto klienta.

DHCP+Mysql server v Pythone

Okrem toho existujú pakety DHCPINFORM, ktoré prichádzajú od klienta a ktorých účelom je informovať server DHCP, že „klient je nažive“ a používa vydané nastavenia siete. V implementácii tohto servera sú tieto pakety ignorované.

Formát balíka

Rámec ethernetového paketu vo všeobecnosti vyzerá takto:

DHCP+Mysql server v Pythone

V našom prípade budeme brať do úvahy iba údaje priamo z obsahu paketu UDP, bez hlavičiek protokolu vrstvy OSI, konkrétne štruktúry DHCP:

DHCPDISCOVER

Proces získania IP adresy pre zariadenie teda začína tým, že klient DHCP odošle požiadavku na vysielanie z portu 68 na 255.255.255.255:67. V tomto balíku klient obsahuje svoju MAC adresu, ako aj to, čo presne chce dostať zo servera DHCP. Štruktúra balíka je opísaná v tabuľke nižšie.

Tabuľka štruktúry paketov DHCPDISCOVER

Poloha v balení
Názov hodnoty
Príklad
idea
byte
objasnenie

1
Požiadavka na spustenie
1
Hex
1
Typ správy. 1 - požiadavka od klienta na server, 2 - odpoveď zo servera na klienta

2
Typ hardvéru
1
Hex
1
Typ hardvérovej adresy, v tomto protokole 1 - MAC

3
Dĺžka hardvérových adries
6
Hex
1
Dĺžka MAC adresy zariadenia

4
Chmeľ
1
Hex
1
Počet medziľahlých trás

5
ID transakcie
23:cf:de:1d
Hex
4
Jedinečný identifikátor transakcie. Vygenerované klientom na začiatku operácie požiadavky

7
Uplynula druhá
0
Hex
4
Čas v sekundách od začiatku procesu získavania adresy

9
Bootovacie vlajky
0
Hex
2
Určité príznaky, ktoré možno nastaviť na označenie parametrov protokolu

11
IP adresa klienta
0.0.0.0
Riadok
4
IP adresa klienta (ak existuje)

15
IP adresa vášho klienta
0.0.0.0
Riadok
4
IP adresa ponúkaná serverom (ak je k dispozícii)

19
IP adresa nasledujúceho servera
0.0.0.0
Riadok
4
IP adresa servera (ak je známa)

23
IP adresa prenosového agenta
172.16.114.41
Riadok
4
IP adresa prenosového agenta (napríklad prepínača)

27
MAC adresa klienta
14:d6:4d:a7:c9:55
Hex
6
MAC adresa odosielateľa paketu (klienta)

31
Výplň hardvérovej adresy klienta
 
Hex
10
Rezervované miesto. Zvyčajne vyplnené nulami

41
Názov hostiteľa servera
 
Riadok
64
názov servera DHCP. Zvyčajne sa neprenáša

105
Názov zavádzacieho súboru
 
Riadok
128
Názov súboru na serveri, ktorý používajú bezdiskové stanice pri bootovaní

235
Magické koláčiky
63: 82: 53: 63
Hex
4
„Magické“ číslo, podľa ktorého vr. môžete určiť, že tento paket patrí do protokolu DHCP

možnosti DHCP. Môže ísť v akomkoľvek poradí

236
Číslo možnosti
53
Prosince
1
Možnosť 53, ktorá určuje typ paketu DHCP

1 - DHCPDISCOVER
3 - POŽIADAVKA DHCP
2 - PONUKA DHCP
5 - DHCPACK
8 - DHCPINFORM

 
Dĺžka možnosti
1
Prosince
1

 
Hodnota možnosti
1
Prosince
1

 
Číslo možnosti
50
Prosince
1
Akú IP adresu chce klient dostať?

 
Dĺžka možnosti
4
Prosince
1

 
Hodnota možnosti
172.16.134.61
Riadok
4

 
Číslo možnosti
55
 
1
Parametre siete požadované klientom. Zloženie sa môže líšiť

01 — Maska siete
03 - Brána
06 - DNS
oc — Názov hostiteľa
0f - názov sieťovej domény
1c - adresa žiadosti o vysielanie (vysielanie)
42 - Názov servera TFTP
79 - Beztriedna statická cesta

 
Dĺžka možnosti
8
 
1

 
Hodnota možnosti
01:03:06:0c:0f:1c:42:79
 
8

 
Číslo možnosti
82
Prosince
 
Možnosť 82, ktorá prenáša MAC adresu opakovacieho zariadenia a niektoré ďalšie hodnoty.

Najčastejšie ide o port switchu, na ktorom beží koncový DHCP klient.Táto voľba obsahuje ďalšie parametre.Prvý bajt je číslo „podvoľby“, druhý je jej dĺžka a potom hodnota.

V tomto prípade sú v možnosti 82 vnorené podmožnosti:
ID okruhu agenta = 00:04:00:01:00:04, kde posledné dva bajty sú port klienta DHCP, z ktorého prišla požiadavka

ID vzdialeného agenta = 00:06:c8:be:19:93:11:48 - MAC adresa zariadenia DHCP repeater

 
Dĺžka možnosti
18
Prosince
 

 
Hodnota možnosti
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Koniec balenia
255
Prosince
1
255 symbolizuje koniec paketu

DHCPOFFER

Akonáhle server prijme paket DHCPDISCOVER a ak vidí, že môže klientovi niečo ponúknuť z požadovaného, ​​vygeneruje naň odpoveď - DHCPDISCOVER. Odpoveď je odoslaná na port „odkiaľ prišla“ prostredníctvom vysielania, pretože v tomto momente klient ešte nemá IP adresu, preto môže akceptovať paket, len ak je odoslaný broadcastom. Klient spozná, že ide o balík pre neho, podľa MAC adresy vo vnútri balíka, ako aj čísla transakcie, ktoré si vygeneruje pri vytvorení prvého balíka.

Tabuľka štruktúry paketov DHCPOFFER

Poloha v balení
Názov hodnoty (bežný)
Príklad
idea
byte
objasnenie

1
Požiadavka na spustenie
1
Hex
1
Typ správy. 1 - požiadavka od klienta na server, 2 - odpoveď zo servera na klienta

2
Typ hardvéru
1
Hex
1
Typ hardvérovej adresy, v tomto protokole 1 - MAC

3
Dĺžka hardvérových adries
6
Hex
1
Dĺžka MAC adresy zariadenia

4
Chmeľ
1
Hex
1
Počet medziľahlých trás

5
ID transakcie
23:cf:de:1d
Hex
4
Jedinečný identifikátor transakcie. Vygenerované klientom na začiatku operácie požiadavky

7
Uplynula druhá
0
Hex
4
Čas v sekundách od začiatku procesu získavania adresy

9
Bootovacie vlajky
0
Hex
2
Určité príznaky, ktoré možno nastaviť na označenie parametrov protokolu. V tomto prípade 0 znamená typ požiadavky Unicast

11
IP adresa klienta
0.0.0.0
Riadok
4
IP adresa klienta (ak existuje)

15
IP adresa vášho klienta
172.16.134.61
Riadok
4
IP adresa ponúkaná serverom (ak je k dispozícii)

19
IP adresa nasledujúceho servera
0.0.0.0
Riadok
4
IP adresa servera (ak je známa)

23
IP adresa prenosového agenta
172.16.114.41
Riadok
4
IP adresa prenosového agenta (napríklad prepínača)

27
MAC adresa klienta
14:d6:4d:a7:c9:55
Hex
6
MAC adresa odosielateľa paketu (klienta)

31
Výplň hardvérovej adresy klienta
 
Hex
10
Rezervované miesto. Zvyčajne vyplnené nulami

41
Názov hostiteľa servera
 
Riadok
64
názov servera DHCP. Zvyčajne sa neprenáša

105
Názov zavádzacieho súboru
 
Riadok
128
Názov súboru na serveri, ktorý používajú bezdiskové stanice pri bootovaní

235
Magické koláčiky
63: 82: 53: 63
Hex
4
„Magické“ číslo, podľa ktorého vr. môžete určiť, že tento paket patrí do protokolu DHCP

možnosti DHCP. Môže ísť v akomkoľvek poradí

236
Číslo možnosti
53
Prosince
1
Možnosť 53, ktorá definuje typ paketu DHCP 2 - DHCPOFFER

 
Dĺžka možnosti
1
Prosince
1

 
Hodnota možnosti
2
Prosince
1

 
Číslo možnosti
1
Prosince
1
Možnosť ponúknuť klientovi DHCP masku siete

 
Dĺžka možnosti
4
Prosince
1

 
Hodnota možnosti
255.255.224.0
Riadok
4

 
Číslo možnosti
3
Prosince
1
Možnosť ponúknuť klientovi DHCP predvolenú bránu

 
Dĺžka možnosti
4
Prosince
1

 
Hodnota možnosti
172.16.12.1
Riadok
4

 
Číslo možnosti
6
Prosince
1
Možnosť ponúknuť DHCP klientovi DNS

 
Dĺžka možnosti
4
Prosince
1

 
Hodnota možnosti
8.8.8.8
Riadok
4

 
Číslo možnosti
51
Prosince
1
Životnosť vydaných sieťových parametrov v sekundách, po ktorých si ich musí klient DHCP vyžiadať znova

 
Dĺžka možnosti
4
Prosince
1

 
Hodnota možnosti
86400
Prosince
4

 
Číslo možnosti
82
Prosince
1
Možnosť 82 zopakuje to, čo prišlo v DHCPDISCOVER

 
Dĺžka možnosti
18
Prosince
1

 
Hodnota možnosti
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Prosince
18

 
Koniec balenia
255
Prosince
1
255 symbolizuje koniec paketu

DHCPREQUEST

Potom, čo klient prijme DHCPOFFER, vytvorí paket požadujúci sieťové parametre nie na všetky DHCP servery v sieti, ale len na jeden konkrétny, ktorého ponuka DHCPOFFER sa mu „páčila“ najviac. Kritériá „páči sa mi“ môžu byť rôzne a závisia od implementácie DHCP klienta. Príjemca požiadavky je špecifikovaný pomocou MAC adresy DHCP servera. Klient môže tiež odoslať paket DHCPREQUEST bez predchádzajúceho vygenerovania DHCPDISCOVER, ak už bola predtým získaná adresa IP servera.

Tabuľka štruktúry paketov DHCPREQUEST

Poloha v balení
Názov hodnoty (bežný)
Príklad
idea
byte
objasnenie

1
Požiadavka na spustenie
1
Hex
1
Typ správy. 1 - požiadavka od klienta na server, 2 - odpoveď zo servera na klienta

2
Typ hardvéru
1
Hex
1
Typ hardvérovej adresy, v tomto protokole 1 - MAC

3
Dĺžka hardvérových adries
6
Hex
1
Dĺžka MAC adresy zariadenia

4
Chmeľ
1
Hex
1
Počet medziľahlých trás

5
ID transakcie
23:cf:de:1d
Hex
4
Jedinečný identifikátor transakcie. Vygenerované klientom na začiatku operácie požiadavky

7
Uplynula druhá
0
Hex
4
Čas v sekundách od začiatku procesu získavania adresy

9
Bootovacie vlajky
8000
Hex
2
Určité príznaky, ktoré možno nastaviť na označenie parametrov protokolu. V tomto prípade je nastavené „vysielanie“.

11
IP adresa klienta
0.0.0.0
Riadok
4
IP adresa klienta (ak existuje)

15
IP adresa vášho klienta
172.16.134.61
Riadok
4
IP adresa ponúkaná serverom (ak je k dispozícii)

19
IP adresa nasledujúceho servera
0.0.0.0
Riadok
4
IP adresa servera (ak je známa)

23
IP adresa prenosového agenta
172.16.114.41
Riadok
4
IP adresa prenosového agenta (napríklad prepínača)

27
MAC adresa klienta
14:d6:4d:a7:c9:55
Hex
6
MAC adresa odosielateľa paketu (klienta)

31
Výplň hardvérovej adresy klienta
 
Hex
10
Rezervované miesto. Zvyčajne vyplnené nulami

41
Názov hostiteľa servera
 
Riadok
64
názov servera DHCP. Zvyčajne sa neprenáša

105
Názov zavádzacieho súboru
 
Riadok
128
Názov súboru na serveri, ktorý používajú bezdiskové stanice pri bootovaní

235
Magické koláčiky
63: 82: 53: 63
Hex
4
„Magické“ číslo, podľa ktorého vr. môžete určiť, že tento paket patrí do protokolu DHCP

možnosti DHCP. Môže ísť v akomkoľvek poradí

236
Číslo možnosti
53
Prosince
3
Možnosť 53, ktorá definuje typ paketu DHCP 3 - DHCPREQUEST

 
Dĺžka možnosti
1
Prosince
1

 
Hodnota možnosti
3
Prosince
1

 
Číslo možnosti
61
Prosince
1
ID klienta: 01 (pre Ehernet) + MAC adresa klienta

 
Dĺžka možnosti
7
Prosince
1

 
Hodnota možnosti
01:2c:ab:25:ff:72:a6
Hex
7

 
Číslo možnosti
60
Prosince
 
"Identifikátor triedy dodávateľa". V mojom prípade to hlási verziu klienta DHCP. Možno, že iné zariadenia vrátia niečo iné. Windows napríklad hlási MSFT 5.0

 
Dĺžka možnosti
11
Prosince
 

 
Hodnota možnosti
udhcp 0.9.8
Riadok
 

 
Číslo možnosti
55
 
1
Parametre siete požadované klientom. Zloženie sa môže líšiť

01 — Maska siete
03 - Brána
06 - DNS
oc — Názov hostiteľa
0f - názov sieťovej domény
1c - adresa žiadosti o vysielanie (vysielanie)
42 - Názov servera TFTP
79 - Beztriedna statická cesta

 
Dĺžka možnosti
8
 
1

 
Hodnota možnosti
01:03:06:0c:0f:1c:42:79
 
8

 
Číslo možnosti
82
Prosince
1
Možnosť 82 zopakuje to, čo prišlo v DHCPDISCOVER

 
Dĺžka možnosti
18
Prosince
1

 
Hodnota možnosti
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Prosince
18

 
Koniec balenia
255
Prosince
1
255 symbolizuje koniec paketu

DHCPACK

Ako potvrdenie, že „áno, je to tak, toto je vaša IP adresa a nikomu ju neprezradím“ zo servera DHCP, slúži paket vo formáte DHCPACK zo servera klientovi. Rovnako ako ostatné pakety sa odosielajú vysielané. Aj keď v nižšie uvedenom kóde pre server DHCP implementovaný v Pythone pre každý prípad duplikujem akúkoľvek požiadavku na vysielanie odoslaním paketu na konkrétnu IP adresu klienta, ak je už známa. Navyše, DHCP server sa vôbec nestará o to, či sa paket DHCPACK dostal ku klientovi. Ak klient nedostane DHCPACK, tak po chvíli jednoducho zopakuje DHCPREQUEST

Tabuľka štruktúry paketov DHCPACK

Poloha v balení
Názov hodnoty (bežný)
Príklad
idea
byte
objasnenie

1
Požiadavka na spustenie
2
Hex
1
Typ správy. 1 - požiadavka od klienta na server, 2 - odpoveď zo servera na klienta

2
Typ hardvéru
1
Hex
1
Typ hardvérovej adresy, v tomto protokole 1 - MAC

3
Dĺžka hardvérových adries
6
Hex
1
Dĺžka MAC adresy zariadenia

4
Chmeľ
1
Hex
1
Počet medziľahlých trás

5
ID transakcie
23:cf:de:1d
Hex
4
Jedinečný identifikátor transakcie. Vygenerované klientom na začiatku operácie požiadavky

7
Uplynula druhá
0
Hex
4
Čas v sekundách od začiatku procesu získavania adresy

9
Bootovacie vlajky
8000
Hex
2
Určité príznaky, ktoré možno nastaviť na označenie parametrov protokolu. V tomto prípade je nastavené „vysielanie“.

11
IP adresa klienta
0.0.0.0
Riadok
4
IP adresa klienta (ak existuje)

15
IP adresa vášho klienta
172.16.134.61
Riadok
4
IP adresa ponúkaná serverom (ak je k dispozícii)

19
IP adresa nasledujúceho servera
0.0.0.0
Riadok
4
IP adresa servera (ak je známa)

23
IP adresa prenosového agenta
172.16.114.41
Riadok
4
IP adresa prenosového agenta (napríklad prepínača)

27
MAC adresa klienta
14:d6:4d:a7:c9:55
Hex
6
MAC adresa odosielateľa paketu (klienta)

31
Výplň hardvérovej adresy klienta
 
Hex
10
Rezervované miesto. Zvyčajne vyplnené nulami

41
Názov hostiteľa servera
 
Riadok
64
názov servera DHCP. Zvyčajne sa neprenáša

105
Názov zavádzacieho súboru
 
Riadok
128
Názov súboru na serveri, ktorý používajú bezdiskové stanice pri bootovaní

235
Magické koláčiky
63: 82: 53: 63
Hex
4
„Magické“ číslo, podľa ktorého vr. môžete určiť, že tento paket patrí do protokolu DHCP

možnosti DHCP. Môže ísť v akomkoľvek poradí

236
Číslo možnosti
53
Prosince
3
Možnosť 53, ktorá definuje typ paketu DHCP 5 - DHCPACK

 
Dĺžka možnosti
1
Prosince
1

 
Hodnota možnosti
5
Prosince
1

 
Číslo možnosti
1
Prosince
1
Možnosť ponúknuť klientovi DHCP masku siete

 
Dĺžka možnosti
4
Prosince
1

 
Hodnota možnosti
255.255.224.0
Riadok
4

 
Číslo možnosti
3
Prosince
1
Možnosť ponúknuť klientovi DHCP predvolenú bránu

 
Dĺžka možnosti
4
Prosince
1

 
Hodnota možnosti
172.16.12.1
Riadok
4

 
Číslo možnosti
6
Prosince
1
Možnosť ponúknuť DHCP klientovi DNS

 
Dĺžka možnosti
4
Prosince
1

 
Hodnota možnosti
8.8.8.8
Riadok
4

 
Číslo možnosti
51
Prosince
1
Životnosť vydaných sieťových parametrov v sekundách, po ktorých si ich musí klient DHCP vyžiadať znova

 
Dĺžka možnosti
4
Prosince
1

 
Hodnota možnosti
86400
Prosince
4

 
Číslo možnosti
82
Prosince
1
Možnosť 82 zopakuje to, čo prišlo v DHCPDISCOVER

 
Dĺžka možnosti
18
Prosince
1

 
Hodnota možnosti
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Prosince
18

 
Koniec balenia
255
Prosince
1
255 symbolizuje koniec paketu

Inštalácia

Inštalácia v skutočnosti pozostáva z inštalácie python modulov potrebných pre prácu. Predpokladá sa, že MySQL je už nainštalovaný a nakonfigurovaný.

FreeBSD

pkg install python3 python3 -m securepip pip3 install mysql-connector

ubuntu

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

Vytvoríme databázu MySQL, nahráme do nej výpis pydhcp.sql a nakonfigurujeme konfiguračný súbor.

konfigurácia

Všetky nastavenia servera sú v súbore xml. Referenčný súbor:

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 test test 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 vyberte ip,mask,router,dns od používateľov, kde upper(mac)=upper('{option_3_AgentRemoteId_hex}') a upper(port)=upper('{option_1_AgentCircuitId_port_hex}') vyberte ip,mask,router,dns od používateľov, kde upper(mac)=upper('{sw_mac}') a upper(port)=upper('{sw_port82}') vybrať ip,mask,router,dns od používateľov, kde upper(mac)=upper('{ClientMacAddress}') vložiť do histórie (id,dt,mac,ip,comment) hodnoty ​​(null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Teraz podrobnejšie o značkách:

Časť dhcpserver popisuje základné nastavenia pre spustenie servera, konkrétne:

  • hostiteľ - akú IP adresu server počúva na porte 67
  • broadcast - ktorá ip je broadcast pre DHCPOFFER a DHCPACK
  • DHCPServer - aká je ip DHCP servera
  • LeaseTime čas prenájmu vydanej IP adresy
  • ThreadLimit - koľko vlákien beží súčasne na spracovanie prichádzajúcich UDP paketov na porte 67. Má to pomôcť pri vysoko zaťažených projektoch 😉
  • defaultMask,defaultRouter,defaultDNS - čo sa predvolene ponúka účastníkovi, ak sa v databáze nájde IP, ale nie sú pre ňu špecifikované ďalšie parametre

sekcia mysql:

hostiteľ, používateľské meno, heslo, základné meno - všetko hovorí samo za seba. Približná štruktúra databázy je zverejnená na GitHub

Sekcia dopytu: žiadosti o prijatie PONUKY/AKCOVANIE sú popísané tu:

  • offer_count — počet riadkov s požiadavkami, ktoré vracajú výsledok ako ip,mask,router,dns
  • offer_n — reťazec dopytu. Ak je návrat prázdny, vykoná sa nasledujúca žiadosť o ponuku
  • history_sql - dotaz, ktorý zapisuje napríklad do „histórie autorizácií“ pre predplatiteľa

Požiadavky môžu obsahovať ľubovoľné premenné zo sekcie možností alebo možnosti z protokolu DHCP.

Časť Možnosti. Tu to začína byť zaujímavejšie. Tu môžeme vytvárať premenné, ktoré môžeme neskôr použiť v sekcii dotazov.

napríklad:

option_82_hex:sw_port1:20:22

, tento príkazový riadok prevezme celý riadok, ktorý sa objavil vo voľbe požiadavky DHCP 82, v hexadecimálnom formáte, v rozsahu od 20 do 22 bajtov vrátane a vloží ho do novej premennej sw_port1 (port prepnutia, odkiaľ prišla požiadavka)

option_82_hex:sw_mac:26:40

, definujte premennú sw_mac, pričom hex z rozsahu 26:40

Môžete vidieť všetky možné voľby, ktoré možno použiť v dotazoch spustením servera pomocou prepínača -d. Uvidíme niečo ako tento protokol:

--paket DHCPINFORM prišiel na port 67, z 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress': '0025224'Client': '764'Client' 00%"Jxd7d" , ' HType': 'Ethernet', 'HostName': b'x91xa5xe0xa3xa5xa9-x8fx8a', 'ReqListDNS': True, 'ReqListDomainName': True, 'ReqListPerfowmRouter,R'Truecover:ReqListPerfowmRouter,R'List Trasa': Pravda, 'ReqListSubnetM ask': Pravda, 'ReqListVendorSpecInfo': 43, 'RequestedIpAddress': '0.0.0.0', 'Vendor': b'MSFT 5.0', 'chaddr': '0025224ad764', 172.30.128.13.'00.'00.'172.30.114.25. , 'flags': b'x308x6', 'giaddr': '1', 'gpoz': 82, 'hlen': 12, 'hops': 12, 'htype': 'MAC', 'magic_cookie': b'cx53Sc ', 'op': 'DHCPINFORM', 'možnosť53': 55, 'možnosť55': 60, 'možnosť60': 61, 'možnosť61': 82, 'možnosť82': 82, 'možnosť12': 01, option_06_byte': b'x00x04x00x01x00x06x02x08x00x06x00x1' b'x9x2x82eXx12010600040001000602080006001exb589xad', 'option_2_hex': '82 option_18_len': 82 12, 'option_01_str': "b'x06x00x04x00x01x00x06x02x08x00x06x00x1x9x2eXx768exb0.0.0.0xad'", 'výsledok': False, '001s, 's' 'siaddr': '589', 'sw_mac': '2e1eb06ad', 'sw_port89': '8', 'xidbyte': b'

Podľa toho môžeme zabaliť akúkoľvek premennú do {} a tá sa použije v SQL dotaze.

Zaznamenajme do histórie, že klient dostal IP adresu:

DHCP+Mysql server v Pythone

DHCP+Mysql server v Pythone

Spustenie servera

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

— d výstupný režim konzoly DEBUG
- c konfiguračný súbor <názov súboru>

Zhrnutie

A teraz ďalšie podrobnosti o implementácii servera v Pythone. Je to bolesť. Python sa učil za behu. Veľa momentov je urobených v štýle „wow, nejako sa mi to podarilo“. Vôbec nie je optimalizovaný a ponechaný v tejto podobe hlavne kvôli malým skúsenostiam s vývojom Pythonu. Pozastavím sa pri najzaujímavejších aspektoch implementácie servera v „kóde“.

Analyzátor konfiguračných súborov XML

Používa sa štandardný modul Python xml.dom. Vyzerá to jednoducho, ale počas implementácie bol citeľný nedostatok prehľadnej dokumentácie a príkladov na sieti s použitím tohto modulu.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") pre prvok v mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["mysql_username"]=elem.getElementsByTagName("username")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("password")[0].firstChild.data gconfig_name["mysql] =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") pre prvok v 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.datagsk_Mag["d =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp(_default"DNS"]=NagetelementsTagName defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") pre prvok v qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild.data pre 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") pre prvok v možnostiach: node=elem.getElementsByTagName("možnosť") pre možnosti v uzle : optionsMod.append(options.firstChild.data)

Multithreading

Napodiv, multithreading v Pythone je implementovaný veľmi jasne a jednoducho.

def PacketWork(data,addr): ... # implementácia analýzy prichádzajúceho paketu a odpovede naň ... pričom True: data, addr = udp_socket.recvfrom(1024) # čakanie na vlákno UDP paketu = threading.Thread( target=PacketWork , args=(data,addr,)).start() # ako to prišlo - spustíme predtým definovanú funkciu PacketWork na pozadí s parametrami pri threading.active_count() >gconfig["dhcp_ThreadLimit"]: čas. spánok(1) # ak číslo Už beží viac vlákien ako v nastaveniach, počkáme kým ich bude menej

Prijať/odoslať paket DHCP

Aby ste mohli zachytiť UDP pakety prichádzajúce cez sieťovú kartu, musíte „zdvihnúť“ soket:

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

, kde sú vlajky:

  • AF_INET - znamená, že formát adresy bude IP: port. Môže existovať aj AF_UNIX - kde je adresa daná názvom súboru.
  • SOCK_DGRAM - znamená, že neprijímame „surový paket“, ale taký, ktorý už prešiel firewallom a s čiastočne orezaným paketom. Tie. prijímame iba paket UDP bez „fyzickej“ zložky obalu paketov UDP. Ak použijete príznak SOCK_RAW, potom budete musieť analyzovať aj tento „obal“.

Odoslanie paketu môže byť ako vysielanie:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #prepnite soket do vysielacieho režimu rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

a na adresu „odkiaľ balík prišiel“:

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # prepnite zásuvku do režimu viacerých poslucháčov rz=udp_socket.sendto(packetack, addr)

, kde SOL_SOCKET znamená „úroveň protokolu“ pre možnosti nastavenia,

, SO_BROADCAST možnosť, že balík prilby je „vysielaný“

  ,Voľba SO_REUSEADDR prepne zásuvku do režimu „veľa poslucháčov“. Teoreticky je to v tomto prípade zbytočné, ale na jednom zo serverov FreeBSD, na ktorom som testoval, kód bez tejto možnosti nefungoval.

Analýza paketu DHCP

Tu sa mi Python veľmi páčil. Ukazuje sa, že hneď po vybalení vám umožňuje byť celkom flexibilný s bajtkódom. Umožňujúc to veľmi jednoducho previesť na desatinné hodnoty, reťazce a hex - t.j. to je to, čo skutočne potrebujeme, aby sme pochopili štruktúru balíka. Takže napríklad môžete získať rozsah bajtov v HEX a len bajty:

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

, zabaľte bajty do štruktúry:

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

Získajte IP zo štruktúry:

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

A naopak:

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

To je zatiaľ všetko 😉

Zdroj: hab.com

Pridať komentár