DHCP + MySQL server dina Python

DHCP + MySQL server dina Python

Tujuan proyék ieu nya éta:

  • Diajar ngeunaan DHCP dina jaringan IPv4
  • Diajar Python (saeutik leuwih ti mimiti 😉)
  • ngagantian server DB2DHCP (garpu kuring), asli di dieu, nu jadi beuki hese ngumpul pikeun OS anyar. Sareng kuring henteu resep yén éta binér anu teu aya deui jalan pikeun "robah ayeuna"
  • kéngingkeun server DHCP anu tiasa dianggo kalayan kamampuan milih alamat IP palanggan nganggo mac palanggan atanapi ngalih kombinasi port mac + port (Pilihan 82)
  • nulis sapédah séjén (Oh! ieu kagiatan favorit kuring)
  • narima komentar ngeunaan klub-handedness anjeun dina Habrahabr (atawa hadé acan, hiji uleman) 😉

Hasilna: tiasa dianggo 😉 Diuji dina FreeBSD sareng OS Ubuntu. Sacara téoritis, kodeu tiasa dipenta pikeun dianggo dina OS naon waé, sabab Sigana mah euweuh bindings husus dina kode.
Ati-ati! Aya seueur deui anu bakal datang.

Tumbu ka gudang pikeun amatir "hirup hirup".

Prosés masang, ngonpigurasikeun sareng ngagunakeun hasil "ngulik hardware" langkung handap, teras sakedik téori ngeunaan protokol DHCP. Pikeun kuring sorangan. Sareng pikeun sajarah 😉

Téori saeutik

Naon DHCP

Ieu mangrupikeun protokol jaringan anu ngamungkinkeun alat pikeun mendakan alamat IP na (sareng parameter sanésna sapertos gateway, DNS, jsb.) tina server DHCP. Pakét ditukeurkeun ngagunakeun protokol UDP. Prinsip umum operasi alat nalika menta parameter jaringan nyaéta kieu:

  1. Alat (klien) ngirimkeun pamundut siaran UDP (DHCPDISCOVER) sapanjang jaringan kalayan pamundut "muhun, aya anu masihan alamat IP kuring." Leuwih ti éta, biasana (tapi teu salawasna) pamundut lumangsung ti port 68 (sumber), sarta tujuanana nyaéta port 67 (tujuan). Sababaraha alat ogé ngirim pakét ti port 67. Alamat MAC alat klien kalebet dina pakét DHCPDISCOVER.
  2. Kabéh server DHCP lokasina dina jaringan (jeung meureun aya sababaraha di antarana) ngabentuk tawaran DHCPOFFER kalawan setelan jaringan pikeun alat nu dikirim DHCPDISCOVER, sarta ogé disiarkeun ngaliwatan jaringan. Idéntifikasi saha pakét ieu dimaksudkeun dumasar kana alamat MAC tina klien anu disayogikeun sateuacana dina pamundut DHCPDISCOVER.
  3. Klién nampi pakét kalayan usulan pikeun setélan jaringan, milih anu paling pikaresepeun (kriteria tiasa bénten-béda, contona, waktos pangiriman pakét, jumlah rute perantara), sareng ngadamel "pamenta resmi" DHCPREQUEST sareng setélan jaringan. ti server DHCP eta diaku. Dina hal ieu, pakét angkat ka server DHCP khusus.
  4. Pangladén anu nampi DHCPREQUEST ngirim pakét format DHCPACK, dimana éta daptar deui setélan jaringan anu dimaksudkeun pikeun klien ieu.

DHCP + MySQL server dina Python

Salaku tambahan, aya pakét DHCPINFORM anu asalna tina klien, sareng tujuanana nyaéta pikeun nginpokeun ka server DHCP yén "klien hirup" sareng nganggo setélan jaringan anu dikaluarkeun. Dina palaksanaan server ieu, pakét ieu teu dipaliré.

Format pakét

Sacara umum, pigura pakét Ethernet sapertos kieu:

DHCP + MySQL server dina Python

Dina hal urang, urang bakal mertimbangkeun ukur data langsung tina eusi pakét UDP, tanpa headers protokol lapisan OSI, nyaéta struktur DHCP:

DHCPDINSCOVER

Janten, prosés kéngingkeun alamat IP pikeun alat dimimitian ku klien DHCP ngirim pamundut siaran ti port 68 ka 255.255.255.255:67. Dina pakét ieu, klien kalebet alamat MAC na, kitu ogé naon anu dipikahoyong ditampi tina server DHCP. Struktur pakét digambarkeun dina tabel di handap ieu.

DHCPDISCOVER Pakét Struktur Table

Posisi dina bungkusan
Ngaran nilai
conto
gagasan
Byte
Katerangan

1
Paménta boot
1
Hex
1
Jenis pesen. 1 - pamundut ti klien ka server, 2 - respon ti server ka klien

2
Jenis hardware
1
Hex
1
Jenis alamat hardware, dina protokol ieu 1 - MAC

3
panjangna alamat hardware
6
Hex
1
Panjang alamat MAC alat

4
Hops
1
Hex
1
Jumlah jalur panengah

5
KTP transaksi
23:cf:de:1d
Hex
4
Identifier urus unik. Dihasilkeun ku klien dina awal operasi pamundut

7
Kadua ngaliwat
0
Hex
4
Waktos dina detik ti mimiti prosés meunangkeun alamat

9
Bandéra boot
0
Hex
2
Bandéra anu tangtu anu tiasa disetél pikeun nunjukkeun parameter protokol

11
Alamat IP klien
0.0.0.0
Jalur
4
Alamat IP klien (upami aya)

15
Alamat IP klien anjeun
0.0.0.0
Jalur
4
Alamat IP anu ditawarkeun ku server (upami sayogi)

19
Alamat IP pangladén salajengna
0.0.0.0
Jalur
4
Alamat IP server (upami terang)

23
Relay agén alamat IP
172.16.114.41
Jalur
4
Alamat IP agén relay (contona, saklar)

27
Alamat MAC klien
14:d6:4d:a7:c9:55
Hex
6
Alamat MAC pangirim pakét (klien)

31
padding alamat hardware klien
 
Hex
10
korsi dicadangkeun. Biasana dieusian ku nol

41
Ngaran host server
 
Jalur
64
Ngaran server DHCP. Biasana henteu ditularkeun

105
Ngaran file boot
 
Jalur
128
Ngaran koropak dina server dipaké ku stasiun diskless nalika booting

235
cookies magic
63: 82: 53: 63
Hex
4
Jumlah "Magic", numutkeun nu, incl. Anjeun bisa nangtukeun yén pakét ieu milik protokol DHCP

Pilihan DHCP. Bisa balik dina urutan naon

236
Nomer pilihan
53
Dec
1
Pilihan 53, anu nangtukeun jinis pakét DHCP

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

 
Panjang pilihan
1
Dec
1

 
Nilai pilihan
1
Dec
1

 
Nomer pilihan
50
Dec
1
Naon alamat IP anu hoyong ditampi ku klien?

 
Panjang pilihan
4
Dec
1

 
Nilai pilihan
172.16.134.61
Jalur
4

 
Nomer pilihan
55
 
1
Parameter jaringan dipénta ku klien. Komposisi bisa rupa-rupa

01 - Topeng jaringan
03 - Gerbang
06 - DNS
oc - Ngaran host
0f - ngaran domain jaringan
1c - alamat paménta siaran (siaran)
42 - Ngaran server TFTP
79 - Rute statik tanpa kelas

 
Panjang pilihan
8
 
1

 
Nilai pilihan
01:03:06:0c:0f:1c:42:79
 
8

 
Nomer pilihan
82
Dec
 
Pilihan 82, anu ngirimkeun alamat MAC tina alat repeater sareng sababaraha nilai tambahan.

Seringna, ieu mangrupikeun port switch dimana tungtung klien DHCP dijalankeun. Pilihan ieu ngandung parameter tambahan. Byte kahiji nyaéta jumlah "suboption", anu kadua nyaéta panjangna, teras nilaina.

Dina hal ieu, dina pilihan 82, sub-pilihan disarangkeun:
Agent Circuit ID = 00:04:00:01:00:04, dimana dua bait panungtungan nyaéta port klien DHCP ti mana pamundut sumping

Agen Jauh ID = 00:06: c8: janten: 19:93:11:48 - Alamat MAC tina alat pangulang DHCP

 
Panjang pilihan
18
Dec
 

 
Nilai pilihan
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Tungtung bungkusan
255
Dec
1
255 ngalambangkeun tungtung pakét

DHCPOFFER

Pas server nampi pakét DHCPDISCOVER sareng upami ningali yén éta tiasa nawiskeun klien hiji hal ti anu dipénta, maka éta ngahasilkeun réspon pikeun éta - DHCPDISCOVER. respon dikirim ka port "ti mana eta sumping", ku siaran, sabab Dina waktos ayeuna, klien teu acan gaduh alamat IP, ku kituna éta ngan tiasa nampi pakét upami dikirim ku siaran. Klién sadar yén ieu mangrupikeun pakét pikeun anjeunna ku alamat MAC na di jero pakét, ogé nomer transaksi anu anjeunna hasilkeun nalika pakét munggaran didamel.

DHCPOFFER Pakét Struktur Table

Posisi dina bungkusan
Ngaran nilai (umum)
conto
gagasan
Byte
Katerangan

1
Paménta boot
1
Hex
1
Jenis pesen. 1 - pamundut ti klien ka server, 2 - respon ti server ka klien

2
Jenis hardware
1
Hex
1
Jenis alamat hardware, dina protokol ieu 1 - MAC

3
panjangna alamat hardware
6
Hex
1
Panjang alamat MAC alat

4
Hops
1
Hex
1
Jumlah jalur panengah

5
KTP transaksi
23:cf:de:1d
Hex
4
Identifier urus unik. Dihasilkeun ku klien dina awal operasi pamundut

7
Kadua ngaliwat
0
Hex
4
Waktos dina detik ti mimiti prosés meunangkeun alamat

9
Bandéra boot
0
Hex
2
Bandéra anu tangtu anu tiasa disetél pikeun nunjukkeun parameter protokol. Dina hal ieu, 0 hartina tipe pamundut Unicast

11
Alamat IP klien
0.0.0.0
Jalur
4
Alamat IP klien (upami aya)

15
Alamat IP klien anjeun
172.16.134.61
Jalur
4
Alamat IP anu ditawarkeun ku server (upami sayogi)

19
Alamat IP pangladén salajengna
0.0.0.0
Jalur
4
Alamat IP server (upami terang)

23
Relay agén alamat IP
172.16.114.41
Jalur
4
Alamat IP agén relay (contona, saklar)

27
Alamat MAC klien
14:d6:4d:a7:c9:55
Hex
6
Alamat MAC pangirim pakét (klien)

31
padding alamat hardware klien
 
Hex
10
korsi dicadangkeun. Biasana dieusian ku nol

41
Ngaran host server
 
Jalur
64
Ngaran server DHCP. Biasana henteu ditularkeun

105
Ngaran file boot
 
Jalur
128
Ngaran koropak dina server dipaké ku stasiun diskless nalika booting

235
cookies magic
63: 82: 53: 63
Hex
4
Jumlah "Magic", numutkeun nu, incl. Anjeun bisa nangtukeun yén pakét ieu milik protokol DHCP

Pilihan DHCP. Bisa balik dina urutan naon

236
Nomer pilihan
53
Dec
1
Pilihan 53, nu nangtukeun tipe pakét DHCP 2 - DHCPOFFER

 
Panjang pilihan
1
Dec
1

 
Nilai pilihan
2
Dec
1

 
Nomer pilihan
1
Dec
1
Pilihan pikeun nawiskeun ka klien DHCP masker jaringan

 
Panjang pilihan
4
Dec
1

 
Nilai pilihan
255.255.224.0
Jalur
4

 
Nomer pilihan
3
Dec
1
Pilihan pikeun nawiskeun klien DHCP gateway standar

 
Panjang pilihan
4
Dec
1

 
Nilai pilihan
172.16.12.1
Jalur
4

 
Nomer pilihan
6
Dec
1
Pilihan pikeun nawiskeun DHCP ka klien DNS

 
Panjang pilihan
4
Dec
1

 
Nilai pilihan
8.8.8.8
Jalur
4

 
Nomer pilihan
51
Dec
1
Umur parameter jaringan anu dikaluarkeun dina sababaraha detik, saatos éta klien DHCP kedah naroskeun deui

 
Panjang pilihan
4
Dec
1

 
Nilai pilihan
86400
Dec
4

 
Nomer pilihan
82
Dec
1
Pilihan 82, repeats naon datang dina DHCPDISCOVER

 
Panjang pilihan
18
Dec
1

 
Nilai pilihan
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d: jsb
Dec
18

 
Tungtung bungkusan
255
Dec
1
255 ngalambangkeun tungtung pakét

DHCPREQUEST

Saatos klien narima DHCPOFFER, anjeunna ngabentuk hiji pakét requesting parameter jaringan teu sakabeh server DHCP dina jaringan, tapi ngan hiji husus, nu DHCPOFFER tawaran anjeunna paling "resep". Kriteria "kawas" tiasa béda-béda sareng gumantung kana palaksanaan DHCP klien. Panarima pamundut dieusian nganggo alamat MAC tina server DHCP. Ogé, pakét DHCPREQUEST tiasa dikirim ku klien tanpa ngahasilkeun DHCPDISCOVER heula, upami alamat IP pangladén parantos dicandak sateuacana.

DHCPREQUEST Pakét Struktur Table

Posisi dina bungkusan
Ngaran nilai (umum)
conto
gagasan
Byte
Katerangan

1
Paménta boot
1
Hex
1
Jenis pesen. 1 - pamundut ti klien ka server, 2 - respon ti server ka klien

2
Jenis hardware
1
Hex
1
Jenis alamat hardware, dina protokol ieu 1 - MAC

3
panjangna alamat hardware
6
Hex
1
Panjang alamat MAC alat

4
Hops
1
Hex
1
Jumlah jalur panengah

5
KTP transaksi
23:cf:de:1d
Hex
4
Identifier urus unik. Dihasilkeun ku klien dina awal operasi pamundut

7
Kadua ngaliwat
0
Hex
4
Waktos dina detik ti mimiti prosés meunangkeun alamat

9
Bandéra boot
8000
Hex
2
Bandéra anu tangtu anu tiasa disetél pikeun nunjukkeun parameter protokol. Dina hal ieu, "siaran" disetel

11
Alamat IP klien
0.0.0.0
Jalur
4
Alamat IP klien (upami aya)

15
Alamat IP klien anjeun
172.16.134.61
Jalur
4
Alamat IP anu ditawarkeun ku server (upami sayogi)

19
Alamat IP pangladén salajengna
0.0.0.0
Jalur
4
Alamat IP server (upami terang)

23
Relay agén alamat IP
172.16.114.41
Jalur
4
Alamat IP agén relay (contona, saklar)

27
Alamat MAC klien
14:d6:4d:a7:c9:55
Hex
6
Alamat MAC pangirim pakét (klien)

31
padding alamat hardware klien
 
Hex
10
korsi dicadangkeun. Biasana dieusian ku nol

41
Ngaran host server
 
Jalur
64
Ngaran server DHCP. Biasana henteu ditularkeun

105
Ngaran file boot
 
Jalur
128
Ngaran koropak dina server dipaké ku stasiun diskless nalika booting

235
cookies magic
63: 82: 53: 63
Hex
4
Jumlah "Magic", numutkeun nu, incl. Anjeun bisa nangtukeun yén pakét ieu milik protokol DHCP

Pilihan DHCP. Bisa balik dina urutan naon

236
Nomer pilihan
53
Dec
3
Pilihan 53, nu nangtukeun tipe pakét DHCP 3 - DHCPREQUEST

 
Panjang pilihan
1
Dec
1

 
Nilai pilihan
3
Dec
1

 
Nomer pilihan
61
Dec
1
ID klien: 01 (pikeun Ehernet) + alamat MAC klien

 
Panjang pilihan
7
Dec
1

 
Nilai pilihan
01:2c:ab:25:ff:72:a6
Hex
7

 
Nomer pilihan
60
Dec
 
"Identifier kelas vendor". Bisi kuring, éta ngalaporkeun versi klien DHCP. Panginten alat anu sanés ngabalikeun hal anu béda. Windows contona ngalaporkeun MSFT 5.0

 
Panjang pilihan
11
Dec
 

 
Nilai pilihan
udhcp 0.9.8
Jalur
 

 
Nomer pilihan
55
 
1
Parameter jaringan dipénta ku klien. Komposisi bisa rupa-rupa

01 - Topeng jaringan
03 - Gerbang
06 - DNS
oc - Ngaran host
0f - ngaran domain jaringan
1c - alamat paménta siaran (siaran)
42 - Ngaran server TFTP
79 - Rute statik tanpa kelas

 
Panjang pilihan
8
 
1

 
Nilai pilihan
01:03:06:0c:0f:1c:42:79
 
8

 
Nomer pilihan
82
Dec
1
Pilihan 82, repeats naon datang dina DHCPDISCOVER

 
Panjang pilihan
18
Dec
1

 
Nilai pilihan
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d: jsb
Dec
18

 
Tungtung bungkusan
255
Dec
1
255 ngalambangkeun tungtung pakét

DHCPACK

Salaku konfirmasi yén "enya, éta katuhu, ieu alamat IP anjeun, sarta kuring moal masihan kaluar ka saha wae" ti server DHCP, pakét dina format DHCPACK ti server ka klien ngawula. Éta dikirimkeun siaran sapertos pakét sanés. Sanajan, dina kode di handap pikeun server DHCP dilaksanakeun dina Python, ngan bisi, abdi duplikat sagala pamundut siaran ku ngirim pakét ka IP klien husus, lamun eta geus dipikawanoh. Leuwih ti éta, server DHCP teu paduli pisan naha pakét DHCPACK geus ngahontal klien nu. Upami klien henteu nampi DHCPACK, teras saatos sababaraha waktos éta ngan ukur ngulang DHCPREQUEST

DHCPACK Pakét Struktur Table

Posisi dina bungkusan
Ngaran nilai (umum)
conto
gagasan
Byte
Katerangan

1
Paménta boot
2
Hex
1
Jenis pesen. 1 - pamundut ti klien ka server, 2 - respon ti server ka klien

2
Jenis hardware
1
Hex
1
Jenis alamat hardware, dina protokol ieu 1 - MAC

3
panjangna alamat hardware
6
Hex
1
Panjang alamat MAC alat

4
Hops
1
Hex
1
Jumlah jalur panengah

5
KTP transaksi
23:cf:de:1d
Hex
4
Identifier urus unik. Dihasilkeun ku klien dina awal operasi pamundut

7
Kadua ngaliwat
0
Hex
4
Waktos dina detik ti mimiti prosés meunangkeun alamat

9
Bandéra boot
8000
Hex
2
Bandéra anu tangtu anu tiasa disetél pikeun nunjukkeun parameter protokol. Dina hal ieu, "siaran" disetel

11
Alamat IP klien
0.0.0.0
Jalur
4
Alamat IP klien (upami aya)

15
Alamat IP klien anjeun
172.16.134.61
Jalur
4
Alamat IP anu ditawarkeun ku server (upami sayogi)

19
Alamat IP pangladén salajengna
0.0.0.0
Jalur
4
Alamat IP server (upami terang)

23
Relay agén alamat IP
172.16.114.41
Jalur
4
Alamat IP agén relay (contona, saklar)

27
Alamat MAC klien
14:d6:4d:a7:c9:55
Hex
6
Alamat MAC pangirim pakét (klien)

31
padding alamat hardware klien
 
Hex
10
korsi dicadangkeun. Biasana dieusian ku nol

41
Ngaran host server
 
Jalur
64
Ngaran server DHCP. Biasana henteu ditularkeun

105
Ngaran file boot
 
Jalur
128
Ngaran koropak dina server dipaké ku stasiun diskless nalika booting

235
cookies magic
63: 82: 53: 63
Hex
4
Jumlah "Magic", numutkeun nu, incl. Anjeun bisa nangtukeun yén pakét ieu milik protokol DHCP

Pilihan DHCP. Bisa balik dina urutan naon

236
Nomer pilihan
53
Dec
3
Pilihan 53, nu nangtukeun tipe pakét DHCP 5 - DHCPACK

 
Panjang pilihan
1
Dec
1

 
Nilai pilihan
5
Dec
1

 
Nomer pilihan
1
Dec
1
Pilihan pikeun nawiskeun ka klien DHCP masker jaringan

 
Panjang pilihan
4
Dec
1

 
Nilai pilihan
255.255.224.0
Jalur
4

 
Nomer pilihan
3
Dec
1
Pilihan pikeun nawiskeun klien DHCP gateway standar

 
Panjang pilihan
4
Dec
1

 
Nilai pilihan
172.16.12.1
Jalur
4

 
Nomer pilihan
6
Dec
1
Pilihan pikeun nawiskeun DHCP ka klien DNS

 
Panjang pilihan
4
Dec
1

 
Nilai pilihan
8.8.8.8
Jalur
4

 
Nomer pilihan
51
Dec
1
Umur parameter jaringan anu dikaluarkeun dina sababaraha detik, saatos éta klien DHCP kedah naroskeun deui

 
Panjang pilihan
4
Dec
1

 
Nilai pilihan
86400
Dec
4

 
Nomer pilihan
82
Dec
1
Pilihan 82, repeats naon datang dina DHCPDISCOVER

 
Panjang pilihan
18
Dec
1

 
Nilai pilihan
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d: jsb
Dec
18

 
Tungtung bungkusan
255
Dec
1
255 ngalambangkeun tungtung pakét

setting

Pamasangan sabenerna diwangun ku masang modul python dipikabutuh pikeun digawé. Dianggap yén MySQL parantos dipasang sareng dikonpigurasi.

FreeBSD

pkg install python3 python3 -m ensurepip pip3 install mysql-konektor

Ubuntu

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

Urang nyieun database MySQL, unggah dump pydhcp.sql kana eta, sarta ngonpigurasikeun file konfigurasi.

Konfigurasi

Sadaya setélan pangladén aya dina file xml. File rujukan:

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 nguji nguji 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 pilih ip,mask,router,dns ti pamaké mana upper(mac)=upper('{option_3_AgentRemoteId_hex}') jeung upper(port)=upper('{option_1_AgentCircuitId_port_hex}') pilih ip,mask,router,dns ti pamaké mana upper(mac)=upper('{sw_mac}') jeung upper(port)=upper('{sw_port82}') pilih ip,mask,router,dns ti pamaké mana upper(mac)=upper('{ClientMacAddress}') selapkeun kana nilai sajarah (id,dt,mac,ip,comment) (null,ayeuna(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Ayeuna langkung rinci ngeunaan tag:

Bagian dhcpserver ngajelaskeun setélan dasar pikeun ngamimitian server, nyaéta:

  • host - alamat IP naon anu didangukeun ku server dina port 67
  • broadcast - mana ip nyaéta siaran pikeun DHCPOFFER sareng DHCPACK
  • DHCPServer - naon ip tina server DHCP
  • LeaseTime waktos ngajakan alamat IP anu dikaluarkeun
  • ThreadLimit - sabaraha threads ngajalankeun sakaligus pikeun ngolah pakét UDP asup dina port 67. Ieu sakuduna dituju pikeun mantuan dina proyék-beban tinggi 😉
  • defaultMask,defaultRouter,defaultDNS - naon anu ditawarkeun ka palanggan sacara standar upami IP kapanggih dina pangkalan data, tapi parameter tambahan henteu dieusian pikeun éta

bagian mysql:

host, ngaran pamaké, sandi, basename - sagalana speaks for sorangan. Struktur database perkiraan dipasang dina GitHub

Bagian pamundut: pamundut pikeun nampa OFFER/ACK dijelaskeun di dieu:

  • offer_count - jumlah garis kalawan requests nu balik hasil kawas ip,mask,router,dns
  • offer_n - string pamundut. Upami uih deui kosong, teras laksanakeun pamundut tawaran di handap ieu
  • history_sql - query nu nulis, contona, kana "riwayat otorisasi" pikeun palanggan.

Requests bisa ngawengku sagala variabel ti bagian pilihan atawa pilihan tina protokol DHCP.

bagian Pilihan. Ieu dimana nya meunang leuwih metot. Di dieu urang bisa nyieun variabel nu bisa dipaké engké dina bagian query.

Contona:

option_82_hex:sw_port1:20:22

, garis paréntah ieu nyokot sakabéh garis nu datang dina pilihan pamundut DHCP 82, dina format hex, dina rentang ti 20 nepi ka 22 bait inklusif sarta nempatkeun eta dina variabel anyar sw_port1 (switch port ti mana pamundut sumping).

option_82_hex:sw_mac:26:40

, nangtukeun variabel sw_mac, nyokot hex ti rentang 26:40

Anjeun tiasa ningali sadaya pilihan anu tiasa dianggo dina pamundut ku ngamimitian server nganggo saklar -d. Urang bakal ningali sapertos log ieu:

--pakét DHCPINFORM dugi ka port 67, ti 0025224ad764, b'x91xa5xe0xa3xa5xa9-x8fx8a', ('172.30.114.25', 68) {'ClientMacAddress': '0025224'764address00', 'BClientMacAddress': '7'91 5 d' , 'HType': 'Ethernet', 'HostName': b'x0xa3xe5xa9xa8xa8-x43fx0.0.0.0a', 'ReqListDNS': True, 'ReqListRomainName': True, 'ReqListPerfowmRouterDiscover': True, 'ReqListStatRouter': True, 'ReqListStatRouter': 'ReqListSubnetM nanya': Leres, 'ReqListVendorSpecInfo': 5.0, 'RequestedIpAddress': '0025224', 'Vendor': b'MSFT 764', 'chaddr': '172.30.128.13ad00', '00ad172.30.114.25', '308ad6', '1' , 'bandéra': 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': '12e tion_01_len': 06 00, 'option_04_str': "b'x00x01x00x06x02x08x00x06x00x1x9x2x768x0.0.0.0x001eXx589exb2xad'", 'hasil': Palsu, 'secs,' 'siaddr': '1', 'sw_mac': '06e89eb8ad', 'sw_port3': '897', 'xidbyte': b'

Sasuai, urang tiasa mungkus variabel naon waé dina {} sareng éta bakal dianggo dina pamundut SQL.

Hayu urang ngarékam sajarah yén klien nampi alamat IP:

DHCP + MySQL server dina Python

DHCP + MySQL server dina Python

Ngamimitian server

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

- d konsol kaluaran mode DEBUG
- c <ngaran koropak> file konfigurasi

Duka

Sareng ayeuna langkung rinci ngeunaan palaksanaan server dina Python. Éta nyeri. Python ieu diajar dina laleur. Seueur momen anu dilakukeun dina gaya "wow, kumaha waé kuring damel." Teu dioptimalkeun pisan, sarta ditinggalkeun dina formulir ieu utamana alatan saeutik pangalaman dina ngembangkeun Python. Kuring bakal Huni dina aspék paling narik tina palaksanaan server dina "kode".

Parser file konfigurasi XML

Modul Python baku xml.dom dipaké. Sigana basajan, tapi salila palaksanaan aya kurangna noticeable dokuméntasi jelas jeung conto dina jaringan ngagunakeun modul ieu.

    tangkal = minidom.parse (gconfig [ "config_file"]) mconfig = tree.getElementsByTagName ( "mysql") pikeun elem di mconfig: gconfig ["mysql_host"] = elem.getElementsByTagName ("host") [0].firstChild.data gconfig["mysql_username"]=elem.getElementsByTagName("username") [0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("sandi")[0].firstChild.data gconfig["mysql_basename"] = elem.getElementsByTagName ("basename") [0].firstChild.data dconfig = tree.getElementsByTagName ( "dhcpserver") pikeun elem dina 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["dhcp"_default = elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDNS"]=elem.getNameElementsBy defaultDNS") [0] .firstChild.data qconfig = tree.getElementsByTagName ("query") pikeun elém di qconfig: gconfig ["offer_count"] = elem.getElementsByTagName ("offer_count") [0].firstChild.data pikeun num di rentang (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 ("pilihan") pikeun elem dina pilihan: titik = elem.getElementsByTagName ("pilihan") pikeun pilihan dina node : optionsMod.append(options.firstChild.data)

Multithreading

Cukup Oddly, multithreading di Python dilaksanakeun pisan jelas tur basajan.

def PacketWork(data, addr): ... # palaksanaan parsing pakét asup tur ngarespon kana eta ... bari Leres: data, addr = udp_socket.recvfrom (1024) # ngantosan UDP pakét thread = threading.Thread ( target = PacketWork, args = (data, addr,)) .start () # sakumaha eta sumping - urang ngajalankeun fungsi PacketWork diartikeun saméméhna di tukang jeung parameter bari threading.active_count () > gconfig ["dhcp_ThreadLimit"]: waktu. sleep(1) # lamun jumlahna Aya leuwih threads geus ngajalankeun ti dina setélan, urang antosan dugi aya pangsaeutikna sahijina

Nampi / ngirim pakét DHCP

Pikeun ngahalangan pakét UDP anu ngalangkungan kartu jaringan, anjeun kedah "ngangkat" stop kontak:

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

, dimana bandéra nyaéta:

  • AF_INET - hartina format alamat bakal IP: port. Aya ogé AF_UNIX - dimana alamatna dirumuskeun ku nami file.
  • SOCK_DGRAM - ngandung harti yén kami henteu nampi "pakét atah", tapi anu parantos ngalangkungan firewall, sareng nganggo pakét sawaréh dipangkas. Jelema. kami nampi ngan hiji pakét UDP tanpa komponén "fisik" tina bungkus pakét UDP. Upami anjeun nganggo bandéra SOCK_RAW, anjeun ogé kedah ngungkabkeun "wrapper" ieu.

Ngirim pakét tiasa sapertos siaran:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #switch stop kontak kana mode siaran rz=udp_socket.sendto(packetack, (gconfig ["broadcast"],68))

, sareng ka alamat "timana bungkusan asalna":

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # pindah stop kontak ka modeu multi listener rz=udp_socket.sendto(packetack, addr)

, dimana SOL_SOCKET hartina "tingkat protokol" pikeun pilihan setelan,

, SO_BROADCAST pilihan yén pakét helm "siaran"

  ,Pilihan SO_REUSEADDR ngalihkeun stop kontak ka modeu "loba pamirsa". Dina tiori, éta teu perlu dina hal ieu, tapi dina salah sahiji server FreeBSD nu kuring diuji, kode nu teu jalan tanpa pilihan ieu.

Parsing pakét DHCP

Ieu dimana Nyaan resep Python. Tétéla éta out of the box ngamungkinkeun anjeun rada fléksibel sareng bytecode. Ngidinan éta gampang pisan ditarjamahkeun kana nilai perpuluhan, string sareng hex - i.e. Ieu naon sabenerna urang kudu ngarti struktur pakét. Janten, contona, anjeun tiasa nampi sajumlah bait dina HEX sareng ngan ukur bait:

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

, pak bait kana struktur:

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

Kéngingkeun IP tina struktur:

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

Jeung sabalikna:

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

Sakitu wae kanggo ayeuna 😉

sumber: www.habr.com

Tambahkeun komentar