Python-da DHCP+Mysql server

Python-da DHCP+Mysql server

Bu layihənin məqsədi:

  • IPv4 şəbəkəsində DHCP haqqında öyrənmək
  • Python öyrənmək (sıfırdan bir az daha çox 😉)
  • serverin dəyişdirilməsi DB2DHCP (mənim çəngəlim), orijinal burada, yeni OS üçün yığılması getdikcə çətinləşir. Və mənim xoşuma gəlmir ki, bu ikili sistemdir və "hazırda dəyişmək" üçün heç bir yol yoxdur.
  • abunəçinin mac-ından istifadə edərək abunəçinin IP ünvanını seçmək və ya mac+port kombinasiyasını dəyişdirmək imkanı ilə işləyən DHCP serverinin əldə edilməsi (Seçim 82)
  • başqa bir velosiped yazmaq (Oh! bu mənim sevimli fəaliyyətimdir)
  • Habrahabr-da klub əlinizlə bağlı şərhlər almaq (yaxud daha yaxşısı dəvət) 😉

Nəticə: işləyir 😉 FreeBSD və Ubuntu ƏS-də sınaqdan keçirilib. Teorik olaraq, kodun istənilən OS altında işləməsi tələb oluna bilər, çünki Görünür, kodda xüsusi bağlamalar yoxdur.
Diqqətlə! Qarşıda daha çox şey var.

Həvəskarlar üçün depoya keçid "canlı toxun".

"Avadanlığın öyrənilməsi" nəticəsinin quraşdırılması, konfiqurasiyası və istifadəsi prosesi daha aşağıdır, sonra DHCP protokolu haqqında bir az nəzəriyyə. Özüm üçün. Və tarix üçün 😉

Bir az nəzəriyyə

DHCP nədir

Bu, cihaza DHCP serverindən onun IP ünvanını (və şlüz, DNS və s. kimi digər parametrləri) öyrənməyə imkan verən şəbəkə protokoludur. Paketlərin mübadiləsi UDP protokolundan istifadə etməklə həyata keçirilir. Şəbəkə parametrlərini tələb edərkən cihazın ümumi iş prinsipi aşağıdakı kimidir:

  1. Cihaz (müştəri) “yaxşı, kimsə mənə bir IP ünvanı ver” sorğusu ilə bütün şəbəkəyə UDP yayım sorğusu (DHCPDISCOVER) göndərir. Üstəlik, adətən (lakin həmişə deyil) sorğu 68-ci portdan (mənbə) baş verir və təyinat port 67-dir (təyinat). Bəzi qurğular paketləri 67-ci portdan da göndərir. Müştəri cihazının MAC ünvanı DHCPDISCOVER paketinə daxildir.
  2. Şəbəkədə yerləşən bütün DHCP serverləri (və onlardan bir neçəsi ola bilər) DHCPDISCOVER göndərən cihaz üçün şəbəkə parametrləri ilə DHCPOFFER təklifi təşkil edir və həmçinin onu şəbəkə üzərindən yayımlayır. Bu paketin kimlər üçün nəzərdə tutulduğunun müəyyən edilməsi DHCPDISCOVER sorğusunda əvvəllər verilmiş müştərinin MAC ünvanına əsaslanır.
  3. Müştəri şəbəkə parametrləri üçün təkliflər olan paketləri qəbul edir, ən cəlbedicisini seçir (meyarlar fərqli ola bilər, məsələn, paketin çatdırılma vaxtı, aralıq marşrutların sayı) və şəbəkə parametrləri ilə "rəsmi sorğu" DHCPREQUEST edir. bəyəndiyi DHCP serverindən. Bu halda, paket xüsusi DHCP serverinə gedir.
  4. DHCPREQUEST-i qəbul edən server bu müştəri üçün nəzərdə tutulmuş şəbəkə parametrlərini bir daha sadaladığı DHCPACK format paketini göndərir.

Python-da DHCP+Mysql server

Bundan əlavə, müştəridən gələn DHCPINFORM paketləri var və onların məqsədi DHCP serverinə “müştəri sağdır” və verilmiş şəbəkə parametrlərindən istifadə etdiyini bildirməkdir. Bu serverin həyata keçirilməsində bu paketlər nəzərə alınmır.

Paket formatı

Ümumiyyətlə, Ethernet paket çərçivəsi belə görünür:

Python-da DHCP+Mysql server

Bizim vəziyyətimizdə OSI səviyyə protokol başlıqları, yəni DHCP strukturu olmadan yalnız birbaşa UDP paketinin məzmunundan məlumatları nəzərdən keçirəcəyik:

DHCPDISCOVER

Beləliklə, bir cihaz üçün IP ünvanının əldə edilməsi prosesi DHCP müştərisinin 68 portdan 255.255.255.255:67 nömrəsinə yayım sorğusu göndərməsi ilə başlayır. Bu paketdə müştəri MAC ünvanını, həmçinin DHCP serverindən tam olaraq nə almaq istədiyini ehtiva edir. Paketin strukturu aşağıdakı cədvəldə təsvir edilmişdir.

DHCPDISCOVER Paket Struktur Cədvəli

Paketdəki mövqe
Dəyər adı
Misal
Giriş
Bayt
Şərhlər

1
Yükləmə sorğusu
1
Hex
1
Mesaj növü. 1 - müştəridən serverə sorğu, 2 - serverdən müştəriyə cavab

2
Aparat növü
1
Hex
1
Avadanlıq ünvanının növü, bu protokolda 1 - MAC

3
Avadanlıq uzunluğa müraciət edir
6
Hex
1
Cihazın MAC ünvanının uzunluğu

4
Mayaotu
1
Hex
1
Aralıq marşrutların sayı

5
əməlliyyatın kodu
23:cf:de:1d
Hex
4
Unikal əməliyyat identifikatoru. Müştəri tərəfindən sorğu əməliyyatının əvvəlində yaradılır

7
İkinci keçdi
0
Hex
4
Ünvan əldə etmə prosesinin başlanğıcından saniyələrlə vaxt

9
Yükləmə bayraqları
0
Hex
2
Protokol parametrlərini göstərmək üçün təyin edilə bilən müəyyən bayraqlar

11
Müştəri IP ünvanı
0.0.0.0
Sətir
4
Müştərinin IP ünvanı (varsa)

15
Müştərinizin IP ünvanı
0.0.0.0
Sətir
4
server tərəfindən təklif olunan IP ünvanı (əgər varsa)

19
Növbəti server IP ünvanı
0.0.0.0
Sətir
4
Server IP ünvanı (məlumdursa)

23
Relay agent IP ünvanı
172.16.114.41
Sətir
4
Relay agentinin IP ünvanı (məsələn, keçid)

27
Müştəri MAC ünvanı
14:d6:4d:a7:c9:55
Hex
6
Paket göndərənin (müştəri) MAC ünvanı

31
Müştəri aparatının ünvan doldurulması
 
Hex
10
Rezerv edilmiş oturacaq. Adətən sıfırlarla doldurulur

41
Server host adı
 
Sətir
64
DHCP server adı. Adətən ötürülmür

105
Yükləmə faylının adı
 
Sətir
128
Yükləmə zamanı disksiz stansiyalar tərəfindən istifadə edilən serverdəki fayl adı

235
Sehrli peçenye
63: 82: 53: 63
Hex
4
"Sehrli" nömrə, buna görə də daxil olmaqla. bu paketin DHCP protokoluna aid olduğunu müəyyən edə bilərsiniz

DHCP seçimləri. İstənilən qaydada gedə bilər

236
Seçim nömrəsi
53
Dec
1
DHCP paket növünü təyin edən Seçim 53

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

 
Seçim uzunluğu
1
Dec
1

 
Seçim dəyəri
1
Dec
1

 
Seçim nömrəsi
50
Dec
1
Müştəri hansı IP ünvanını almaq istəyir?

 
Seçim uzunluğu
4
Dec
1

 
Seçim dəyəri
172.16.134.61
Sətir
4

 
Seçim nömrəsi
55
 
1
Müştəri tərəfindən tələb olunan şəbəkə parametrləri. Tərkib fərqli ola bilər

01 - Şəbəkə maskası
03 - Gateway
06 - DNS
oc — Host adı
0f - şəbəkə domen adı
1c - yayım sorğusunun ünvanı (yayım)
42 - TFTP server adı
79 - Sinifsiz Statik Marşrut

 
Seçim uzunluğu
8
 
1

 
Seçim dəyəri
01:03:06:0c:0f:1c:42:79
 
8

 
Seçim nömrəsi
82
Dec
 
Təkrarlayıcı cihazın MAC ünvanını və bəzi əlavə dəyərləri ötürən Variant 82.

Çox vaxt bu, son DHCP müştərisinin işlədiyi keçidin portudur.Bu seçim əlavə parametrləri ehtiva edir.Birinci bayt “alt variantın nömrəsi”, ikinci bayt onun uzunluğu, sonra isə dəyəridir.

Bu halda, 82-ci seçimdə alt seçimlər iç-içədir:
Agent Circuit ID = 00:04:00:01:00:04, burada son iki bayt sorğunun gəldiyi DHCP müştəri portudur

Agent Remote ID = 00:06:c8:be:19:93:11:48 - DHCP təkrarlayıcı cihazının MAC ünvanı

 
Seçim uzunluğu
18
Dec
 

 
Seçim dəyəri
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
Hex
 

 
Paketin sonu
255
Dec
1
255 paketin sonunu simvollaşdırır

DHCPOFFER

Server DHCPDISCOVER paketini qəbul edən kimi və müştəriyə tələb olunan paketdən nəsə təklif edə biləcəyini görsə, o, bunun üçün cavab yaradır - DHCPDISCOVER. Cavab yayımla “gəldiyi yerdən” limana göndərilir, çünki bu anda müştərinin hələ IP ünvanı yoxdur, ona görə də paketi yalnız yayımla göndərildiyi halda qəbul edə bilər. Müştəri bunun onun üçün paket olduğunu paketin içərisindəki MAC ünvanından, eləcə də ilk paketin yaradılması zamanı yaratdığı əməliyyat nömrəsindən tanıyır.

DHCPOFFER Paket Struktur Cədvəli

Paketdəki mövqe
Dəyərin adı (ümumi)
Misal
Giriş
Bayt
Şərhlər

1
Yükləmə sorğusu
1
Hex
1
Mesaj növü. 1 - müştəridən serverə sorğu, 2 - serverdən müştəriyə cavab

2
Aparat növü
1
Hex
1
Avadanlıq ünvanının növü, bu protokolda 1 - MAC

3
Avadanlıq uzunluğa müraciət edir
6
Hex
1
Cihazın MAC ünvanının uzunluğu

4
Mayaotu
1
Hex
1
Aralıq marşrutların sayı

5
əməlliyyatın kodu
23:cf:de:1d
Hex
4
Unikal əməliyyat identifikatoru. Müştəri tərəfindən sorğu əməliyyatının əvvəlində yaradılır

7
İkinci keçdi
0
Hex
4
Ünvan əldə etmə prosesinin başlanğıcından saniyələrlə vaxt

9
Yükləmə bayraqları
0
Hex
2
Protokol parametrlərini göstərmək üçün təyin edilə bilən müəyyən bayraqlar. Bu halda 0 Unicast sorğu növü deməkdir

11
Müştəri IP ünvanı
0.0.0.0
Sətir
4
Müştərinin IP ünvanı (varsa)

15
Müştərinizin IP ünvanı
172.16.134.61
Sətir
4
server tərəfindən təklif olunan IP ünvanı (əgər varsa)

19
Növbəti server IP ünvanı
0.0.0.0
Sətir
4
Server IP ünvanı (məlumdursa)

23
Relay agent IP ünvanı
172.16.114.41
Sətir
4
Relay agentinin IP ünvanı (məsələn, keçid)

27
Müştəri MAC ünvanı
14:d6:4d:a7:c9:55
Hex
6
Paket göndərənin (müştəri) MAC ünvanı

31
Müştəri aparatının ünvan doldurulması
 
Hex
10
Rezerv edilmiş oturacaq. Adətən sıfırlarla doldurulur

41
Server host adı
 
Sətir
64
DHCP server adı. Adətən ötürülmür

105
Yükləmə faylının adı
 
Sətir
128
Yükləmə zamanı disksiz stansiyalar tərəfindən istifadə edilən serverdəki fayl adı

235
Sehrli peçenye
63: 82: 53: 63
Hex
4
"Sehrli" nömrə, buna görə də daxil olmaqla. bu paketin DHCP protokoluna aid olduğunu müəyyən edə bilərsiniz

DHCP seçimləri. İstənilən qaydada gedə bilər

236
Seçim nömrəsi
53
Dec
1
DHCP 53 paket tipini təyin edən 2-cü variant - DHCPOFFER

 
Seçim uzunluğu
1
Dec
1

 
Seçim dəyəri
2
Dec
1

 
Seçim nömrəsi
1
Dec
1
DHCP müştərisinə şəbəkə maskası təklif etmək seçimi

 
Seçim uzunluğu
4
Dec
1

 
Seçim dəyəri
255.255.224.0
Sətir
4

 
Seçim nömrəsi
3
Dec
1
DHCP müştərisinə defolt şlüz təklif etmək üçün seçim

 
Seçim uzunluğu
4
Dec
1

 
Seçim dəyəri
172.16.12.1
Sətir
4

 
Seçim nömrəsi
6
Dec
1
DNS müştərisinə DHCP təklif etmək üçün seçim

 
Seçim uzunluğu
4
Dec
1

 
Seçim dəyəri
8.8.8.8
Sətir
4

 
Seçim nömrəsi
51
Dec
1
Verilmiş şəbəkə parametrlərinin ömrü saniyələrlə, bundan sonra DHCP müştəri onları yenidən tələb etməlidir

 
Seçim uzunluğu
4
Dec
1

 
Seçim dəyəri
86400
Dec
4

 
Seçim nömrəsi
82
Dec
1
Seçim 82, DHCPDISCOVER-da gələnləri təkrarlayır

 
Seçim uzunluğu
18
Dec
1

 
Seçim dəyəri
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ek
Dec
18

 
Paketin sonu
255
Dec
1
255 paketin sonunu simvollaşdırır

DHCP TƏCİLİ

Müştəri DHCPOFFER aldıqdan sonra o, şəbəkə parametrlərini şəbəkədəki bütün DHCP serverlərinə deyil, yalnız DHCPOFFER təklifini ən çox “bəyəndiyi” konkret birinə tələb edən paket formalaşdırır. "Bəyənmə" meyarları fərqli ola bilər və müştərinin DHCP tətbiqindən asılıdır. Sorğunun alıcısı DHCP serverinin MAC ünvanından istifadə etməklə müəyyən edilir. Həmçinin, əgər serverin IP ünvanı əvvəllər əldə edilibsə, DHCPREQUEST paketi ilk dəfə DHCPDISCOVER yaratmadan müştəri tərəfindən göndərilə bilər.

DHCPREQUEST Paket Struktur Cədvəli

Paketdəki mövqe
Dəyərin adı (ümumi)
Misal
Giriş
Bayt
Şərhlər

1
Yükləmə sorğusu
1
Hex
1
Mesaj növü. 1 - müştəridən serverə sorğu, 2 - serverdən müştəriyə cavab

2
Aparat növü
1
Hex
1
Avadanlıq ünvanının növü, bu protokolda 1 - MAC

3
Avadanlıq uzunluğa müraciət edir
6
Hex
1
Cihazın MAC ünvanının uzunluğu

4
Mayaotu
1
Hex
1
Aralıq marşrutların sayı

5
əməlliyyatın kodu
23:cf:de:1d
Hex
4
Unikal əməliyyat identifikatoru. Müştəri tərəfindən sorğu əməliyyatının əvvəlində yaradılır

7
İkinci keçdi
0
Hex
4
Ünvan əldə etmə prosesinin başlanğıcından saniyələrlə vaxt

9
Yükləmə bayraqları
8000
Hex
2
Protokol parametrlərini göstərmək üçün təyin edilə bilən müəyyən bayraqlar. Bu halda “yayım” təyin edilir

11
Müştəri IP ünvanı
0.0.0.0
Sətir
4
Müştərinin IP ünvanı (varsa)

15
Müştərinizin IP ünvanı
172.16.134.61
Sətir
4
server tərəfindən təklif olunan IP ünvanı (əgər varsa)

19
Növbəti server IP ünvanı
0.0.0.0
Sətir
4
Server IP ünvanı (məlumdursa)

23
Relay agent IP ünvanı
172.16.114.41
Sətir
4
Relay agentinin IP ünvanı (məsələn, keçid)

27
Müştəri MAC ünvanı
14:d6:4d:a7:c9:55
Hex
6
Paket göndərənin (müştəri) MAC ünvanı

31
Müştəri aparatının ünvan doldurulması
 
Hex
10
Rezerv edilmiş oturacaq. Adətən sıfırlarla doldurulur

41
Server host adı
 
Sətir
64
DHCP server adı. Adətən ötürülmür

105
Yükləmə faylının adı
 
Sətir
128
Yükləmə zamanı disksiz stansiyalar tərəfindən istifadə edilən serverdəki fayl adı

235
Sehrli peçenye
63: 82: 53: 63
Hex
4
"Sehrli" nömrə, buna görə də daxil olmaqla. bu paketin DHCP protokoluna aid olduğunu müəyyən edə bilərsiniz

DHCP seçimləri. İstənilən qaydada gedə bilər

236
Seçim nömrəsi
53
Dec
3
DHCP paket tipi 53 - DHCPREQUEST müəyyən edən Seçim 3

 
Seçim uzunluğu
1
Dec
1

 
Seçim dəyəri
3
Dec
1

 
Seçim nömrəsi
61
Dec
1
Müştəri ID: 01 (Ehernet üçün) + müştəri MAC ünvanı

 
Seçim uzunluğu
7
Dec
1

 
Seçim dəyəri
01:2c:ab:25:ff:72:a6
Hex
7

 
Seçim nömrəsi
60
Dec
 
"Satıcı sinif identifikatoru". Mənim vəziyyətimdə o, DHCP müştəri versiyasını bildirir. Bəlkə də digər cihazlar fərqli bir şey qaytarır. Məsələn, Windows MSFT 5.0 hesabatını verir

 
Seçim uzunluğu
11
Dec
 

 
Seçim dəyəri
udhcp 0.9.8
Sətir
 

 
Seçim nömrəsi
55
 
1
Müştəri tərəfindən tələb olunan şəbəkə parametrləri. Tərkib fərqli ola bilər

01 - Şəbəkə maskası
03 - Gateway
06 - DNS
oc — Host adı
0f - şəbəkə domen adı
1c - yayım sorğusunun ünvanı (yayım)
42 - TFTP server adı
79 - Sinifsiz Statik Marşrut

 
Seçim uzunluğu
8
 
1

 
Seçim dəyəri
01:03:06:0c:0f:1c:42:79
 
8

 
Seçim nömrəsi
82
Dec
1
Seçim 82, DHCPDISCOVER-da gələnləri təkrarlayır

 
Seçim uzunluğu
18
Dec
1

 
Seçim dəyəri
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ek
Dec
18

 
Paketin sonu
255
Dec
1
255 paketin sonunu simvollaşdırır

DHCPACK

DHCP serverindən “bəli, düzdür, bu sizin IP ünvanınızdır və mən onu başqasına verməyəcəyəm” ifadəsinin təsdiqi olaraq serverdən müştəriyə DHCPACK formatında paket xidmət göstərir. O, digər paketlər kimi yayıma göndərilir. Baxmayaraq ki, Python-da tətbiq olunan DHCP serveri üçün aşağıdakı kodda, hər ehtimala qarşı, mən artıq məlumdursa, xüsusi müştəri IP-yə paket göndərməklə hər hansı yayım sorğusunu təkrarlayıram. Üstəlik, DHCP server DHCPACK paketinin müştəriyə çatıb-çatmadığına heç əhəmiyyət vermir. Müştəri DHCPACK qəbul etmirsə, bir müddət sonra sadəcə DHCPREQUEST-i təkrarlayır

DHCPACK Paket Struktur Cədvəli

Paketdəki mövqe
Dəyərin adı (ümumi)
Misal
Giriş
Bayt
Şərhlər

1
Yükləmə sorğusu
2
Hex
1
Mesaj növü. 1 - müştəridən serverə sorğu, 2 - serverdən müştəriyə cavab

2
Aparat növü
1
Hex
1
Avadanlıq ünvanının növü, bu protokolda 1 - MAC

3
Avadanlıq uzunluğa müraciət edir
6
Hex
1
Cihazın MAC ünvanının uzunluğu

4
Mayaotu
1
Hex
1
Aralıq marşrutların sayı

5
əməlliyyatın kodu
23:cf:de:1d
Hex
4
Unikal əməliyyat identifikatoru. Müştəri tərəfindən sorğu əməliyyatının əvvəlində yaradılır

7
İkinci keçdi
0
Hex
4
Ünvan əldə etmə prosesinin başlanğıcından saniyələrlə vaxt

9
Yükləmə bayraqları
8000
Hex
2
Protokol parametrlərini göstərmək üçün təyin edilə bilən müəyyən bayraqlar. Bu halda “yayım” təyin edilir

11
Müştəri IP ünvanı
0.0.0.0
Sətir
4
Müştərinin IP ünvanı (varsa)

15
Müştərinizin IP ünvanı
172.16.134.61
Sətir
4
server tərəfindən təklif olunan IP ünvanı (əgər varsa)

19
Növbəti server IP ünvanı
0.0.0.0
Sətir
4
Server IP ünvanı (məlumdursa)

23
Relay agent IP ünvanı
172.16.114.41
Sətir
4
Relay agentinin IP ünvanı (məsələn, keçid)

27
Müştəri MAC ünvanı
14:d6:4d:a7:c9:55
Hex
6
Paket göndərənin (müştəri) MAC ünvanı

31
Müştəri aparatının ünvan doldurulması
 
Hex
10
Rezerv edilmiş oturacaq. Adətən sıfırlarla doldurulur

41
Server host adı
 
Sətir
64
DHCP server adı. Adətən ötürülmür

105
Yükləmə faylının adı
 
Sətir
128
Yükləmə zamanı disksiz stansiyalar tərəfindən istifadə edilən serverdəki fayl adı

235
Sehrli peçenye
63: 82: 53: 63
Hex
4
"Sehrli" nömrə, buna görə də daxil olmaqla. bu paketin DHCP protokoluna aid olduğunu müəyyən edə bilərsiniz

DHCP seçimləri. İstənilən qaydada gedə bilər

236
Seçim nömrəsi
53
Dec
3
DHCP paket tipi 53-i təyin edən 5-cü variant - DHCPACK

 
Seçim uzunluğu
1
Dec
1

 
Seçim dəyəri
5
Dec
1

 
Seçim nömrəsi
1
Dec
1
DHCP müştərisinə şəbəkə maskası təklif etmək seçimi

 
Seçim uzunluğu
4
Dec
1

 
Seçim dəyəri
255.255.224.0
Sətir
4

 
Seçim nömrəsi
3
Dec
1
DHCP müştərisinə defolt şlüz təklif etmək üçün seçim

 
Seçim uzunluğu
4
Dec
1

 
Seçim dəyəri
172.16.12.1
Sətir
4

 
Seçim nömrəsi
6
Dec
1
DNS müştərisinə DHCP təklif etmək üçün seçim

 
Seçim uzunluğu
4
Dec
1

 
Seçim dəyəri
8.8.8.8
Sətir
4

 
Seçim nömrəsi
51
Dec
1
Verilmiş şəbəkə parametrlərinin ömrü saniyələrlə, bundan sonra DHCP müştəri onları yenidən tələb etməlidir

 
Seçim uzunluğu
4
Dec
1

 
Seçim dəyəri
86400
Dec
4

 
Seçim nömrəsi
82
Dec
1
Seçim 82, DHCPDISCOVER-da gələnləri təkrarlayır

 
Seçim uzunluğu
18
Dec
1

 
Seçim dəyəri
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4d:ek
Dec
18

 
Paketin sonu
255
Dec
1
255 paketin sonunu simvollaşdırır

Quraşdırma

Quraşdırma əslində iş üçün lazım olan python modullarının quraşdırılmasından ibarətdir. Güman edilir ki, MySQL artıq quraşdırılıb və konfiqurasiya olunub.

FreeBSD

pkg quraşdırın python3 python3 -m təmin edinpip pip3 mysql-konnektorunu quraşdırın

Ubuntu

sudo apt-get quraşdırma python3 sudo apt-get quraşdırma pip3 sudo pip3 quraşdırma mysql-konnektoru

Biz MySQL verilənlər bazası yaradırıq, ona pydhcp.sql zibilini yükləyirik və konfiqurasiya faylını konfiqurasiya edirik.

Konfiqurasiya

Bütün server parametrləri xml faylındadır. İstinad faylı:

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 test test pydhcp option_8.8.8.8_hex: sw_port82:1:20 option_22_hex: sw_port82:2:16 variant_18_hex:sw_mac:82:26 40 yuxarı(mac)=yuxarı('{option_3_AgentRemoteId_hex}') və yuxarı(port)=yuxarı('{option_1_AgentCircuitId_port_hex}') olan istifadəçilərdən ip,mask,router,dns seçin. yuxarı(mac)=yuxarı('{sw_mac}') və yuxarı(port)=yuxarı('{sw_port82}') olan istifadəçilərdən ip,mask,router,dns seçin. yuxarı(mac)=yuxarı('{ClientMacAddress}') olduğu istifadəçilərdən ip,mask,router,dns seçin tarixçəyə daxil edin (id,dt,mac,ip,comment) dəyərləri (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

İndi etiketlərdə daha ətraflı:

Dhcpserver bölməsi serveri işə salmaq üçün əsas parametrləri təsvir edir, yəni:

  • host - server 67 portda hansı IP ünvanını dinləyir
  • yayım - hansı ip DHCPOFFER və DHCPACK üçün yayımdır
  • DHCPServer - DHCP serverinin IP-si nədir
  • Verilmiş IP ünvanının LeaseTime icarə müddəti
  • ThreadLimit - port 67-də daxil olan UDP paketlərini emal etmək üçün eyni vaxtda neçə başlıq işləyir. Bu, yüksək yüklü layihələrdə kömək etmək üçün nəzərdə tutulub 😉
  • defaultMask,defaultRouter,defaultDNS - verilənlər bazasında IP tapılarsa, lakin onun üçün əlavə parametrlər göstərilməyibsə, abunəçiyə standart olaraq nə təklif olunur

mysql bölməsi:

host, istifadəçi adı, parol, əsas ad - hər şey özü üçün danışır. Təxmini verilənlər bazası strukturu yerləşdirilib Github

Sorğu bölməsi: TƏKLİF/ACK almaq üçün sorğular burada təsvir edilmişdir:

  • təklif_sayı — ip, maska, marşrutlaşdırıcı, dns kimi nəticəni qaytaran sorğulu sətirlərin sayı
  • təklif_n — sorğu sətri. Qayıdış boşdursa, aşağıdakı təklif sorğusunu yerinə yetirir
  • history_sql - məsələn, abunəçinin "avtorizasiya tarixçəsi"nə yazan sorğu

Sorğulara seçimlər bölməsindəki hər hansı dəyişənlər və ya DHCP protokolundan seçimlər daxil ola bilər.

Seçimlər bölməsi. Burada daha maraqlı olur. Burada sorğu bölməsində daha sonra istifadə edə biləcəyimiz dəyişənlər yarada bilərik.

Misal üçün:

option_82_hex:sw_port1:20:22

, bu komanda xətti DHCP sorğu seçimində 82 gələn bütün xətti hex formatında, 20-22 bayt daxil olmaqla götürür və onu yeni dəyişən sw_port1-ə qoyur (sorğunun gəldiyi yerdən keçid portu)

option_82_hex:sw_mac:26:40

, 26:40 diapazonundan hex götürərək sw_mac dəyişənini təyin edin

Serveri -d keçidi ilə işə salmaqla sorğularda istifadə oluna biləcək bütün mümkün variantları görə bilərsiniz. Bu log kimi bir şey görəcəyik:

--67ad0025224 , b'x764xa91xe5xa0xa3xa5-x9fx8a' , ('8', 172.30.114.25) nömrəsindən 68 nömrəli porta DHCPINFORM paketi gəldi. : b'x0025224 764%"Jxd00d' , ' HType': 'Ethernet', 'HostName': b'x7xa91xe5xa0xa3xa5-x9fx8a', 'ReqListDNS': Doğru, 'ReqListDomainName': Doğru, 'ReqListPerfowmRouterDiscoveric,State'Req:L:'ReqList Marşrut': Doğrudur, 'ReqListSubnetM soruşur ': Doğrudur, 'ReqListVendorSpecInfo': 8, 'RequestedIpAddress': '43', 'Vendor': b'MSFT 0.0.0.0', 'chaddr': '5.0': '0025224':'764.'172.30.128.13.'00.' ' , 'bayraqlar ': b'x00x172.30.114.25', 'giaddr': '308', 'gpoz': 6, 'hlen': 1, 'hops': 82, 'htype': 'MAC', 'magic_cookie:' b'cx12Sc ', 'op': 'DHCPINFORM', 'seçim12': 53, 'seçim53': 55, 'seçim55': 60, 'option60': 61, 'seçim61': 82, 'seçim82': 82, variant_12_bayt': b'x01x06x00x04x00x01x00x06x02x08x00x06' b'x00x1x9eXx2exb82xad', 'seçim_12010600040001000602080006001_hex': '589 'option_2_len': 82 18, 'option_82_str': "b'x12x01x06x00x04x00x01x00x06x02x08x00x06x00x1eXx9exb2xad'", 'nəticə': Yanlış', 768's 'siaddr': '0.0.0.0', 'sw_mac': '001e589eb2ad', 'sw_port1': '06', 'xidbyte': b'

Müvafiq olaraq, biz istənilən dəyişəni {}-ə sarıya bilərik və o, SQL sorğusunda istifadə olunacaq.

Müştərinin IP ünvanını aldığını tarixə yazaq:

Python-da DHCP+Mysql server

Python-da DHCP+Mysql server

Server başlanğıcı

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

— d konsol çıxış rejimi DEBUG
- c <fayl adı> konfiqurasiya faylı

Debriefing

İndi Python-da serverin tətbiqi ilə bağlı daha ətraflı məlumat. Bu bir ağrıdır. Python tez öyrənildi. Bir çox anlar “vay, birtəhər işə düzəltdim” üslubunda hazırlanır. Heç optimallaşdırılmayıb və əsasən Python inkişafında az təcrübəyə görə bu formada qalıb. Mən “kodda” server tətbiqinin ən maraqlı tərəfləri üzərində dayanacağam.

XML konfiqurasiya faylı təhlilçisi

Standart Python modulu xml.dom istifadə olunur. Sadə görünür, lakin icra zamanı bu moduldan istifadə edən şəbəkədə aydın sənədlərin və nümunələrin nəzərəçarpacaq dərəcədə çatışmazlığı var idi.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") mconfig-də element üçün: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].Child. gconfig["mysql_username"]=elem.getElementsByTagName("username")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("password")[0].firstChild_"tasse" gconfigname." =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") dconfig-də element üçün: gconfig["broadcast"]=elem.getElementsByTagcastName("0.]" firstChild.data gconfig["dhcp_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["dhcp_LeaseTime"]=elem.getElementsByTagName("İcarəTime")[0]d.config dhcp_threadlimit "] = int (elem.getelementsbytagname (" tövlələrin ") [0] = Elem.Getelementsbytagname ("DefoltMask") [0] .firstchild.data gconfig ["dhcp_defaultrouter"] = "Defoltrouter") [0]. defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") qconfig-də element üçün: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild üçün. range(int(gconfig["offer_count"])): gconfig["offer_"+str(num+0)]=elem.getElementsByTagName("offer_"+str(num+1))[1].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[0].firstChild.data options=tree.getElementsByTagName("seçimlər") elementlər üçün: node=elem.getElementsByTagName("seçim") node-dəki seçimlər üçün : optionsMod.append(options.firstChild.data)

Çox iş parçacığı

Qəribədir ki, Python-da multithreading çox aydın və sadə şəkildə həyata keçirilir.

def PacketWork(data,addr): ... # daxil olan paketin təhlili və ona cavab verilməsinin həyata keçirilməsi ... isə Doğrudur: data, addr = udp_socket.recvfrom(1024) # UDP paket mövzusunu gözləyir = threading.Thread( target=PacketWork , args=(data,addr,)).start() # gəldi - biz threading.active_count() >gconfig["dhcp_ThreadLimit"] zamanı parametrlərlə fonda əvvəllər müəyyən edilmiş PacketWork funksiyasını işə salırıq: vaxt. sleep(1) # əgər nömrə Parametrlərdə olduğundan artıq işləyən mövzular çoxdursa, onlardan daha az olana qədər gözləyirik

DHCP paketini qəbul/göndər

Şəbəkə kartı ilə gələn UDP paketlərini tutmaq üçün yuvanı "qaldırmaq" lazımdır:

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

, bayraqlar haradadır:

  • AF_INET - o deməkdir ki, ünvan formatı IP olacaq: port. AF_UNIX də ola bilər - burada ünvan fayl adı ilə verilir.
  • SOCK_DGRAM - o deməkdir ki, biz “xam paketi” qəbul etmirik, lakin artıq firewalldan keçmiş və qismən kəsilmiş paketi olan paketi qəbul edirik. Bunlar. biz yalnız UDP paket paketinin “fiziki” komponenti olmayan UDP paketini alırıq. Əgər siz SOCK_RAW bayrağından istifadə edirsinizsə, onda siz də bu “sarğı”nı təhlil etməli olacaqsınız.

Paketin göndərilməsi yayım kimi ola bilər:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #soketi yayım rejiminə keçirin rz=udp_socket.sendto(packettack, (gconfig["yayım"],68))

, və "paketin haradan gəldiyi" ünvanına:

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # rozetkanı çox dinləyici rejiminə keçirin rz=udp_socket.sendto(packettack, addr)

, burada SOL_SOCKET variantları təyin etmək üçün “protokol səviyyəsi” deməkdir,

, dəbilqə paketinin “yayım” olması üçün SO_BROADCAST seçimi

  ,SO_REUSEADDR seçimi rozetkanı “çox dinləyici” rejiminə keçir. Teorik olaraq, bu halda lazımsızdır, lakin sınaqdan keçirdiyim FreeBSD serverlərindən birində kod bu seçim olmadan işləmədi.

DHCP paketinin təhlili

Python-u çox bəyəndiyim yer budur. Belə çıxır ki, qutudan kənarda bayt kodu ilə kifayət qədər çevik olmağa imkan verir. Çox asanlıqla onluq dəyərlərə, sətirlərə və hex-ə çevrilməsinə icazə vermək - yəni. paketin strukturunu anlamaq üçün əslində ehtiyacımız budur. Beləliklə, məsələn, HEX-də bir sıra bayt və sadəcə bayt əldə edə bilərsiniz:

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

, baytları bir quruluşa yığın:

res["bayraqlar"]=paket('BB',data[10],data[11])

Quruluşdan IP alın:

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

Və əksinə:

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

Hələlik bu qədər 😉

Mənbə: www.habr.com

Добавить комментарий