Python da DHCP + Mysql serveri

Python da DHCP + Mysql serveri

Ushbu loyihaning maqsadi:

  • IPv4 tarmog'ida DHCP haqida o'rganish
  • Python tilini o'rganish (noldan biroz ko'proq😉)
  • serverni almashtirish DB2DHCP (mening vilkalarim), asl shu yerda, bu yangi OS uchun yig'ish tobora qiyinlashib bormoqda. Va menga bu ikkilik ekanligini yoqtirmayman, "hozir o'zgartirish" uchun hech qanday yo'l yo'q.
  • abonentning mac-dan foydalangan holda abonentning IP-manzilini tanlash yoki mac+port kombinatsiyasini almashtirish imkoniyatiga ega ishlaydigan DHCP serverini olish (variant 82)
  • boshqa velosiped yozish (Oh! bu mening sevimli mashg'ulotim)
  • Xabrahabr-da klubni qo'llaganligingiz haqida fikr-mulohazalarni qabul qilish (yoki undan ham yaxshisi, taklif) 😉

Natija: u ishlaydi 😉 FreeBSD va Ubuntu OS da sinovdan o'tgan. Nazariy jihatdan, kodni har qanday OS ostida ishlashni so'rash mumkin, chunki Kodda hech qanday maxsus bog'lanishlar mavjud emas.
Ehtiyotkorlik bilan! Oldinda yana ko'p narsalar bor.

Havaskorlar uchun omborga havola "tirik teginish".

"Uskunani o'rganish" natijasini o'rnatish, sozlash va ishlatish jarayoni ancha past, keyin esa DHCP protokoli haqida bir oz nazariya. O'zingiz uchun. Va tarix uchun 😉

Bir oz nazariya

DHCP nima

Bu tarmoq protokoli boʻlib, qurilmaga oʻzining IP manzilini (va shlyuz, DNS va boshqalar kabi boshqa parametrlarni) DHCP serveridan aniqlash imkonini beradi. Paketlarni almashtirish UDP protokoli yordamida amalga oshiriladi. Tarmoq parametrlarini so'rashda qurilmaning umumiy ishlash printsipi quyidagicha:

  1. Qurilma (mijoz) tarmoq bo'ylab UDP eshittirish so'rovini (DHCPDISCOVER) "yaxshi, kimdir menga IP manzilini bering" so'rovi bilan yuboradi. Bundan tashqari, odatda (lekin har doim ham emas) so'rov 68-portdan (manba) sodir bo'ladi va maqsad 67-port (maqsad). Ba'zi qurilmalar paketlarni 67-portdan ham yuboradi. Mijoz qurilmasining MAC manzili DHCPDISCOVER paketiga kiritilgan.
  2. Tarmoqda joylashgan barcha DHCP serverlari (va ulardan bir nechtasi bo'lishi mumkin) DHCPDISCOVER-ni yuborgan qurilma uchun tarmoq sozlamalari bilan DHCPOFFER taklifini shakllantiradi va uni tarmoq orqali uzatadi. Ushbu paket kimga moʻljallanganligini aniqlash DHCPDISCOVER soʻrovida avvalroq berilgan mijozning MAC manziliga asoslanadi.
  3. Mijoz tarmoq sozlamalari bo'yicha takliflar bilan paketlarni qabul qiladi, eng jozibadorini tanlaydi (mezonlar boshqacha bo'lishi mumkin, masalan, paketlarni etkazib berish vaqti, oraliq marshrutlar soni) va tarmoq sozlamalari bilan DHCPREQUEST "rasmiy so'rovi" ni yuboradi. unga yoqadigan DHCP serveridan. Bunday holda, paket ma'lum bir DHCP serveriga o'tadi.
  4. DHCPREQUEST-ni olgan server DHCPACK format paketini yuboradi, unda yana bir bor ushbu mijoz uchun mo'ljallangan tarmoq sozlamalari ro'yxati keltirilgan.

Python da DHCP + Mysql serveri

Bundan tashqari, mijozdan keladigan DHCPINFORM paketlari mavjud va ularning maqsadi DHCP serveriga "mijoz tirik" va berilgan tarmoq sozlamalaridan foydalanayotgani haqida xabar berishdir. Ushbu serverni amalga oshirishda bu paketlar e'tiborga olinmaydi.

Paket formati

Umuman olganda, Ethernet paketli ramkasi quyidagicha ko'rinadi:

Python da DHCP + Mysql serveri

Bizning holatda, biz faqat to'g'ridan-to'g'ri UDP paketi tarkibidagi ma'lumotlarni, OSI sathi protokoli sarlavhalarisiz, ya'ni DHCP tuzilishini ko'rib chiqamiz:

DHCPDISCOVER

Shunday qilib, qurilma uchun IP-manzilni olish jarayoni DHCP mijozi 68-portdan 255.255.255.255:67 raqamiga translyatsiya so'rovini yuborishi bilan boshlanadi. Ushbu paketda mijoz o'zining MAC manzilini, shuningdek, DHCP serveridan nimani olishni istayotganini o'z ichiga oladi. Paket tuzilishi quyidagi jadvalda tasvirlangan.

DHCPDISCOVER paketlar tuzilishi jadvali

Paketdagi joylashuv
Qiymat nomi
misol
Kirish
Bayt
Izoh

1
Yuklash so'rovi
1
Hex
1
Xabar turi. 1 - mijozdan serverga so'rov, 2 - serverdan mijozga javob

2
Uskuna turi
1
Hex
1
Uskuna manzili turi, ushbu protokolda 1 - MAC

3
Uskuna uzunligini belgilaydi
6
Hex
1
Qurilmaning MAC manzili uzunligi

4
Hops
1
Hex
1
Oraliq marshrutlar soni

5
Tranzaksiya identifikatori
23:cf:de:1d
Hex
4
Noyob tranzaksiya identifikatori. So'rov operatsiyasining boshida mijoz tomonidan yaratilgan

7
Ikkinchisi o'tdi
0
Hex
4
Manzilni olish jarayoni boshlanishidan soniyalarda vaqt

9
Yuklash bayroqlari
0
Hex
2
Protokol parametrlarini ko'rsatish uchun o'rnatilishi mumkin bo'lgan ba'zi bayroqlar

11
Mijoz IP manzili
0.0.0.0
Chiziq
4
Mijoz IP manzili (mavjud bo'lsa)

15
Mijozning IP manzili
0.0.0.0
Chiziq
4
Server tomonidan taqdim etilgan IP-manzil (mavjud bo'lsa)

19
Keyingi server IP manzili
0.0.0.0
Chiziq
4
Server IP manzili (ma'lum bo'lsa)

23
Relay agenti IP manzili
172.16.114.41
Chiziq
4
Relay agentining IP manzili (masalan, kalit)

27
Mijozning MAC manzili
14:d6:4d:a7:c9:55
Hex
6
Paket jo'natuvchining (mijozning) MAC manzili

31
Mijoz apparat manzilini to'ldirish
 
Hex
10
Zaxira qilingan o'rindiq. Odatda nol bilan to'ldiriladi

41
Server xost nomi
 
Chiziq
64
DHCP server nomi. Odatda uzatilmaydi

105
Yuklash fayli nomi
 
Chiziq
128
Yuklashda disksiz stantsiyalar tomonidan ishlatiladigan serverdagi fayl nomi

235
Sehrli kukilar
63: 82: 53: 63
Hex
4
"Sehrli" raqam, unga ko'ra, shu jumladan. ushbu paket DHCP protokoliga tegishli ekanligini aniqlashingiz mumkin

DHCP opsiyalari. Har qanday tartibda borish mumkin

236
Variant raqami
53
Dec
1
DHCP paket turini belgilaydigan 53-variant

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

 
Variant uzunligi
1
Dec
1

 
Variant qiymati
1
Dec
1

 
Variant raqami
50
Dec
1
Mijoz qanday IP manzilni olishni xohlaydi?

 
Variant uzunligi
4
Dec
1

 
Variant qiymati
172.16.134.61
Chiziq
4

 
Variant raqami
55
 
1
Mijoz tomonidan so'ralgan tarmoq parametrlari. Tarkibi farq qilishi mumkin

01 - Tarmoq niqobi
03 - Gateway
06 - DNS
oc - Xost nomi
0f - tarmoq domen nomi
1c - eshittirish so'rovining manzili (efir)
42 - TFTP server nomi
79 - Sinfsiz statik marshrut

 
Variant uzunligi
8
 
1

 
Variant qiymati
01:03:06:0c:0f:1c:42:79
 
8

 
Variant raqami
82
Dec
 
Repetitor qurilmaning MAC manzilini va ba'zi qo'shimcha qiymatlarni uzatuvchi 82-variant.

Ko'pincha, bu oxirgi DHCP mijozi ishlaydigan kalit portidir.Ushbu parametr qo'shimcha parametrlarni o'z ichiga oladi.Birinchi bayt "subvariant" raqami, ikkinchisi - uzunligi, keyin esa qiymati.

Bunday holda, 82-variantda pastki parametrlar joylashtirilgan:
Agent Circuit ID = 00:04:00:01:00:04, bu erda oxirgi ikki bayt so'rov kelgan DHCP mijoz portidir.

Agent Remote ID = 00:06:c8:be:19:93:11:48 - DHCP takrorlash qurilmasining MAC manzili

 
Variant uzunligi
18
Dec
 

 
Variant qiymati
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Paket oxiri
255
Dec
1
255 paketning oxirini anglatadi

DHCPOFFER

Server DHCPDISCOVER paketini qabul qilishi bilanoq va agar u mijozga so'ralganidan biror narsani taklif qila olishini ko'rsa, u unga javob beradi - DHCPDISCOVER. Javob portga "qayerdan kelgan", translyatsiya orqali yuboriladi, chunki Hozirgi vaqtda mijoz hali IP manziliga ega emas, shuning uchun u paketni faqat translyatsiya orqali yuborilgan taqdirda qabul qilishi mumkin. Mijoz bu uning uchun paket ekanligini paket ichidagi MAC manzili, shuningdek, birinchi paket yaratilganda yaratgan tranzaksiya raqami orqali tan oladi.

DHCPOFFER paketlar tuzilishi jadvali

Paketdagi joylashuv
Qiymat nomi (umumiy)
misol
Kirish
Bayt
Izoh

1
Yuklash so'rovi
1
Hex
1
Xabar turi. 1 - mijozdan serverga so'rov, 2 - serverdan mijozga javob

2
Uskuna turi
1
Hex
1
Uskuna manzili turi, ushbu protokolda 1 - MAC

3
Uskuna uzunligini belgilaydi
6
Hex
1
Qurilmaning MAC manzili uzunligi

4
Hops
1
Hex
1
Oraliq marshrutlar soni

5
Tranzaksiya identifikatori
23:cf:de:1d
Hex
4
Noyob tranzaksiya identifikatori. So'rov operatsiyasining boshida mijoz tomonidan yaratilgan

7
Ikkinchisi o'tdi
0
Hex
4
Manzilni olish jarayoni boshlanishidan soniyalarda vaqt

9
Yuklash bayroqlari
0
Hex
2
Protokol parametrlarini ko'rsatish uchun o'rnatilishi mumkin bo'lgan ba'zi bayroqlar. Bu holda 0 Unicast so'rov turini bildiradi

11
Mijoz IP manzili
0.0.0.0
Chiziq
4
Mijoz IP manzili (mavjud bo'lsa)

15
Mijozning IP manzili
172.16.134.61
Chiziq
4
Server tomonidan taqdim etilgan IP-manzil (mavjud bo'lsa)

19
Keyingi server IP manzili
0.0.0.0
Chiziq
4
Server IP manzili (ma'lum bo'lsa)

23
Relay agenti IP manzili
172.16.114.41
Chiziq
4
Relay agentining IP manzili (masalan, kalit)

27
Mijozning MAC manzili
14:d6:4d:a7:c9:55
Hex
6
Paket jo'natuvchining (mijozning) MAC manzili

31
Mijoz apparat manzilini to'ldirish
 
Hex
10
Zaxira qilingan o'rindiq. Odatda nol bilan to'ldiriladi

41
Server xost nomi
 
Chiziq
64
DHCP server nomi. Odatda uzatilmaydi

105
Yuklash fayli nomi
 
Chiziq
128
Yuklashda disksiz stantsiyalar tomonidan ishlatiladigan serverdagi fayl nomi

235
Sehrli kukilar
63: 82: 53: 63
Hex
4
"Sehrli" raqam, unga ko'ra, shu jumladan. ushbu paket DHCP protokoliga tegishli ekanligini aniqlashingiz mumkin

DHCP opsiyalari. Har qanday tartibda borish mumkin

236
Variant raqami
53
Dec
1
DHCP 53 paket turini belgilaydigan 2-variant - DHCPOFFER

 
Variant uzunligi
1
Dec
1

 
Variant qiymati
2
Dec
1

 
Variant raqami
1
Dec
1
DHCP mijoziga tarmoq niqobini taklif qilish imkoniyati

 
Variant uzunligi
4
Dec
1

 
Variant qiymati
255.255.224.0
Chiziq
4

 
Variant raqami
3
Dec
1
DHCP mijoziga standart shlyuzni taklif qilish imkoniyati

 
Variant uzunligi
4
Dec
1

 
Variant qiymati
172.16.12.1
Chiziq
4

 
Variant raqami
6
Dec
1
DNS mijoziga DHCP taklif qilish imkoniyati

 
Variant uzunligi
4
Dec
1

 
Variant qiymati
8.8.8.8
Chiziq
4

 
Variant raqami
51
Dec
1
Berilgan tarmoq parametrlarining ishlash muddati soniyalarda, shundan so'ng DHCP mijozi ularni qayta so'rashi kerak

 
Variant uzunligi
4
Dec
1

 
Variant qiymati
86400
Dec
4

 
Variant raqami
82
Dec
1
Variant 82, DHCPDISCOVER da kelgan narsani takrorlaydi

 
Variant uzunligi
18
Dec
1

 
Variant qiymati
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ek
Dec
18

 
Paket oxiri
255
Dec
1
255 paketning oxirini anglatadi

DHCPREQUEST

Mijoz DHCPOFFER-ni olgandan so'ng, u tarmoq parametrlarini tarmoqdagi barcha DHCP serverlariga emas, balki DHCPOFFER taklifi unga eng ko'p "yoqtirgan" bitta ma'lum biriga so'raydigan paketni shakllantiradi. "Like" mezonlari har xil bo'lishi mumkin va mijozning DHCP amalga oshirilishiga bog'liq. So'rovni qabul qiluvchi DHCP serverining MAC manzili yordamida aniqlanadi. Bundan tashqari, DHCPREQUEST paketi mijoz tomonidan DHCPDISCOVER-ni yaratmasdan yuborilishi mumkin, agar serverning IP-manzili ilgari olingan bo'lsa.

DHCPREQUEST paketlar tuzilishi jadvali

Paketdagi joylashuv
Qiymat nomi (umumiy)
misol
Kirish
Bayt
Izoh

1
Yuklash so'rovi
1
Hex
1
Xabar turi. 1 - mijozdan serverga so'rov, 2 - serverdan mijozga javob

2
Uskuna turi
1
Hex
1
Uskuna manzili turi, ushbu protokolda 1 - MAC

3
Uskuna uzunligini belgilaydi
6
Hex
1
Qurilmaning MAC manzili uzunligi

4
Hops
1
Hex
1
Oraliq marshrutlar soni

5
Tranzaksiya identifikatori
23:cf:de:1d
Hex
4
Noyob tranzaksiya identifikatori. So'rov operatsiyasining boshida mijoz tomonidan yaratilgan

7
Ikkinchisi o'tdi
0
Hex
4
Manzilni olish jarayoni boshlanishidan soniyalarda vaqt

9
Yuklash bayroqlari
8000
Hex
2
Protokol parametrlarini ko'rsatish uchun o'rnatilishi mumkin bo'lgan ba'zi bayroqlar. Bunday holda, "efir" o'rnatiladi

11
Mijoz IP manzili
0.0.0.0
Chiziq
4
Mijoz IP manzili (mavjud bo'lsa)

15
Mijozning IP manzili
172.16.134.61
Chiziq
4
Server tomonidan taqdim etilgan IP-manzil (mavjud bo'lsa)

19
Keyingi server IP manzili
0.0.0.0
Chiziq
4
Server IP manzili (ma'lum bo'lsa)

23
Relay agenti IP manzili
172.16.114.41
Chiziq
4
Relay agentining IP manzili (masalan, kalit)

27
Mijozning MAC manzili
14:d6:4d:a7:c9:55
Hex
6
Paket jo'natuvchining (mijozning) MAC manzili

31
Mijoz apparat manzilini to'ldirish
 
Hex
10
Zaxira qilingan o'rindiq. Odatda nol bilan to'ldiriladi

41
Server xost nomi
 
Chiziq
64
DHCP server nomi. Odatda uzatilmaydi

105
Yuklash fayli nomi
 
Chiziq
128
Yuklashda disksiz stantsiyalar tomonidan ishlatiladigan serverdagi fayl nomi

235
Sehrli kukilar
63: 82: 53: 63
Hex
4
"Sehrli" raqam, unga ko'ra, shu jumladan. ushbu paket DHCP protokoliga tegishli ekanligini aniqlashingiz mumkin

DHCP opsiyalari. Har qanday tartibda borish mumkin

236
Variant raqami
53
Dec
3
DHCP paket turi 53 ni belgilaydigan 3-variant - DHCPREQUEST

 
Variant uzunligi
1
Dec
1

 
Variant qiymati
3
Dec
1

 
Variant raqami
61
Dec
1
Mijoz ID: 01 (Ehernet uchun) + mijoz MAC manzili

 
Variant uzunligi
7
Dec
1

 
Variant qiymati
01:2c:ab:25:ff:72:a6
Hex
7

 
Variant raqami
60
Dec
 
"Sotuvchi sinf identifikatori". Mening holimda u DHCP mijoz versiyasi haqida xabar beradi. Ehtimol, boshqa qurilmalar boshqacha narsani qaytaradi. Masalan, Windows MSFT 5.0 haqida xabar beradi

 
Variant uzunligi
11
Dec
 

 
Variant qiymati
udhcp 0.9.8
Chiziq
 

 
Variant raqami
55
 
1
Mijoz tomonidan so'ralgan tarmoq parametrlari. Tarkibi farq qilishi mumkin

01 - Tarmoq niqobi
03 - Gateway
06 - DNS
oc - Xost nomi
0f - tarmoq domen nomi
1c - eshittirish so'rovining manzili (efir)
42 - TFTP server nomi
79 - Sinfsiz statik marshrut

 
Variant uzunligi
8
 
1

 
Variant qiymati
01:03:06:0c:0f:1c:42:79
 
8

 
Variant raqami
82
Dec
1
Variant 82, DHCPDISCOVER da kelgan narsani takrorlaydi

 
Variant uzunligi
18
Dec
1

 
Variant qiymati
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ek
Dec
18

 
Paket oxiri
255
Dec
1
255 paketning oxirini anglatadi

DHCPACK

DHCP serveridan "ha, to'g'ri, bu sizning IP manzilingiz va men uni boshqa hech kimga bermayman" degan tasdig'i sifatida DHCPACK formatidagi paket serverdan mijozga xizmat qiladi. Boshqa paketlar kabi translyatsiya yuboriladi. Quyidagi kodda Python-da o'rnatilgan DHCP serveriga tegishli bo'lsa-da, agar u allaqachon ma'lum bo'lsa, ma'lum bir mijoz IP-ga paket yuborish orqali har qanday eshittirish so'rovini takrorlayman. Bundan tashqari, DHCP serveri DHCPACK paketi mijozga yetib kelgan-qilmaganiga umuman ahamiyat bermaydi. Agar mijoz DHCPACK ni olmasa, bir muncha vaqt o'tgach, u shunchaki DHCPREQUESTni takrorlaydi

DHCPACK paketlar tuzilishi jadvali

Paketdagi joylashuv
Qiymat nomi (umumiy)
misol
Kirish
Bayt
Izoh

1
Yuklash so'rovi
2
Hex
1
Xabar turi. 1 - mijozdan serverga so'rov, 2 - serverdan mijozga javob

2
Uskuna turi
1
Hex
1
Uskuna manzili turi, ushbu protokolda 1 - MAC

3
Uskuna uzunligini belgilaydi
6
Hex
1
Qurilmaning MAC manzili uzunligi

4
Hops
1
Hex
1
Oraliq marshrutlar soni

5
Tranzaksiya identifikatori
23:cf:de:1d
Hex
4
Noyob tranzaksiya identifikatori. So'rov operatsiyasining boshida mijoz tomonidan yaratilgan

7
Ikkinchisi o'tdi
0
Hex
4
Manzilni olish jarayoni boshlanishidan soniyalarda vaqt

9
Yuklash bayroqlari
8000
Hex
2
Protokol parametrlarini ko'rsatish uchun o'rnatilishi mumkin bo'lgan ba'zi bayroqlar. Bunday holda, "efir" o'rnatiladi

11
Mijoz IP manzili
0.0.0.0
Chiziq
4
Mijoz IP manzili (mavjud bo'lsa)

15
Mijozning IP manzili
172.16.134.61
Chiziq
4
Server tomonidan taqdim etilgan IP-manzil (mavjud bo'lsa)

19
Keyingi server IP manzili
0.0.0.0
Chiziq
4
Server IP manzili (ma'lum bo'lsa)

23
Relay agenti IP manzili
172.16.114.41
Chiziq
4
Relay agentining IP manzili (masalan, kalit)

27
Mijozning MAC manzili
14:d6:4d:a7:c9:55
Hex
6
Paket jo'natuvchining (mijozning) MAC manzili

31
Mijoz apparat manzilini to'ldirish
 
Hex
10
Zaxira qilingan o'rindiq. Odatda nol bilan to'ldiriladi

41
Server xost nomi
 
Chiziq
64
DHCP server nomi. Odatda uzatilmaydi

105
Yuklash fayli nomi
 
Chiziq
128
Yuklashda disksiz stantsiyalar tomonidan ishlatiladigan serverdagi fayl nomi

235
Sehrli kukilar
63: 82: 53: 63
Hex
4
"Sehrli" raqam, unga ko'ra, shu jumladan. ushbu paket DHCP protokoliga tegishli ekanligini aniqlashingiz mumkin

DHCP opsiyalari. Har qanday tartibda borish mumkin

236
Variant raqami
53
Dec
3
DHCP paket turi 53 ni belgilaydigan 5-variant - DHCPACK

 
Variant uzunligi
1
Dec
1

 
Variant qiymati
5
Dec
1

 
Variant raqami
1
Dec
1
DHCP mijoziga tarmoq niqobini taklif qilish imkoniyati

 
Variant uzunligi
4
Dec
1

 
Variant qiymati
255.255.224.0
Chiziq
4

 
Variant raqami
3
Dec
1
DHCP mijoziga standart shlyuzni taklif qilish imkoniyati

 
Variant uzunligi
4
Dec
1

 
Variant qiymati
172.16.12.1
Chiziq
4

 
Variant raqami
6
Dec
1
DNS mijoziga DHCP taklif qilish imkoniyati

 
Variant uzunligi
4
Dec
1

 
Variant qiymati
8.8.8.8
Chiziq
4

 
Variant raqami
51
Dec
1
Berilgan tarmoq parametrlarining ishlash muddati soniyalarda, shundan so'ng DHCP mijozi ularni qayta so'rashi kerak

 
Variant uzunligi
4
Dec
1

 
Variant qiymati
86400
Dec
4

 
Variant raqami
82
Dec
1
Variant 82, DHCPDISCOVER da kelgan narsani takrorlaydi

 
Variant uzunligi
18
Dec
1

 
Variant qiymati
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ek
Dec
18

 
Paket oxiri
255
Dec
1
255 paketning oxirini anglatadi

sozlama

O'rnatish aslida ish uchun zarur bo'lgan python modullarini o'rnatishdan iborat. MySQL allaqachon o'rnatilgan va sozlangan deb taxmin qilinadi.

FreeBSD

pkg o'rnatish python3 python3 -m ishonch hosil qilish pip3 mysql-ulagichini o'rnatish

Ubuntu

sudo apt-get o'rnatish python3 sudo apt-get o'rnatish pip3 sudo pip3 mysql-ulagichini o'rnatish

Biz MySQL ma'lumotlar bazasini yaratamiz, unga pydhcp.sql dumpini yuklaymiz va konfiguratsiya faylini sozlaymiz.

Konfiguratsiya

Barcha server sozlamalari xml faylida. Malumot fayli:

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 sinov sinov 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 upper(mac)=yuqori('{option_3_AgentRemoteId_hex}') va upper(port)=yuqori('{option_1_AgentCircuitId_port_hex}') bo'lgan foydalanuvchilardan ip,mask,router,dns-ni tanlang. Yuqori(mac)=yuqori('{sw_mac}') va yuqori(port)=yuqori('{sw_port82}') bo'lgan foydalanuvchilardan ip,mask,router,dns-ni tanlang. Upper(mac)=yuqori('{ClientMacAddress}') bo'lgan foydalanuvchilardan ip,mask,router,dns-ni tanlang. tarixga kiritish (id,dt,mac,ip,comment) qiymatlari (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

Endi teglar haqida batafsilroq:

Dhcpserver bo'limi serverni ishga tushirish uchun asosiy sozlamalarni tavsiflaydi, xususan:

  • xost - server 67-portda qaysi IP-manzilni tinglaydi
  • translyatsiya - qaysi ip DHCPOFFER va DHCPACK uchun translyatsiya
  • DHCPServer - DHCP serverining IP-si nima
  • Berilgan IP manzilining LeaseTime ijara vaqti
  • ThreadLimit - 67-portda kiruvchi UDP paketlarini qayta ishlash uchun bir vaqtning o'zida qancha ish zarrachalari ishlamoqda. U yuqori yuklangan loyihalarda yordam berishi kerak 😉
  • defaultMask,defaultRouter,defaultDNS - agar ma'lumotlar bazasida IP topilsa, lekin u uchun qo'shimcha parametrlar ko'rsatilmagan bo'lsa, sukut bo'yicha obunachiga nima taklif qilinadi

mysql bo'limi:

xost, foydalanuvchi nomi, parol, asosiy nom - hamma narsa o'zi uchun gapiradi. Taxminiy ma'lumotlar bazasi tuzilishi e'lon qilingan GitHub

So'rovlar bo'limi: OFFER/ACK olish so'rovlari bu yerda tasvirlangan:

  • offer_count - IP, maska, router, dns kabi natijani qaytaradigan so'rovlar bilan qatorlar soni
  • offer_n - so'rovlar qatori. Qaytish bo'sh bo'lsa, quyidagi taklif so'rovini bajaradi
  • history_sql - masalan, obunachi uchun "avtorizatsiya tarixi" ga yozadigan so'rov

So'rovlar parametrlar bo'limidagi har qanday o'zgaruvchilarni yoki DHCP protokolidagi variantlarni o'z ichiga olishi mumkin.

Variantlar bo'limi. Bu erda u yanada qiziqarli bo'ladi. Bu erda biz so'rovlar bo'limida keyinroq foydalanishimiz mumkin bo'lgan o'zgaruvchilar yaratishimiz mumkin.

Masalan:

option_82_hex:sw_port1:20:22

, bu buyruq qatori DHCP so'rovi 82 variantida kelgan butun qatorni olti burchakli formatda, 20 dan 22 baytgacha bo'lgan diapazonda oladi va uni yangi o'zgaruvchiga qo'yadi sw_port1 (so'rov kelgan joydan portni almashtirish)

option_82_hex:sw_mac:26:40

, 26:40 oralig'idan olti burchakni olib, sw_mac o'zgaruvchisini aniqlang

Serverni -d kaliti bilan ishga tushirish orqali so'rovlarda ishlatilishi mumkin bo'lgan barcha variantlarni ko'rishingiz mumkin. Biz ushbu jurnalga o'xshash narsani ko'ramiz:

--67-portga DHCPINFORM paketi keldi, 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress': '0025224'MacAddress': '764'MacAddress': '00'Macli' : b'x7 91%"Jxd5d' , ' HType': 'Ethernet', 'HostName': b'x0xa3xe5xa9xa8xa8-x43fx0.0.0.0a', 'ReqListDNS': Rost, 'ReqListDomainName': Rost, 'ReqListPerfowmRouterDiscoveric,'RouterDiscoveric,'Req:'Req:' Marshrut': To'g'ri, 'ReqListSubnetM so'radi ': To'g'ri, 'ReqListVendorSpecInfo': 5.0, 'RequestedIpAddress': '0025224', 'Vendor': b'MSFT 764', 'chaddr': '172.30.128.13',ad00.' ' , 'bayroqlar ': b'x00x172.30.114.25', 'giaddr': '308', 'gpoz': 6, 'hlen': 1, 'hops': 82, 'htype': 'MAC', 'magic_cookie:' b'cx12Sc ', 'op': 'DHCPINFORM', 'option12': 53, 'option53': 55, 'option55': 60, 'option60': 61, 'option61': 82, 'option82': 82, option_12_bayt': b'x01x06x00x04x00x01x00x06x02x08x00x06' b'x00x1x9eXx2exb82xad', 'option_12010600040001000602080006001_hex': '589 'option_2_len': 82 18, 'option_82_str': "b'x12x01x06x00x04x00x01x00x06x02x08x00x06x00x1eXx9exb2xad'", 'natija': False', 768s', 's. 'siaddr': '0.0.0.0', 'sw_mac': '001e589eb2ad', 'sw_port1': '06', 'xidbayt': b'

Shunga ko'ra, biz har qanday o'zgaruvchini {} ga o'rashimiz mumkin va u SQL so'rovida ishlatiladi.

Mijoz IP-manzilni olgani haqida tarixga yozaylik:

Python da DHCP + Mysql serveri

Python da DHCP + Mysql serveri

Server ishga tushirilmoqda

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

— d konsolning chiqish rejimi DEBUG
- c <fayl nomi> konfiguratsiya fayli

Debrifing

Endi Python-da serverni amalga oshirish haqida batafsil ma'lumot. Bu og'riq. Python tezda o'rganildi. Ko'p lahzalar "voy, men buni qanday qilib amalga oshirdim" uslubida yaratilgan. Umuman optimallashtirilmagan va asosan Python-ni ishlab chiqishda kam tajriba tufayli ushbu shaklda qoldirilgan. Men "kod" da serverni amalga oshirishning eng qiziqarli jihatlariga to'xtalib o'taman.

XML konfiguratsiya fayli tahlilchisi

Standart Python moduli xml.dom ishlatiladi. Bu oddiy ko'rinadi, lekin amalga oshirish jarayonida ushbu moduldan foydalangan holda tarmoqdagi aniq hujjatlar va misollar sezilarli darajada yo'q edi.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") mconfigdagi element uchun: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firda. gconfig["mysql_username"]=elem.getElementsByTagName("foydalanuvchi nomi")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("password")[0].firstChild_gs_tags["tabaaadı. =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") element uchun dconfig: gconfig["broadcast"]=elem.getElementsByTagcastName("0." firstChild.data gconfig["dhcp_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["dhcp_LeaseTime"]=elem.getElementsByTagName("LeaseTime") gconfig[0]. dhcp_treadlimit "] = int (" Trezlimit ") [0]" = elem.getelementsbytytagname ("dekallmolk") ["Dhcp_defultrater" ["Dhcp_defulterter"] = "FCCP_DULOSTDDNS [" DHCP_DUPAUSTDDNS "" Dhcp_Defulytdns "] defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("so'rov") qconfig'dagi element uchun: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild inta. diapazon(int(gconfig["offer_count"])): gconfig["offer_"+str(num+0)]=elem.getElementsByTagName("offer_"+str(num+0))[0].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[1].firstChild.data options=tree.getElementsByTagName("options") opsiyadagi element uchun: node parametrlari uchun node=elem.getElementsByTagName("option") : optionsMod.append(options.firstChild.data)

Ko'p tarmoqli

Ajabo, Python-da multithreading juda aniq va sodda tarzda amalga oshiriladi.

def PacketWork(data,addr): ... # kiruvchi paketni tahlil qilish va unga javob berishni amalga oshirish ... esa To'g'ri: ma'lumotlar, addr = udp_socket.recvfrom(1024) # UDP paketini kutish = threading.Thread( target=PacketWork , args=(data,addr,)).start() # paydo bo'lganidek - biz threading.active_count() >gconfig["dhcp_ThreadLimit"]: vaqt paytida oldindan belgilangan PacketWork funksiyasini parametrlar bilan fonda ishga tushiramiz. uyqu(1) # agar raqam sozlamalardagidan ko'proq ishlayotgan mavzular bo'lsa, biz ularning soni kamayguncha kutamiz.

DHCP paketini qabul qilish/yuborish

Tarmoq kartasi orqali keladigan UDP paketlarini ushlab turish uchun rozetkani "ko'tarish" kerak:

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

, bayroqlar qaerda:

  • AF_INET - manzil formati IP: port bo'lishini anglatadi. AF_UNIX ham bo'lishi mumkin - bu erda manzil fayl nomi bilan beriladi.
  • SOCK_DGRAM - biz "xom paket" ni qabul qilmasligimizni anglatadi, lekin xavfsizlik devori orqali allaqachon o'tgan va qisman kesilgan paket bilan. Bular. biz UDP paket o'ramining "jismoniy" komponenti bo'lmagan faqat UDP paketini olamiz. Agar siz SOCK_RAW bayrog'idan foydalansangiz, ushbu "o'rash" ni ham tahlil qilishingiz kerak bo'ladi.

Paket yuborish translyatsiya kabi bo'lishi mumkin:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #rozetkani translyatsiya rejimiga o'tkazing rz=udp_socket.sendto(packettack, (gconfig["broadcast"],68))

, va "paket qayerdan kelgan" manziliga:

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # rozetkani ko'p tinglovchi rejimiga o'tkazing rz=udp_socket.sendto(packettack, addr)

, bu erda SOL_SOCKET parametrlarni sozlash uchun "protokol darajasi" degan ma'noni anglatadi,

, SO_BROADCAST opsiyasi dubulg'a to'plami "efirga uzatiladi"

  ,SO_REUSEADDR opsiyasi rozetkani “ko‘p tinglovchilar” rejimiga o‘tkazadi. Nazariy jihatdan, bu holda bu kerak emas, lekin men sinovdan o'tkazgan FreeBSD serverlaridan birida kod ushbu parametrsiz ishlamadi.

DHCP paketini tahlil qilish

Bu erda menga Python juda yoqdi. Ma'lum bo'lishicha, bu sizga bayt-kod bilan juda moslashuvchan bo'lishga imkon beradi. Uni o'nlik qiymatlarga, satrlarga va hexga juda oson tarjima qilish imkonini berish - ya'ni. bu paketning tuzilishini tushunishimiz kerak bo'lgan narsa. Shunday qilib, masalan, siz HEXda bir qator baytlarni va faqat baytlarni olishingiz mumkin:

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

, baytlarni tuzilishga to'plang:

res["bayroqlar"]=paket('BB',ma'lumotlar[10],ma'lumotlar[11])

Strukturadan IP oling:

res["ciaddr"]=socket.inet_ntoa(paket('BBBB',ma'lumotlar[12],ma'lumotlar[13],ma'lumotlar[14],ma'lumotlar[15]));

Va teskari:

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

Hozircha hammasi shu 😉

Manba: www.habr.com

a Izoh qo'shish