DHCP+Mysql server Pythonis

DHCP+Mysql server Pythonis

Selle projekti eesmärk oli:

  • DHCP tundmaõppimine IPv4 võrgus
  • Pythoni õppimine (natuke rohkem kui nullist 😉)
  • serveri vahetus DB2DHCP (minu kahvel), originaal siin, mida on uue OS-i jaoks üha keerulisem kokku panna. Ja mulle ei meeldi, et see on binaar, mida pole võimalik praegu "muuta"
  • töötava DHCP-serveri hankimine võimalusega valida abonendi IP-aadressi, kasutades abonendi mac-i või kommutaatorit mac+port kombinatsiooni (valik 82)
  • teise ratta kirjutamine (Oh! see on mu lemmiktegevus)
  • saate kommentaare oma klubilise käitumise kohta Habrahabris (või veel parem, kutse) 😉

Tulemus: see töötab 😉 Testitud FreeBSD ja Ubuntu OS peal. Teoreetiliselt võib paluda koodil töötada mis tahes OS-i all, kuna Tundub, et koodis pole konkreetseid seoseid.
Hoolikalt! Tulemas on veel palju.

Link amatööride hoidlale "puudutage elusalt".

"Riistvara uurimise" installimise, konfigureerimise ja kasutamise protsess on palju madalam ja seejärel natuke teooriat DHCP-protokolli kohta. Enda jaoks. Ja ajaloo jaoks 😉

Natuke teooriat

Mis on DHCP

See on võrguprotokoll, mis võimaldab seadmel DHCP-serverist teada saada oma IP-aadressi (ja muud parameetrid, nagu lüüs, DNS jne). Pakette vahetatakse UDP-protokolli abil. Seadme üldine tööpõhimõte võrguparameetrite küsimisel on järgmine:

  1. Seade (klient) saadab kogu võrgus UDP levitaotluse (DHCPDISCOVER) päringuga "noh, keegi andke mulle IP-aadress". Veelgi enam, tavaliselt (kuid mitte alati) päring pärineb pordist 68 (allikas) ja sihtkohaks on port 67 (sihtkoht). Mõned seadmed saadavad pakette ka pordist 67. Kliendiseadme MAC-aadress sisaldub DHCPDISCOVER paketis.
  2. Kõik võrgus asuvad DHCP-serverid (ja neid võib olla mitu) moodustavad DHCPDISCOVER-i saatnud seadme jaoks võrguseadetega DHCPOFFER-pakkumise ja edastavad selle ka üle võrgu. Identifitseerimine, kellele see pakett on mõeldud, põhineb kliendi MAC-aadressil, mis oli varem DHCPDISCOVERi päringus esitatud.
  3. Klient võtab vastu võrguseadete ettepanekutega paketid, valib kõige atraktiivsema (kriteeriumid võivad olla erinevad, näiteks pakettide kohaletoimetamise aeg, vahemarsruutide arv) ja esitab võrguseadetega “ametliku päringu” DHCPREQUEST. DHCP-serverist, mis talle meeldib. Sel juhul läheb pakett kindlasse DHCP-serverisse.
  4. DHCPREQUESTi vastu võtnud server saadab DHCPACK-vormingus paketi, milles loetleb uuesti selle kliendi jaoks mõeldud võrgusätted

DHCP+Mysql server Pythonis

Lisaks on DHCPINFORM paketid, mis tulevad kliendilt ja mille eesmärk on teavitada DHCP serverit, et “klient on elus” ja kasutab väljastatud võrgusätteid. Selle serveri teostuses neid pakette eiratakse.

Pakendi formaat

Üldiselt näeb Etherneti paketiraam välja umbes selline:

DHCP+Mysql server Pythonis

Meie puhul võtame arvesse ainult andmeid otse UDP-paketi sisust ilma OSI kihi protokolli päisteta, nimelt DHCP struktuuri:

DHCPDISCOVER

Seega algab seadme IP-aadressi hankimise protsess sellega, et DHCP-klient saadab pordist 68 leviedastuspäringu 255.255.255.255:67-le. Selles paketis sisaldab klient oma MAC-aadressi ja ka seda, mida ta täpselt DHCP-serverist saada soovib. Pakendi struktuuri kirjeldatakse allolevas tabelis.

DHCPDISCOVER paketistruktuuri tabel

Asukoht pakendis
Väärtuse nimi
Näide
Sissejuhatus
Bait
Selgitamine

1
Alglaadimistaotlus
1
Hex
1
Sõnumi tüüp. 1 - päring kliendilt serverile, 2 - vastus serverilt kliendile

2
Riistvara tüüp
1
Hex
1
Riistvara aadressi tüüp, selles protokollis 1 - MAC

3
Riistvara aadresside pikkus
6
Hex
1
Seadme MAC-aadressi pikkus

4
Humal
1
Hex
1
Vaheliinide arv

5
Tehingu ID
23:cf:de:1d
Hex
4
Tehingu kordumatu identifikaator. Loob klient päringutoimingu alguses

7
Teine möödas
0
Hex
4
Aeg sekundites alates aadressi hankimise protsessi algusest

9
Saapalipud
0
Hex
2
Teatud lipud, mida saab seadistada protokolli parameetrite näitamiseks

11
Kliendi IP-aadress
0.0.0.0
Rida
4
Kliendi IP-aadress (kui on)

15
Teie kliendi IP-aadress
0.0.0.0
Rida
4
Serveri pakutav IP-aadress (kui see on saadaval)

19
Järgmise serveri IP-aadress
0.0.0.0
Rida
4
Serveri IP-aadress (kui on teada)

23
Edastusagendi IP-aadress
172.16.114.41
Rida
4
Vahetusagendi (nt lüliti) IP-aadress

27
Kliendi MAC-aadress
14:d6:4d:a7:c9:55
Hex
6
Paketi saatja (kliendi) MAC-aadress

31
Kliendi riistvara aadressi täitmine
 
Hex
10
Reserveeritud koht. Tavaliselt täidetud nullidega

41
Serveri hostinimi
 
Rida
64
DHCP-serveri nimi. Tavaliselt ei edastata

105
Alglaadimisfaili nimi
 
Rida
128
Faili nimi serveris, mida kettata jaamad alglaadimisel kasutavad

235
Maagilised küpsised
63: 82: 53: 63
Hex
4
“Maagiline” number, mille järgi sh. saate kindlaks teha, kas see pakett kuulub DHCP-protokolli

DHCP valikud. Võib minna igas järjekorras

236
Võimaluse number
53
Detsember
1
Valik 53, mis määrab DHCP-paketi tüübi

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

 
Valiku pikkus
1
Detsember
1

 
Võimaluse väärtus
1
Detsember
1

 
Võimaluse number
50
Detsember
1
Millist IP-aadressi klient saada soovib?

 
Valiku pikkus
4
Detsember
1

 
Võimaluse väärtus
172.16.134.61
Rida
4

 
Võimaluse number
55
 
1
Kliendi nõutud võrguparameetrid. Koostis võib varieeruda

01 — võrgumask
03 – värav
06 – DNS
oc – hostinimi
0f - võrgu domeeninimi
1c – levitaotluse aadress (edastus)
42 – TFTP-serveri nimi
79 – klassideta staatiline marsruut

 
Valiku pikkus
8
 
1

 
Võimaluse väärtus
01:03:06:0c:0f:1c:42:79
 
8

 
Võimaluse number
82
Detsember
 
Valik 82, mis edastab kordusseadme MAC-aadressi ja mõningaid lisaväärtusi.

Enamasti on see kommutaatori port, millel DHCP lõppklient töötab. See valik sisaldab lisaparameetreid.Esimene bait on “alamvaliku” number, teine ​​selle pikkus, seejärel väärtus.

Sel juhul on valikus 82 alamvalikud pesastatud:
Agendi vooluringi ID = 00:04:00:01:00:04, kus kaks viimast baiti on DHCP kliendi port, kust päring tuli

Agendi kaug-ID = 00:06:c8:be:19:93:11:48 – DHCP repiiteri MAC-aadress

 
Valiku pikkus
18
Detsember
 

 
Võimaluse väärtus
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Pakendi lõpp
255
Detsember
1
255 sümboliseerib paketi lõppu

DHCPPAKKUMINE

Niipea kui server saab DHCPDISCOVER paketi ja kui ta näeb, et suudab kliendile midagi soovitud paketi hulgast pakkuda, genereerib ta sellele vastuse - DHCPDISCOVER. Vastus saadetakse sadamasse “kust see tuli”, saate teel, sest hetkel ei ole kliendil veel IP-aadressi, mistõttu saab ta paketi vastu võtta vaid siis, kui see saadetakse leviedastuse teel. Klient tunneb ära, et see on tema jaoks pakett, nii tema MAC-aadressi järgi, mis on pakis, kui ka tehingunumbri järgi, mille ta genereerib esimese paketi loomise ajal.

DHCPOFFERi paketistruktuuri tabel

Asukoht pakendis
Väärtuse nimi (tavaline)
Näide
Sissejuhatus
Bait
Selgitamine

1
Alglaadimistaotlus
1
Hex
1
Sõnumi tüüp. 1 - päring kliendilt serverile, 2 - vastus serverilt kliendile

2
Riistvara tüüp
1
Hex
1
Riistvara aadressi tüüp, selles protokollis 1 - MAC

3
Riistvara aadresside pikkus
6
Hex
1
Seadme MAC-aadressi pikkus

4
Humal
1
Hex
1
Vaheliinide arv

5
Tehingu ID
23:cf:de:1d
Hex
4
Tehingu kordumatu identifikaator. Loob klient päringutoimingu alguses

7
Teine möödas
0
Hex
4
Aeg sekundites alates aadressi hankimise protsessi algusest

9
Saapalipud
0
Hex
2
Teatud lipud, mida saab seadistada protokolli parameetrite näitamiseks. Sel juhul tähendab 0 Unicast päringu tüüpi

11
Kliendi IP-aadress
0.0.0.0
Rida
4
Kliendi IP-aadress (kui on)

15
Teie kliendi IP-aadress
172.16.134.61
Rida
4
Serveri pakutav IP-aadress (kui see on saadaval)

19
Järgmise serveri IP-aadress
0.0.0.0
Rida
4
Serveri IP-aadress (kui on teada)

23
Edastusagendi IP-aadress
172.16.114.41
Rida
4
Vahetusagendi (nt lüliti) IP-aadress

27
Kliendi MAC-aadress
14:d6:4d:a7:c9:55
Hex
6
Paketi saatja (kliendi) MAC-aadress

31
Kliendi riistvara aadressi täitmine
 
Hex
10
Reserveeritud koht. Tavaliselt täidetud nullidega

41
Serveri hostinimi
 
Rida
64
DHCP-serveri nimi. Tavaliselt ei edastata

105
Alglaadimisfaili nimi
 
Rida
128
Faili nimi serveris, mida kettata jaamad alglaadimisel kasutavad

235
Maagilised küpsised
63: 82: 53: 63
Hex
4
“Maagiline” number, mille järgi sh. saate kindlaks teha, kas see pakett kuulub DHCP-protokolli

DHCP valikud. Võib minna igas järjekorras

236
Võimaluse number
53
Detsember
1
Valik 53, mis määrab DHCP 2 paketitüübi – DHCPOFFER

 
Valiku pikkus
1
Detsember
1

 
Võimaluse väärtus
2
Detsember
1

 
Võimaluse number
1
Detsember
1
Võimalus pakkuda DHCP-kliendile võrgumaski

 
Valiku pikkus
4
Detsember
1

 
Võimaluse väärtus
255.255.224.0
Rida
4

 
Võimaluse number
3
Detsember
1
Võimalus pakkuda DHCP-kliendile vaikelüüsi

 
Valiku pikkus
4
Detsember
1

 
Võimaluse väärtus
172.16.12.1
Rida
4

 
Võimaluse number
6
Detsember
1
Võimalus pakkuda DNS-kliendile DHCP-d

 
Valiku pikkus
4
Detsember
1

 
Võimaluse väärtus
8.8.8.8
Rida
4

 
Võimaluse number
51
Detsember
1
Väljastatud võrguparameetrite eluiga sekundites, pärast mida peab DHCP klient neid uuesti nõudma

 
Valiku pikkus
4
Detsember
1

 
Võimaluse väärtus
86400
Detsember
4

 
Võimaluse number
82
Detsember
1
Valik 82, kordab seda, mis tuli DHCPDISCOVERis

 
Valiku pikkus
18
Detsember
1

 
Võimaluse väärtus
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Detsember
18

 
Pakendi lõpp
255
Detsember
1
255 sümboliseerib paketi lõppu

DHCPREQUEST

Pärast DHCPOFFERi kättesaamist moodustab klient võrguparameetreid küsiva paketi mitte kõikidele võrgus olevatele DHCP-serveritele, vaid ainult ühele konkreetsele, mille DHCPOFFERi pakkumine talle kõige rohkem “meeldis”. "Meeldib" kriteeriumid võivad olla erinevad ja sõltuvad kliendi DHCP rakendamisest. Päringu adressaat määratakse DHCP-serveri MAC-aadressi abil. Samuti saab klient saata DHCPREQUEST-paketi ilma DHCPDISCOVER-i genereerimata, kui serveri IP-aadress on juba varem hangitud.

DHCPREQUEST paketistruktuuri tabel

Asukoht pakendis
Väärtuse nimi (tavaline)
Näide
Sissejuhatus
Bait
Selgitamine

1
Alglaadimistaotlus
1
Hex
1
Sõnumi tüüp. 1 - päring kliendilt serverile, 2 - vastus serverilt kliendile

2
Riistvara tüüp
1
Hex
1
Riistvara aadressi tüüp, selles protokollis 1 - MAC

3
Riistvara aadresside pikkus
6
Hex
1
Seadme MAC-aadressi pikkus

4
Humal
1
Hex
1
Vaheliinide arv

5
Tehingu ID
23:cf:de:1d
Hex
4
Tehingu kordumatu identifikaator. Loob klient päringutoimingu alguses

7
Teine möödas
0
Hex
4
Aeg sekundites alates aadressi hankimise protsessi algusest

9
Saapalipud
8000
Hex
2
Teatud lipud, mida saab määrata protokolli parameetrite näitamiseks. Sel juhul on seatud "edastus".

11
Kliendi IP-aadress
0.0.0.0
Rida
4
Kliendi IP-aadress (kui on)

15
Teie kliendi IP-aadress
172.16.134.61
Rida
4
Serveri pakutav IP-aadress (kui see on saadaval)

19
Järgmise serveri IP-aadress
0.0.0.0
Rida
4
Serveri IP-aadress (kui on teada)

23
Edastusagendi IP-aadress
172.16.114.41
Rida
4
Vahetusagendi (nt lüliti) IP-aadress

27
Kliendi MAC-aadress
14:d6:4d:a7:c9:55
Hex
6
Paketi saatja (kliendi) MAC-aadress

31
Kliendi riistvara aadressi täitmine
 
Hex
10
Reserveeritud koht. Tavaliselt täidetud nullidega

41
Serveri hostinimi
 
Rida
64
DHCP-serveri nimi. Tavaliselt ei edastata

105
Alglaadimisfaili nimi
 
Rida
128
Faili nimi serveris, mida kettata jaamad alglaadimisel kasutavad

235
Maagilised küpsised
63: 82: 53: 63
Hex
4
“Maagiline” number, mille järgi sh. saate kindlaks teha, kas see pakett kuulub DHCP-protokolli

DHCP valikud. Võib minna igas järjekorras

236
Võimaluse number
53
Detsember
3
Valik 53, mis määrab DHCP-paketi tüübi 3 – DHCPREQUEST

 
Valiku pikkus
1
Detsember
1

 
Võimaluse väärtus
3
Detsember
1

 
Võimaluse number
61
Detsember
1
Kliendi ID: 01 (Eherneti jaoks) + kliendi MAC-aadress

 
Valiku pikkus
7
Detsember
1

 
Võimaluse väärtus
01:2c:ab:25:ff:72:a6
Hex
7

 
Võimaluse number
60
Detsember
 
"Teenusepakkuja klassi identifikaator". Minu puhul teatab see DHCP kliendi versioonist. Võib-olla annavad teised seadmed midagi muud. Näiteks Windows teatab MSFT 5.0-st

 
Valiku pikkus
11
Detsember
 

 
Võimaluse väärtus
udhcp 0.9.8
Rida
 

 
Võimaluse number
55
 
1
Kliendi nõutud võrguparameetrid. Koostis võib varieeruda

01 — võrgumask
03 – värav
06 – DNS
oc – hostinimi
0f - võrgu domeeninimi
1c – levitaotluse aadress (edastus)
42 – TFTP-serveri nimi
79 – klassideta staatiline marsruut

 
Valiku pikkus
8
 
1

 
Võimaluse väärtus
01:03:06:0c:0f:1c:42:79
 
8

 
Võimaluse number
82
Detsember
1
Valik 82, kordab seda, mis tuli DHCPDISCOVERis

 
Valiku pikkus
18
Detsember
1

 
Võimaluse väärtus
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Detsember
18

 
Pakendi lõpp
255
Detsember
1
255 sümboliseerib paketi lõppu

DHCPACK

Kinnitusena, et "jah, see on õige, see on teie IP-aadress ja ma ei anna seda kellelegi teisele" teenindab DHCP-serverist DHCPACK-vormingus paketti serverist kliendile. See saadetakse eetrisse nagu teisedki paketid. Kuigi allolevas Pythonis realiseeritud DHCP-serveri koodis dubleerin igaks juhuks kõik leviedastuspäringud, saates paketi konkreetsele kliendi IP-le, kui see on juba teada. Pealegi ei huvita DHCP-server üldse, kas DHCPACK-pakett on kliendini jõudnud. Kui klient DHCPACK-i ei saa, kordab mõne aja pärast lihtsalt DHCPREQUEST

DHCPACK paketistruktuuri tabel

Asukoht pakendis
Väärtuse nimi (tavaline)
Näide
Sissejuhatus
Bait
Selgitamine

1
Alglaadimistaotlus
2
Hex
1
Sõnumi tüüp. 1 - päring kliendilt serverile, 2 - vastus serverilt kliendile

2
Riistvara tüüp
1
Hex
1
Riistvara aadressi tüüp, selles protokollis 1 - MAC

3
Riistvara aadresside pikkus
6
Hex
1
Seadme MAC-aadressi pikkus

4
Humal
1
Hex
1
Vaheliinide arv

5
Tehingu ID
23:cf:de:1d
Hex
4
Tehingu kordumatu identifikaator. Loob klient päringutoimingu alguses

7
Teine möödas
0
Hex
4
Aeg sekundites alates aadressi hankimise protsessi algusest

9
Saapalipud
8000
Hex
2
Teatud lipud, mida saab määrata protokolli parameetrite näitamiseks. Sel juhul on seatud "edastus".

11
Kliendi IP-aadress
0.0.0.0
Rida
4
Kliendi IP-aadress (kui on)

15
Teie kliendi IP-aadress
172.16.134.61
Rida
4
Serveri pakutav IP-aadress (kui see on saadaval)

19
Järgmise serveri IP-aadress
0.0.0.0
Rida
4
Serveri IP-aadress (kui on teada)

23
Edastusagendi IP-aadress
172.16.114.41
Rida
4
Vahetusagendi (nt lüliti) IP-aadress

27
Kliendi MAC-aadress
14:d6:4d:a7:c9:55
Hex
6
Paketi saatja (kliendi) MAC-aadress

31
Kliendi riistvara aadressi täitmine
 
Hex
10
Reserveeritud koht. Tavaliselt täidetud nullidega

41
Serveri hostinimi
 
Rida
64
DHCP-serveri nimi. Tavaliselt ei edastata

105
Alglaadimisfaili nimi
 
Rida
128
Faili nimi serveris, mida kettata jaamad alglaadimisel kasutavad

235
Maagilised küpsised
63: 82: 53: 63
Hex
4
“Maagiline” number, mille järgi sh. saate kindlaks teha, kas see pakett kuulub DHCP-protokolli

DHCP valikud. Võib minna igas järjekorras

236
Võimaluse number
53
Detsember
3
Valik 53, mis määrab DHCP-paketi tüübi 5 – DHCPACK

 
Valiku pikkus
1
Detsember
1

 
Võimaluse väärtus
5
Detsember
1

 
Võimaluse number
1
Detsember
1
Võimalus pakkuda DHCP-kliendile võrgumaski

 
Valiku pikkus
4
Detsember
1

 
Võimaluse väärtus
255.255.224.0
Rida
4

 
Võimaluse number
3
Detsember
1
Võimalus pakkuda DHCP-kliendile vaikelüüsi

 
Valiku pikkus
4
Detsember
1

 
Võimaluse väärtus
172.16.12.1
Rida
4

 
Võimaluse number
6
Detsember
1
Võimalus pakkuda DNS-kliendile DHCP-d

 
Valiku pikkus
4
Detsember
1

 
Võimaluse väärtus
8.8.8.8
Rida
4

 
Võimaluse number
51
Detsember
1
Väljastatud võrguparameetrite eluiga sekundites, pärast mida peab DHCP klient neid uuesti nõudma

 
Valiku pikkus
4
Detsember
1

 
Võimaluse väärtus
86400
Detsember
4

 
Võimaluse number
82
Detsember
1
Valik 82, kordab seda, mis tuli DHCPDISCOVERis

 
Valiku pikkus
18
Detsember
1

 
Võimaluse väärtus
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ec
Detsember
18

 
Pakendi lõpp
255
Detsember
1
255 sümboliseerib paketi lõppu

Paigaldamine

Paigaldamine seisneb tegelikult tööks vajalike pythoni moodulite paigaldamises. Eeldatakse, et MySQL on juba installitud ja konfigureeritud.

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

Loome MySQL andmebaasi, laadime sinna üles pydhcp.sql dump ja konfigureerime konfiguratsioonifaili.

Konfiguratsioon

Kõik serveri sätted on xml-failis. Viitefail:

1.0 0.0.0.0 255.255.255.255 192.168.0.71 8600 1 255.255.255.0 192.168.0.1 8.8.8.8 82 1 kohalik host test test pydhcp option_20_hex:sw_port22:82:2 option_16_hex:sw_port18:82:26 option_40_hex:sw_mac:3:1 82 vali ip,mask,ruuter,dns kasutajatelt, kus ülemine(mac)=upper('{option_82_AgentRemoteId_hex}') ja ülemine(port)=ülemine('{option_1_AgentCircuitId_port_hex}') vali ip,mask,ruuter,dns kasutajatelt, kus ülemine(mac)=ülemine('{sw_mac}') ja ülemine(port)=ülemine('{sw_port2}') vali ip,mask,ruuter,dns kasutajatelt, kus top(mac)=upper('{ClientMacAddress}') sisestage ajalukku (id,dt,mac,ip,kommentaar) väärtused (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Nüüd täpsemalt siltide kohta:

Jaotises dhcpserver kirjeldatakse serveri käivitamise põhisätteid, nimelt:

  • host - millist IP-aadressi server pordis 67 kuulab
  • edastus – milline IP on DHCPOFFERi ja DHCPACKi edastus
  • DHCPServer – mis on DHCP-serveri ip
  • Väljastatud IP-aadressi LeaseTime rendiaeg
  • ThreadLimit – mitu lõime töötab korraga, et töödelda sissetulevaid UDP-pakette pordis 67. See peaks aitama suure koormusega projektide puhul 😉
  • defaultMask,defaultRouter,defaultDNS - mida abonendile vaikimisi pakutakse, kui andmebaasist leitakse IP, kuid selle jaoks pole täiendavaid parameetreid määratud

mysql jaotis:

host, kasutajanimi, parool, baasnimi – kõik räägib enda eest. Ligikaudne andmebaasi struktuur on postitatud GitHub

Päringu jaotis: PAKKUMISE/TAGASI saamise taotlusi kirjeldatakse siin:

  • offer_count – ridade arv päringutega, mis tagastavad tulemuse nagu ip,mask,ruuter,dns
  • offer_n – päringustring. Kui tagastus on tühi, täidab järgmise pakkumise päringu
  • history_sql – päring, mis kirjutab näiteks abonendi "volituste ajaloosse"

Taotlused võivad sisaldada mis tahes muutujaid suvandite jaotisest või DHCP-protokolli valikuid.

Valikud. Siin läheb asi huvitavamaks. Siin saame luua muutujaid, mida saame hiljem päringu jaotises kasutada.

Näiteks:

option_82_hex:sw_port1:20:22

, võtab see käsurida kogu rea, mis tuli DHCP-päringu suvandis 82, kuueteistkümnendvormingus vahemikus 20 kuni 22 baiti (kaasa arvatud) ja asetab selle uude muutujasse sw_port1 (vahetusport, kust päring tuli).

option_82_hex:sw_mac:26:40

, määratlege muutuja sw_mac, võttes kuueteistkümnendiku vahemikust 26:40

Näete kõiki võimalikke valikuid, mida päringutes kasutada saab, kui käivitate serveri lülitiga -d. Näeme midagi sellist logi:

--DHCPINFORM-i pakett saabus porti 67, aadressilt 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress'B, 0025224C-Address764t'00'7 ': b'x91 5%"Jxd0d" , ' HType': 'Ethernet', 'HostName': b'x3xa5xe9xa8xa8xa43-x0.0.0.0fx5.0a', 'ReqListDNS': Tõene, 'ReqListDomainName': Tõene, 'ReqListPerfowmRouterL:Disco''Reqist ReqListStaticRoute': tõsi, 'ReqListSubnetM ask': tõene, 'ReqListVendorSpecInfo': 0025224, 'RequestedIpAddress': '764', 'Vendor': b'MSFT 172.30.128.13', 'chaddr': '00ad00'dr'172.30.114.25'.308. , 'lipud': b'x6x1', 'giaddr': '82', 'gpoz': 12, 'hlen': 12, 'hops': 53, 'htype': 'MAC', 'magic_cookie': b'cx53Sc ', 'op': 'DHCPINFORM', 'valik55': 55, 'valik60': 60, 'valik61': 61, 'valik82': 82, 'valik82': 12, 'valik01': 06 optsioon_00_bait': b'x04x00x01x00x06x02x08x00x06x00x1x9' b'x2x82x12010600040001000602080006001eXx589exb2xad', 'opt. 'option_82_len': 18 82, 'option_12_str': "b'x01x06x00x04x00x01x00x06x02x08x00x06x00x1x9eXx2exb768xad", 'tulemus': vale,', '0.0.0.0se 'siaddr': '001', 'sw_mac': '589e2eb1ad', 'sw_port06': '89', 'xidbyte': b'

Sellest lähtuvalt saame mähkida mis tahes muutuja {}-sse ja seda kasutatakse SQL-päringus.

Salvestagem ajaloo jaoks, et klient sai IP-aadressi:

DHCP+Mysql server Pythonis

DHCP+Mysql server Pythonis

Serveri käivitamine

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

— d konsooli väljundrežiim SILU
- c <failinimi> konfiguratsioonifail

Ülekanne

Ja nüüd lisateavet serveri juurutamise kohta Pythonis. See on valu. Pythoni õpiti käigu pealt. Paljud hetked on tehtud stiilis "vau, kuidagi sain selle toimima." Pole üldse optimeeritud ja jäeti sellisele kujule peamiselt vähese Pythoni arenduse kogemuse tõttu. Peatun "koodis" serveri juurutamise kõige huvitavamatel aspektidel.

XML konfiguratsioonifaili parser

Kasutatakse standardset Pythoni moodulit xml.dom. Tundub lihtne, kuid juurutamise ajal oli seda moodulit kasutava võrgu kohta märgatav puudus selgest dokumentatsioonist ja näidetest.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") mconfig-i elem jaoks: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firtast gconfig["mysql_username"]=elem.getElementsByTagName("kasutajanimi")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("parool")[0].first"g =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") dconfig-i elemile: gconfig["broadcast"]=elem.getElementsByTagcast.me) firstChild.data gconfig["dhcp_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["dhcp_LeaseTime"]=elem.getElementsByTagName("LeaseTime")stcon[0].fi dhcp_threadliMit "] = int (elem.getElementsByTagname (" ThreadLiMit ") [0] .FirstChild.Data) gconfig [" dhcp_server "] = elem.getElementsByTagnme (" DHCPSERVER ") [0] .FirstCHILDEFIG"]] =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig"gelement_de=TahDcgetme_de=BhDcgetme_de="dh" " defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("päring") element jaoks qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild in. range(int(gconfig["pakkumiste_arv"])): gconfig["pakkumine_"+str(arv+0)]=elem.getElementsByTagName("offer_"+str(num+1))[1].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[0].firstChild.data options=tree.getElementsByTagName("valikud") suvandite elementi jaoks: node=elem.getElementsByTagName("option") : optionsMod.append(options.firstChild.data)

Mitmelõimeline

Kummalisel kombel rakendatakse Pythonis mitmelõimelisust väga selgelt ja lihtsalt.

def PacketWork(data,addr): ... # sissetuleva paketi sõelumise ja sellele vastamise rakendamine ... while True: data, addr = udp_socket.recvfrom(1024) # UDP-paketi ootamine lõim = threading.Thread( target=PacketWork , args=(data,addr,)).start() # nagu tuli - käivitame taustal eelnevalt määratletud PacketWork funktsiooni parameetritega samal ajal kui threading.active_count() >gconfig["dhcp_ThreadLimit"]: aeg. sleep(1) # kui number Juba töötab rohkem lõime kui seadetes, ootame kuni neid on vähem

DHCP-paketi vastuvõtmine/saatmine

Võrgukaardi kaudu tulevate UDP-pakettide pealtkuulamiseks peate pistikupesa üles tõstma:

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

, kus on lipud:

  • AF_INET – tähendab, et aadressivorming on IP: port. Võib olla ka AF_UNIX – kus aadress on antud failinime järgi.
  • SOCK_DGRAM - tähendab, et me ei aktsepteeri "toores paketti", vaid sellist, mis on juba tulemüürist läbinud ja osaliselt kärbitud paketiga. Need. saame ainult UDP-paketi ilma UDP-paketi ümbrise "füüsilise" komponendita. Kui kasutate lippu SOCK_RAW, peate ka selle "ümbrise" sõeluma.

Paketi saatmine võib olla nagu saade:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #lülitage pesa leviedastusrežiimi rz=udp_socket.sendto(packettack, (gconfig["saade"],68))

ja aadressile "kust pakk tuli":

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # lülita pesa mitme kuulaja režiimi rz=udp_socket.sendto(packetack, addr)

, kus SOL_SOCKET tähendab "protokolli taset" suvandite seadistamiseks,

, SO_BROADCAST valik, et kiivri pakett on "edastus"

  Valik ,SO_REUSEADDR lülitab pesa režiimi "paljud kuulajad". Teoreetiliselt on see antud juhul ebavajalik, kuid ühes FreeBSD serveris, millel testisin, kood ilma selle võimaluseta ei töötanud.

DHCP-paketi sõelumine

See on koht, kus mulle Python väga meeldis. Selgub, et karbist välja võttes võimaldab see baitkoodiga üsna paindlik olla. Võimaldades seda väga lihtsalt tõlkida kümnendväärtusteks, stringideks ja kuueteistkümnendkohtadeks – st. see on see, mida me tegelikult vajame, et mõista paketi struktuuri. Näiteks saate HEX-is saada hulga baite ja ainult baite:

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

, pakkige baidid struktuuri:

res["lipud"]=pakk('BB',andmed[10],andmed[11])

Hangi IP struktuurist:

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

Ja vastupidi:

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

See on selleks korraks kõik 😉

Allikas: www.habr.com

Lisa kommentaar