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:
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.
Şə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.
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.
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.
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:
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
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
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:
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:
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:
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.
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: