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:
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.
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.
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.
Pangladén anu nampi DHCPREQUEST ngirim pakét format DHCPACK, dimana éta daptar deui setélan jaringan anu dimaksudkeun pikeun klien ieu.
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:
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
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.
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:
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:
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:
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.
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: