Server DHCP + MySQL ing Python

Server DHCP + MySQL ing Python

Tujuan proyek iki yaiku:

  • Sinau babagan DHCP ing jaringan IPv4
  • Sinau Python (luwih sethithik tinimbang saka awal 😉)
  • panggantos server DB2DHCP (garpuku), asli kene, kang dadi liyane lan liyane angel kanggo ngumpul kanggo OS anyar. Lan aku ora seneng yen iki minangka binar sing ora ana cara kanggo "ngganti saiki"
  • entuk server DHCP sing bisa digunakake kanthi kemampuan kanggo milih alamat IP pelanggan nggunakake mac utawa ngalih kombinasi port mac + port (Opsi 82)
  • nulis sepeda liyane (Oh! iki kegiatan favoritku)
  • nampa komentar babagan klub-tangan sampeyan ing Habrahabr (utawa luwih apik, undhangan) 😉

Asil: kerjane 😉 Dites ing FreeBSD lan OS Ubuntu. Secara teoritis, kode kasebut bisa dijaluk bisa digunakake ing OS apa wae, amarga Ora ana ikatan khusus ing kode kasebut.
Ati-ati! Ana akeh liyane sing bakal teka.

Link menyang repositori kanggo amatir "tutul urip".

Proses nginstal, konfigurasi lan nggunakake asil "sinau hardware" luwih murah, lan banjur teori sethitik babagan protokol DHCP. Kanggo aku. Lan kanggo sejarah 😉

A teori sethitik

Apa iku DHCP

Iki minangka protokol jaringan sing ngidini piranti ngerteni alamat IP (lan paramèter liyane kaya gateway, DNS, lsp.) saka server DHCP. Paket diijolke nggunakake protokol UDP. Prinsip umum operasi piranti nalika njaluk paramèter jaringan kaya ing ngisor iki:

  1. Piranti kasebut (klien) ngirim panjaluk siaran UDP (DHCPDISCOVER) ing saindenging jaringan kanthi panjaluk "ya, ana sing menehi alamat IP." Menapa malih, biasane (nanging ora mesthi) panjaluk kasebut dumadi saka port 68 (sumber), lan tujuane yaiku port 67 (tujuan). Sawetara piranti uga ngirim paket saka port 67. Alamat MAC piranti klien kalebu ing paket DHCPDISCOVER.
  2. Kabeh server DHCP dumunung ing jaringan (lan ana uga sawetara) mbentuk tawaran DHCPOFFER karo setelan jaringan kanggo piranti sing dikirim DHCPDISCOVER, lan uga siaran liwat jaringan. Identifikasi kanggo sapa paket iki adhedhasar alamat MAC klien sing diwenehake sadurunge ing panyuwunan DHCPDISCOVER.
  3. Klien nampa paket kanthi proposal kanggo setelan jaringan, milih sing paling menarik (kritéria bisa uga beda-beda, contone, wektu pangiriman paket, jumlah rute penengah), lan nggawe "panyuwunan resmi" DHCPREQUEST karo setelan jaringan. saka server DHCP seneng. Ing kasus iki, paket kasebut menyang server DHCP tartamtu.
  4. Server sing nampa DHCPREQUEST ngirim paket format DHCPACK, ing ngendi maneh nampilake setelan jaringan sing dimaksudake kanggo klien iki.

Server DHCP + MySQL ing Python

Kajaba iku, ana paket DHCPINFORM sing teka saka klien, lan tujuane kanggo ngandhani server DHCP yen "klien urip" lan nggunakake setelan jaringan sing ditanggepi. Ing implementasine server iki, paket kasebut ora digatekake.

Format paket

Umumé, pigura paket Ethernet katon kaya iki:

Server DHCP + MySQL ing Python

Ing kasus kita, kita mung bakal nimbang data langsung saka isi paket UDP, tanpa header protokol lapisan OSI, yaiku struktur DHCP:

DHCPDDISKOVER

Dadi, proses entuk alamat IP kanggo piranti diwiwiti kanthi klien DHCP ngirim panjalukan siaran saka port 68 menyang 255.255.255.255:67. Ing paket iki, klien kalebu alamat MAC, uga apa persis sing pengin ditampa saka server DHCP. Struktur paket diterangake ing tabel ing ngisor iki.

DHCPDISCOVER Tabel Struktur Paket

Posisi ing paket
Jeneng Nilai
Conto:
Pambuka
Byte
Panjelasan

1
Panjaluk Boot
1
hex
1
Jinis pesen. 1 - panjalukan saka klien menyang server, 2 - respon saka server menyang klien

2
Tipe hardware
1
hex
1
Jinis alamat hardware, ing protokol iki 1 - MAC

3
dawa alamat hardware
6
hex
1
dawa alamat MAC piranti

4
Hops
1
hex
1
Jumlah rute penengah

5
ID transaksi
23:cf:d:1d
hex
4
Pengenal transaksi unik. Digawe dening klien ing wiwitan operasi panyuwunan

7
Kapindho liwati
0
hex
4
Wektu ing detik saka wiwitan proses entuk alamat

9
Gendéra boot
0
hex
2
Gendéra tartamtu sing bisa disetel kanggo nunjukake parameter protokol

11
Alamat IP klien
0.0.0.0
Senar
4
Alamat IP klien (yen ana)

15
Alamat IP klien sampeyan
0.0.0.0
Senar
4
Alamat IP sing ditawakake server (yen kasedhiya)

19
Alamat IP server sabanjure
0.0.0.0
Senar
4
Alamat IP server (yen dikenal)

23
Alamat IP agen relay
172.16.114.41
Senar
4
Alamat IP saka agen relay (contone, switch)

27
Alamat MAC klien
14:d6:4d:a7:c9:55
hex
6
Alamat MAC pangirim paket (klien)

31
padding alamat hardware klien
 
hex
10
Kursi cadangan. Biasane diisi karo nol

41
Jeneng host server
 
Senar
64
jeneng server DHCP. Biasane ora ditularake

105
Jeneng berkas boot
 
Senar
128
Jeneng berkas ing server sing digunakake dening stasiun tanpa disk nalika booting

235
Cookie ajaib
63: 82: 53: 63
hex
4
"Magic" nomer, miturut kang, kalebu. sampeyan bisa nemtokake manawa paket iki kalebu protokol DHCP

Pilihan DHCP. Bisa pindhah ing sembarang urutan

236
Nomer pilihan
53
Dec
1
Opsi 53, sing nemtokake jinis paket DHCP

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

 
Pilihan dawa
1
Dec
1

 
Nilai pilihan
1
Dec
1

 
Nomer pilihan
50
Dec
1
Apa alamat IP sing pengin ditampa klien?

 
Pilihan dawa
4
Dec
1

 
Nilai pilihan
172.16.134.61
Senar
4

 
Nomer pilihan
55
 
1
Parameter jaringan sing dijaluk dening klien. Komposisi bisa beda-beda

01 - Topeng jaringan
03 - Lawang
06 - DNS
oc - Jeneng inang
0f - jeneng domain jaringan
1c - alamat panyuwunan siaran (siaran)
42 - jeneng server TFTP
79 - Rute Statis Tanpa Kelas

 
Pilihan dawa
8
 
1

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

 
Nomer pilihan
82
Dec
 
Opsi 82, sing ngirim alamat MAC piranti repeater lan sawetara nilai tambahan.

Paling asring, iki minangka port switch ing ngendi klien DHCP pungkasan mlaku. Opsi iki ngemot paramèter tambahan. Byte pisanan yaiku nomer "suboption", sing kapindho yaiku dawane, banjur regane.

Ing kasus iki, ing opsi 82, sub-opsi disusun:
Agent Circuit ID = 00:04:00:01:00:04, ing ngendi rong bita pungkasan minangka port klien DHCP saka ngendi panjaluk kasebut teka

ID Remote Agen = 00:06:c8:be:19:93:11:48 - Alamat MAC piranti DHCP repeater

 
Pilihan dawa
18
Dec
 

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

 
Pungkasan paket
255
Dec
1
255 nglambangake mburi paket

DHCPOFFER

Sanalika server nampa paket DHCPDISCOVER lan yen weruh sing bisa kurban klien soko saka sing dijaluk, banjur njedulake respon kanggo iku - DHCPDISCOVER. Tanggepan dikirim menyang port "saka ngendi teka", dening siaran, amarga ing wektu iki, klien durung duwe alamat IP, mula mung bisa nampa paket kasebut yen dikirim kanthi siaran. Klien ngerteni manawa iki minangka paket kanggo dheweke kanthi alamat MAC ing paket kasebut, uga nomer transaksi sing digawe nalika paket pisanan digawe.

Tabel Struktur Paket DHCPOFFER

Posisi ing paket
Jeneng nilai (umum)
Conto:
Pambuka
Byte
Panjelasan

1
Panjaluk Boot
1
hex
1
Jinis pesen. 1 - panjalukan saka klien menyang server, 2 - respon saka server menyang klien

2
Tipe hardware
1
hex
1
Jinis alamat hardware, ing protokol iki 1 - MAC

3
dawa alamat hardware
6
hex
1
dawa alamat MAC piranti

4
Hops
1
hex
1
Jumlah rute penengah

5
ID transaksi
23:cf:d:1d
hex
4
Pengenal transaksi unik. Digawe dening klien ing wiwitan operasi panyuwunan

7
Kapindho liwati
0
hex
4
Wektu ing detik saka wiwitan proses entuk alamat

9
Gendéra boot
0
hex
2
Gendéra tartamtu sing bisa disetel kanggo nunjukake parameter protokol. Ing kasus iki, 0 tegese jinis panjalukan Unicast

11
Alamat IP klien
0.0.0.0
Senar
4
Alamat IP klien (yen ana)

15
Alamat IP klien sampeyan
172.16.134.61
Senar
4
Alamat IP sing ditawakake server (yen kasedhiya)

19
Alamat IP server sabanjure
0.0.0.0
Senar
4
Alamat IP server (yen dikenal)

23
Alamat IP agen relay
172.16.114.41
Senar
4
Alamat IP saka agen relay (contone, switch)

27
Alamat MAC klien
14:d6:4d:a7:c9:55
hex
6
Alamat MAC pangirim paket (klien)

31
padding alamat hardware klien
 
hex
10
Kursi cadangan. Biasane diisi karo nol

41
Jeneng host server
 
Senar
64
jeneng server DHCP. Biasane ora ditularake

105
Jeneng berkas boot
 
Senar
128
Jeneng berkas ing server sing digunakake dening stasiun tanpa disk nalika booting

235
Cookie ajaib
63: 82: 53: 63
hex
4
"Magic" nomer, miturut kang, kalebu. sampeyan bisa nemtokake manawa paket iki kalebu protokol DHCP

Pilihan DHCP. Bisa pindhah ing sembarang urutan

236
Nomer pilihan
53
Dec
1
Opsi 53, sing nemtokake jinis paket DHCP 2 - DHCPOFFER

 
Pilihan dawa
1
Dec
1

 
Nilai pilihan
2
Dec
1

 
Nomer pilihan
1
Dec
1
Pilihan kanggo nawakake klien DHCP topeng jaringan

 
Pilihan dawa
4
Dec
1

 
Nilai pilihan
255.255.224.0
Senar
4

 
Nomer pilihan
3
Dec
1
Pilihan kanggo nawakake klien DHCP gateway standar

 
Pilihan dawa
4
Dec
1

 
Nilai pilihan
172.16.12.1
Senar
4

 
Nomer pilihan
6
Dec
1
Opsi kanggo nawakake DHCP menyang klien DNS

 
Pilihan dawa
4
Dec
1

 
Nilai pilihan
8.8.8.8
Senar
4

 
Nomer pilihan
51
Dec
1
Umur parameter jaringan sing ditanggepi sajrone sawetara detik, sawise klien DHCP kudu njaluk maneh

 
Pilihan dawa
4
Dec
1

 
Nilai pilihan
86400
Dec
4

 
Nomer pilihan
82
Dec
1
Pilihan 82, mbaleni apa sing teka ing DHCPDISCOVER

 
Pilihan dawa
18
Dec
1

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

 
Pungkasan paket
255
Dec
1
255 nglambangake mburi paket

DHCPREQUEST

Sawise klien nampa DHCPOFFER, dheweke nggawe paket sing njaluk paramèter jaringan ora kanggo kabeh server DHCP ing jaringan, nanging mung kanggo siji tartamtu, kang DHCPOFFER tawaran kang "disenengi" paling. Kriteria "kaya" bisa beda-beda lan gumantung marang implementasi DHCP klien. Panampa panjaluk kasebut ditemtokake nggunakake alamat MAC saka server DHCP. Uga, paket DHCPREQUEST bisa dikirim dening klien tanpa ngasilake DHCPDISCOVER, yen alamat IP server wis dipikolehi sadurunge.

Tabel Struktur Paket DHCPREQUEST

Posisi ing paket
Jeneng nilai (umum)
Conto:
Pambuka
Byte
Panjelasan

1
Panjaluk Boot
1
hex
1
Jinis pesen. 1 - panjalukan saka klien menyang server, 2 - respon saka server menyang klien

2
Tipe hardware
1
hex
1
Jinis alamat hardware, ing protokol iki 1 - MAC

3
dawa alamat hardware
6
hex
1
dawa alamat MAC piranti

4
Hops
1
hex
1
Jumlah rute penengah

5
ID transaksi
23:cf:d:1d
hex
4
Pengenal transaksi unik. Digawe dening klien ing wiwitan operasi panyuwunan

7
Kapindho liwati
0
hex
4
Wektu ing detik saka wiwitan proses entuk alamat

9
Gendéra boot
8000
hex
2
Gendéra tartamtu sing bisa disetel kanggo nunjukake parameter protokol. Ing kasus iki, "siaran" disetel

11
Alamat IP klien
0.0.0.0
Senar
4
Alamat IP klien (yen ana)

15
Alamat IP klien sampeyan
172.16.134.61
Senar
4
Alamat IP sing ditawakake server (yen kasedhiya)

19
Alamat IP server sabanjure
0.0.0.0
Senar
4
Alamat IP server (yen dikenal)

23
Alamat IP agen relay
172.16.114.41
Senar
4
Alamat IP saka agen relay (contone, switch)

27
Alamat MAC klien
14:d6:4d:a7:c9:55
hex
6
Alamat MAC pangirim paket (klien)

31
padding alamat hardware klien
 
hex
10
Kursi cadangan. Biasane diisi karo nol

41
Jeneng host server
 
Senar
64
jeneng server DHCP. Biasane ora ditularake

105
Jeneng berkas boot
 
Senar
128
Jeneng berkas ing server sing digunakake dening stasiun tanpa disk nalika booting

235
Cookie ajaib
63: 82: 53: 63
hex
4
"Magic" nomer, miturut kang, kalebu. sampeyan bisa nemtokake manawa paket iki kalebu protokol DHCP

Pilihan DHCP. Bisa pindhah ing sembarang urutan

236
Nomer pilihan
53
Dec
3
Opsi 53, sing nemtokake jinis paket DHCP 3 - DHCPREQUEST

 
Pilihan dawa
1
Dec
1

 
Nilai pilihan
3
Dec
1

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

 
Pilihan dawa
7
Dec
1

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

 
Nomer pilihan
60
Dec
 
"Pengenal kelas vendor". Ing kasusku, laporan versi klien DHCP. Mungkin piranti liyane ngasilake sing beda. Windows contone laporan MSFT 5.0

 
Pilihan dawa
11
Dec
 

 
Nilai pilihan
udhcp 0.9.8
Senar
 

 
Nomer pilihan
55
 
1
Parameter jaringan sing dijaluk dening klien. Komposisi bisa beda-beda

01 - Topeng jaringan
03 - Lawang
06 - DNS
oc - Jeneng inang
0f - jeneng domain jaringan
1c - alamat panyuwunan siaran (siaran)
42 - jeneng server TFTP
79 - Rute Statis Tanpa Kelas

 
Pilihan dawa
8
 
1

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

 
Nomer pilihan
82
Dec
1
Pilihan 82, mbaleni apa sing teka ing DHCPDISCOVER

 
Pilihan dawa
18
Dec
1

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

 
Pungkasan paket
255
Dec
1
255 nglambangake mburi paket

DHCPACK

Minangka konfirmasi sing "ya, iku bener, iki alamat IP, lan aku ora bakal menehi metu kanggo wong liya" saka server DHCP, paket ing format DHCPACK saka server kanggo klien serves. Iki dikirim siaran kaya paket liyane. Senajan, ing kode ing ngisor iki kanggo server DHCP dipun ginakaken ing Python, mung ing kasus, Aku duplikat request siaran dening ngirim paket menyang IP klien tartamtu, yen wis dikenal. Kajaba iku, server DHCP ora peduli apa paket DHCPACK wis tekan klien. Yen klien ora nampa DHCPACK, banjur sawise sawetara wektu mung mbaleni DHCPREQUEST

Tabel Struktur Paket DHCPACK

Posisi ing paket
Jeneng nilai (umum)
Conto:
Pambuka
Byte
Panjelasan

1
Panjaluk Boot
2
hex
1
Jinis pesen. 1 - panjalukan saka klien menyang server, 2 - respon saka server menyang klien

2
Tipe hardware
1
hex
1
Jinis alamat hardware, ing protokol iki 1 - MAC

3
dawa alamat hardware
6
hex
1
dawa alamat MAC piranti

4
Hops
1
hex
1
Jumlah rute penengah

5
ID transaksi
23:cf:d:1d
hex
4
Pengenal transaksi unik. Digawe dening klien ing wiwitan operasi panyuwunan

7
Kapindho liwati
0
hex
4
Wektu ing detik saka wiwitan proses entuk alamat

9
Gendéra boot
8000
hex
2
Gendéra tartamtu sing bisa disetel kanggo nunjukake parameter protokol. Ing kasus iki, "siaran" disetel

11
Alamat IP klien
0.0.0.0
Senar
4
Alamat IP klien (yen ana)

15
Alamat IP klien sampeyan
172.16.134.61
Senar
4
Alamat IP sing ditawakake server (yen kasedhiya)

19
Alamat IP server sabanjure
0.0.0.0
Senar
4
Alamat IP server (yen dikenal)

23
Alamat IP agen relay
172.16.114.41
Senar
4
Alamat IP saka agen relay (contone, switch)

27
Alamat MAC klien
14:d6:4d:a7:c9:55
hex
6
Alamat MAC pangirim paket (klien)

31
padding alamat hardware klien
 
hex
10
Kursi cadangan. Biasane diisi karo nol

41
Jeneng host server
 
Senar
64
jeneng server DHCP. Biasane ora ditularake

105
Jeneng berkas boot
 
Senar
128
Jeneng berkas ing server sing digunakake dening stasiun tanpa disk nalika booting

235
Cookie ajaib
63: 82: 53: 63
hex
4
"Magic" nomer, miturut kang, kalebu. sampeyan bisa nemtokake manawa paket iki kalebu protokol DHCP

Pilihan DHCP. Bisa pindhah ing sembarang urutan

236
Nomer pilihan
53
Dec
3
Opsi 53, sing nemtokake jinis paket DHCP 5 - DHCPACK

 
Pilihan dawa
1
Dec
1

 
Nilai pilihan
5
Dec
1

 
Nomer pilihan
1
Dec
1
Pilihan kanggo nawakake klien DHCP topeng jaringan

 
Pilihan dawa
4
Dec
1

 
Nilai pilihan
255.255.224.0
Senar
4

 
Nomer pilihan
3
Dec
1
Pilihan kanggo nawakake klien DHCP gateway standar

 
Pilihan dawa
4
Dec
1

 
Nilai pilihan
172.16.12.1
Senar
4

 
Nomer pilihan
6
Dec
1
Opsi kanggo nawakake DHCP menyang klien DNS

 
Pilihan dawa
4
Dec
1

 
Nilai pilihan
8.8.8.8
Senar
4

 
Nomer pilihan
51
Dec
1
Umur parameter jaringan sing ditanggepi sajrone sawetara detik, sawise klien DHCP kudu njaluk maneh

 
Pilihan dawa
4
Dec
1

 
Nilai pilihan
86400
Dec
4

 
Nomer pilihan
82
Dec
1
Pilihan 82, mbaleni apa sing teka ing DHCPDISCOVER

 
Pilihan dawa
18
Dec
1

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

 
Pungkasan paket
255
Dec
1
255 nglambangake mburi paket

Instalasi

Instalasi kasebut kalebu nginstal modul python sing dibutuhake kanggo kerja. Dianggep yen MySQL wis diinstal lan dikonfigurasi.

FreeBSD

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

ubuntu

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

Kita nggawe database MySQL, upload pydhcp.sql dump menyang, lan ngatur file konfigurasi.

Konfigurasi

Kabeh setelan server ana ing file xml. File referensi:

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 tes tes 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 saka pangguna ngendi upper(mac)=upper('{option_3_AgentRemoteId_hex}') lan upper(port)=upper('{option_1_AgentCircuitId_port_hex}') pilih ip,mask,router,dns saka pangguna ngendi upper(mac)=upper('{sw_mac}') lan upper(port)=upper('{sw_port82}') pilih ip,mask,router,dns saka pangguna ngendi upper(mac)=upper('{ClientMacAddress}') lebokake nilai sejarah (id,dt,mac,ip,comment) (null, now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Saiki luwih rinci babagan tag:

Bagean dhcpserver nggambarake setelan dhasar kanggo miwiti server, yaiku:

  • host - alamat IP apa sing dirungokake server ing port 67
  • broadcast - ip yaiku siaran kanggo DHCPOFFER lan DHCPACK
  • DHCPServer - apa ip saka server DHCP
  • LeaseTime wektu sewa alamat IP sing ditanggepi
  • ThreadLimit - pirang-pirang utas sing mlaku bebarengan kanggo ngolah paket UDP sing mlebu ing port 67. Iku mesthine kanggo mbantu proyek kanthi beban dhuwur 😉
  • defaultMask,defaultRouter,defaultDNS - apa sing ditawakake kanggo pelanggan kanthi standar yen IP ditemokake ing basis data, nanging paramèter tambahan ora ditemtokake kanggo kasebut

bagean mysql:

host, jeneng panganggo, sandi, basename - kabeh ngandika kanggo dhewe. Struktur database kira-kira dikirim ing GitHub

Bagean pitakon: panjalukan kanggo nampa OFFER/ACK diterangake ing kene:

  • offer_count - jumlah baris kanthi panjalukan sing ngasilake asil kaya ip,mask,router,dns
  • offer_n - string pitakon. Yen bali kosong, banjur tindakake panjalukan tawaran ing ngisor iki
  • history_sql - pitakon sing nulis, contone, menyang "riwayat wewenang" kanggo pelanggan

Panjaluk bisa kalebu variabel saka bagean opsi utawa opsi saka protokol DHCP.

bagean Pilihan. Iki ngendi iku dadi luwih menarik. Ing kene kita bisa nggawe variabel sing bisa digunakake mengko ing bagean pitakon.

Contone:

option_82_hex:sw_port1:20:22

, baris printah iki njupuk kabeh baris sing teka ing pilihan panyuwunan DHCP 82, ing format hex, ing kisaran saka 20 kanggo 22 bita klebu lan sijine ing variabel anyar sw_port1 (ngalih port saka ngendi request teka)

option_82_hex:sw_mac:26:40

, nemtokake variabel sw_mac, njupuk hex saka sawetara 26:40

Sampeyan bisa ndeleng kabeh opsi sing bisa digunakake ing pitakon kanthi miwiti server nganggo saklar -d. Kita bakal weruh kaya log iki:

--paket DHCPINFORM teka ing port 67, saka 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, 'L TruistRouter,'ReqListRouter: 'ReqListSubnetM takon': Bener, 'ReqListVendorSpecInfo': 5.0, 'RequestedIpAddress': '0025224', 'Vendor': b'MSFT 764', 'chaddr': '172.30.128.13ad00', '00ad172.30.114.25', '308ad6', '1. , 'flags': b'x82x12', 'giaddr': '12', 'gpoz': 53, 'hlen': 53, 'hops': 55, 'htype': 'MAC', 'magic_cookie': b'cx55Sc ', 'op': 'DHCPINFORM', 'option60': 60, 'option61': 61, 'option82': 82, 'option82': 12, 'option01': 06, 'option00': 04, ' option_00_byte': b'x01x00x06x02x08x00x06x00x1x9x2x82' b'x12010600040001000602080006001x589x2eXx82exb18xad', 'option_82_hex': '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'

Mula, kita bisa mbungkus variabel apa wae ing {} lan bakal digunakake ing query SQL.

Ayo kita nyathet riwayat yen klien nampa alamat IP:

Server DHCP + MySQL ing Python

Server DHCP + MySQL ing Python

Miwiti server

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

— d konsol output mode DEBUG
- c <filename> file konfigurasi

Ringkesan

Lan saiki luwih rinci babagan ngleksanakake server ing Python. Iku pain. Python sinau ing fly. Akeh momen sing digawe kanthi gaya "wow, piye wae aku bisa." Ora optimized ing kabeh, lan kiwa ing wangun iki utamané amarga sethitik pengalaman ing pembangunan Python. Aku bakal manggon ing aspèk paling menarik saka implementasine server ing "kode".

parser file konfigurasi XML

Modul Python standar xml.dom digunakake. Iku misale jek prasaja, nanging sak implementasine ana lack ngelingke saka dokumentasi cetha lan conto ing jaringan nggunakake modul iki.

    wit = minidom.parse(gconfig["config_file"]) mconfig = tree.getElementsByTagName("mysql") kanggo elem ing 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") kanggo elem ing 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["sk"_default =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDNS"]=elem.getNamaElementsBy defaultDNS") [0].firstChild.data qconfig = tree.getElementsByTagName("query") kanggo elem ing qconfig: gconfig ["offer_count"] = elem.getElementsByTagName ("offer_count") [0].firstChild.data kanggo num ing 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("opsi") kanggo elem ing opsi: node = elem.getElementsByTagName("opsi") kanggo opsi ing simpul : optionsMod.append(options.firstChild.data)

Multithreading

Anehe, multithreading ing Python diimplementasikake kanthi jelas lan gampang.

def PacketWork(data,addr): ... # implementasi parsing paket mlebu lan nanggapi ... nalika True: data, addr = udp_socket.recvfrom(1024) # ngenteni UDP paket thread = threading. target = PacketWork, args = (data, addr,)).miwiti () # minangka teka - kita miwiti fungsi PacketWork ditetepake sadurunge ing latar mburi karo paramèter nalika threading.active_count () > gconfig ["dhcp_ThreadLimit"]: wektu. sleep(1) # yen nomer Ana luwih akeh utas sing wis mlaku tinimbang ing setelan, kita ngenteni nganti ana luwih sithik.

Nampa / ngirim paket DHCP

Kanggo nyegat paket UDP liwat kertu jaringan, sampeyan kudu "ngunggahake" soket:

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

, ing ngendi gendera kasebut:

  • AF_INET - tegese format alamat IP: port. Ana uga AF_UNIX - ngendi alamat diwenehi jeneng berkas.
  • SOCK_DGRAM - tegese kita ora nampa "paket mentahan", nanging sing wis liwati liwat firewall, lan karo paket sebagian apik. Sing. kita nampa mung paket UDP tanpa komponen "fisik" saka pambungkus paket UDP. Yen sampeyan nggunakake flag SOCK_RAW, sampeyan uga kudu ngurai "wrapper" iki.

Ngirim paket bisa kaya siaran:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #ngalih soket menyang mode siaran rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

, lan menyang alamat "endi paket kasebut teka":

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # ngalih soket menyang mode multi-pendengar rz=udp_socket.sendto(packetack, addr)

, ing ngendi SOL_SOCKET tegese "tingkat protokol" kanggo pilihan setelan,

, SO_BROADCAST opsi yen paket helm "siar"

  , Opsi SO_REUSEADDR ngalih soket menyang mode "akeh pamireng". Ing teori, ora perlu ing kasus iki, nanging ing salah sawijining server FreeBSD sing dites, kode kasebut ora bisa digunakake tanpa pilihan iki.

Parsing paket DHCP

Iki ngendi aku pancene disenengi Python. Pranyata metu sing metu saka kothak ngidini sampeyan dadi cukup fleksibel karo bytecode. Ngidini supaya gampang banget diterjemahake menyang angka desimal, strings lan hex - i.e. iki apa bener kita kudu ngerti struktur paket. Dadi, contone, sampeyan bisa entuk sawetara bita ing HEX lan mung bita:

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

, ngemas bita menyang struktur:

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

Entuk IP saka struktur:

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

Lan kosok balene:

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

Semono wae 😉

Source: www.habr.com

Add a comment