خادم DHCP+Mysql في بايثون

خادم DHCP+Mysql في بايثون

وكان الغرض من هذا المشروع:

  • التعرف على DHCP على شبكة IPv4
  • تعلم بايثون (أكثر قليلاً من الصفر 😉)
  • استبدال الخادم DB2DHCP (شوكتي)، أصلي هنا، والذي أصبح تجميعه لنظام التشغيل الجديد أكثر صعوبة. وأنا لا أحب أن يكون الأمر ثنائيًا ولا توجد طريقة "للتغيير الآن"
  • الحصول على خادم DHCP عامل مع إمكانية تحديد عنوان IP الخاص بالمشترك باستخدام جهاز Mac الخاص بالمشترك أو مجموعة تبديل mac+port (الخيار 82)
  • كتابة دراجة أخرى (أوه! هذا هو نشاطي المفضل)
  • تلقي تعليقات حول أسلوبك في النادي على هبراهابر (أو الأفضل من ذلك، دعوة) 😉

النتيجة: يعمل 😉 تم اختباره على FreeBSD ونظام التشغيل Ubuntu. من الناحية النظرية، يمكن أن يطلب من التعليمات البرمجية العمل تحت أي نظام تشغيل، لأنه يبدو أنه لا توجد روابط محددة في الكود.
بحرص! هناك الكثير في المستقبل.

رابط إلى مستودع للهواة "لمسة حية".

إن عملية التثبيت والتكوين واستخدام نتيجة "دراسة الأجهزة" أقل بكثير، ثم نظرية صغيرة حول بروتوكول DHCP. لنفسي. وللتاريخ 😉

القليل من النظرية

ما هو DHCP

هذا هو بروتوكول شبكة يسمح للجهاز بمعرفة عنوان IP الخاص به (والمعلمات الأخرى مثل البوابة وDNS وما إلى ذلك) من خادم DHCP. يتم تبادل الحزم باستخدام بروتوكول UDP. المبدأ العام لتشغيل الجهاز عند طلب معلمات الشبكة هو كما يلي:

  1. يرسل الجهاز (العميل) طلب بث UDP (DHCPDISCOVER) عبر الشبكة مع الطلب "حسنًا، شخص ما يعطيني عنوان IP". علاوة على ذلك، عادة (ولكن ليس دائمًا) يحدث الطلب من المنفذ 68 (المصدر)، والوجهة هي المنفذ 67 (الوجهة). تقوم بعض الأجهزة أيضًا بإرسال حزم من المنفذ 67. يتم تضمين عنوان MAC الخاص بجهاز العميل داخل حزمة DHCPDISCOVER.
  2. تشكل جميع خوادم DHCP الموجودة على الشبكة (وقد يكون هناك العديد منها) عرض DHCPOFFER مع إعدادات الشبكة للجهاز الذي أرسل DHCPDISCOVER، وكذلك بثه عبر الشبكة. يعتمد تحديد هوية هذه الحزمة على عنوان MAC الخاص بالعميل المقدم مسبقًا في طلب DHCPDISCOVER.
  3. يقبل العميل الحزم التي تحتوي على مقترحات لإعدادات الشبكة، ويختار الحزم الأكثر جاذبية (قد تكون المعايير مختلفة، على سبيل المثال، وقت تسليم الحزمة، وعدد المسارات الوسيطة)، ويقدم "طلبًا رسميًا" DHCPREQUEST مع إعدادات الشبكة من خادم DHCP الذي يحبه. في هذه الحالة، تنتقل الحزمة إلى خادم DHCP محدد.
  4. يرسل الخادم الذي استقبل DHCPREQUEST حزمة تنسيق DHCPACK، حيث يسرد مرة أخرى إعدادات الشبكة المخصصة لهذا العميل

خادم DHCP+Mysql في بايثون

بالإضافة إلى ذلك، هناك حزم DHCPINFORM التي تأتي من العميل، والغرض منها هو إعلام خادم DHCP بأن "العميل على قيد الحياة" ويستخدم إعدادات الشبكة الصادرة. في تنفيذ هذا الخادم، يتم تجاهل هذه الحزم.

تنسيق الحزمة

بشكل عام، يبدو إطار حزمة Ethernet كما يلي:

خادم DHCP+Mysql في بايثون

في حالتنا، سننظر فقط في البيانات مباشرة من محتويات حزمة UDP، بدون رؤوس بروتوكول طبقة OSI، وهي بنية DHCP:

اكتشاف DHCP

لذلك، تبدأ عملية الحصول على عنوان IP لجهاز ما عندما يرسل عميل DHCP طلب بث من المنفذ 68 إلى 255.255.255.255:67. في هذه الحزمة، يقوم العميل بتضمين عنوان MAC الخاص به، بالإضافة إلى ما يريد تلقيه بالضبط من خادم DHCP. تم توضيح هيكل الحزمة في الجدول أدناه.

جدول بنية الحزمة DHCPDISCOVER

الموقف في الحزمة
اسم القيمة
مثال
فكرة
بايت
توضيح

1
طلب التمهيد
1
عرافة
1
نوع الرسالة. 1 - طلب من عميل إلى خادم، 2 - استجابة من خادم إلى عميل

2
نوع الجهاز
1
عرافة
1
نوع عنوان الجهاز في هذا البروتوكول 1 - MAC

3
طول عناوين الأجهزة
6
عرافة
1
طول عنوان MAC للجهاز

4
القفزات
1
عرافة
1
عدد الطرق الوسيطة

5
معرف المعاملة
23:راجع:دي:1د
عرافة
4
معرف المعاملة الفريد. يتم إنشاؤها بواسطة العميل في بداية عملية الطلب

7
انقضت الثانية
0
عرافة
4
الوقت بالثواني من بداية عملية الحصول على العنوان

9
أعلام التمهيد
0
عرافة
2
إشارات معينة يمكن تعيينها للإشارة إلى معلمات البروتوكول

11
عنوان IP للعميل
0.0.0.0
صف
4
عنوان IP للعميل (إن وجد)

15
عنوان IP الخاص بالعميل
0.0.0.0
صف
4
عنوان IP الذي يقدمه الخادم (إن وجد)

19
عنوان IP للخادم التالي
0.0.0.0
صف
4
عنوان IP للخادم (إذا كان معروفًا)

23
عنوان IP لوكيل الترحيل
172.16.114.41
صف
4
عنوان IP الخاص بعامل الترحيل (على سبيل المثال، المحول)

27
عنوان MAC للعميل
14:d6:4d:a7:c9:55
عرافة
6
عنوان MAC لمرسل الحزمة (العميل)

31
حشوة عنوان أجهزة العميل
 
عرافة
10
مقعد محجوز. عادة ما تكون مليئة بالأصفار

41
اسم مضيف الخادم
 
صف
64
اسم خادم DHCP. عادة لا تنتقل

105
اسم ملف التمهيد
 
صف
128
اسم الملف الموجود على الخادم الذي تستخدمه المحطات التي لا تحتوي على أقراص عند التشغيل

235
ملفات تعريف الارتباط السحرية
63: 82: 53: 63
عرافة
4
الرقم "السحري" والذي بموجبه يشمل. يمكنك تحديد أن هذه الحزمة تنتمي إلى بروتوكول DHCP

خيارات DHCP. يمكن أن تذهب في أي أمر

236
رقم الخيار
53
ديسمبر
1
الخيار 53، الذي يحدد نوع حزمة DHCP

1 - DHCPDISCOVER
3 - طلب DHCP
2 - ديهكبوفير
5 - دكباك
8 - معلومات DHCP

 
طول الخيار
1
ديسمبر
1

 
قيمة الخيار
1
ديسمبر
1

 
رقم الخيار
50
ديسمبر
1
ما هو عنوان IP الذي يريد العميل الحصول عليه؟

 
طول الخيار
4
ديسمبر
1

 
قيمة الخيار
172.16.134.61
صف
4

 
رقم الخيار
55
 
1
معلمات الشبكة المطلوبة من قبل العميل. قد يختلف التكوين

01 - قناع الشبكة
03 - البوابة
06 - DNS
أوك - اسم المضيف
0f - اسم مجال الشبكة
1ج - عنوان طلب البث (البث)
42 - اسم خادم TFTP
79 - طريق ثابت بلا فئات

 
طول الخيار
8
 
1

 
قيمة الخيار
01:03:06:0c:0f:1c:42:79
 
8

 
رقم الخيار
82
ديسمبر
 
الخيار 82، الذي ينقل عنوان MAC الخاص بجهاز المكرر وبعض القيم الإضافية.

في أغلب الأحيان، يكون هذا هو منفذ المحول الذي يعمل عليه عميل DHCP النهائي. يحتوي هذا الخيار على معلمات إضافية. البايت الأول هو رقم "الخيار الفرعي"، والثاني هو طوله، ثم قيمته.

في هذه الحالة، في الخيار 82، تتداخل الخيارات الفرعية:
معرف دائرة الوكيل = 00:04:00:01:00:04، حيث أن البايتتين الأخيرتين هما منفذ عميل DHCP الذي جاء منه الطلب

معرف الوكيل البعيد = 00:06:c8:be:19:93:11:48 - عنوان MAC لجهاز مكرر DHCP

 
طول الخيار
18
ديسمبر
 

 
قيمة الخيار
01:06
00:04:00:01:00:04
02:08
00:06:c8:be:19:93:11:48
عرافة
 

 
نهاية الحزمة
255
ديسمبر
1
255 يرمز إلى نهاية الحزمة

DHCPOFFER

بمجرد أن يتلقى الخادم حزمة DHCPDISCOVER وإذا رأى أنه يمكنه أن يقدم للعميل شيئًا من الحزمة المطلوبة، فإنه يقوم بإنشاء استجابة لها - DHCPDISCOVER. يتم إرسال الرد إلى المنفذ "من حيث جاء" عن طريق البث، لأن في هذه اللحظة، ليس لدى العميل عنوان IP بعد، وبالتالي يمكنه قبول الحزمة فقط إذا تم إرسالها عن طريق البث. يتعرف العميل على أن هذه حزمة خاصة به من خلال عنوان MAC الخاص به داخل الحزمة، بالإضافة إلى رقم المعاملة الذي يقوم بإنشائه في وقت إنشاء الحزمة الأولى.

جدول بنية الحزمة DHCPOFFER

الموقف في الحزمة
اسم القيمة (عام)
مثال
فكرة
بايت
توضيح

1
طلب التمهيد
1
عرافة
1
نوع الرسالة. 1 - طلب من عميل إلى خادم، 2 - استجابة من خادم إلى عميل

2
نوع الجهاز
1
عرافة
1
نوع عنوان الجهاز في هذا البروتوكول 1 - MAC

3
طول عناوين الأجهزة
6
عرافة
1
طول عنوان MAC للجهاز

4
القفزات
1
عرافة
1
عدد الطرق الوسيطة

5
معرف المعاملة
23:راجع:دي:1د
عرافة
4
معرف المعاملة الفريد. يتم إنشاؤها بواسطة العميل في بداية عملية الطلب

7
انقضت الثانية
0
عرافة
4
الوقت بالثواني من بداية عملية الحصول على العنوان

9
أعلام التمهيد
0
عرافة
2
إشارات معينة يمكن تعيينها للإشارة إلى معلمات البروتوكول. في هذه الحالة، 0 يعني نوع طلب Unicast

11
عنوان IP للعميل
0.0.0.0
صف
4
عنوان IP للعميل (إن وجد)

15
عنوان IP الخاص بالعميل
172.16.134.61
صف
4
عنوان IP الذي يقدمه الخادم (إن وجد)

19
عنوان IP للخادم التالي
0.0.0.0
صف
4
عنوان IP للخادم (إذا كان معروفًا)

23
عنوان IP لوكيل الترحيل
172.16.114.41
صف
4
عنوان IP الخاص بعامل الترحيل (على سبيل المثال، المحول)

27
عنوان MAC للعميل
14:d6:4d:a7:c9:55
عرافة
6
عنوان MAC لمرسل الحزمة (العميل)

31
حشوة عنوان أجهزة العميل
 
عرافة
10
مقعد محجوز. عادة ما تكون مليئة بالأصفار

41
اسم مضيف الخادم
 
صف
64
اسم خادم DHCP. عادة لا تنتقل

105
اسم ملف التمهيد
 
صف
128
اسم الملف الموجود على الخادم الذي تستخدمه المحطات التي لا تحتوي على أقراص عند التشغيل

235
ملفات تعريف الارتباط السحرية
63: 82: 53: 63
عرافة
4
الرقم "السحري" والذي بموجبه يشمل. يمكنك تحديد أن هذه الحزمة تنتمي إلى بروتوكول DHCP

خيارات DHCP. يمكن أن تذهب في أي أمر

236
رقم الخيار
53
ديسمبر
1
الخيار 53، الذي يحدد نوع حزمة DHCP 2 - DHCPOFFER

 
طول الخيار
1
ديسمبر
1

 
قيمة الخيار
2
ديسمبر
1

 
رقم الخيار
1
ديسمبر
1
خيار تقديم قناع شبكة لعميل DHCP

 
طول الخيار
4
ديسمبر
1

 
قيمة الخيار
255.255.224.0
صف
4

 
رقم الخيار
3
ديسمبر
1
خيار تقديم بوابة افتراضية لعميل DHCP

 
طول الخيار
4
ديسمبر
1

 
قيمة الخيار
172.16.12.1
صف
4

 
رقم الخيار
6
ديسمبر
1
خيار تقديم DHCP لعميل DNS

 
طول الخيار
4
ديسمبر
1

 
قيمة الخيار
8.8.8.8
صف
4

 
رقم الخيار
51
ديسمبر
1
عمر معلمات الشبكة الصادرة بالثواني، وبعد ذلك يجب على عميل DHCP طلبها مرة أخرى

 
طول الخيار
4
ديسمبر
1

 
قيمة الخيار
86400
ديسمبر
4

 
رقم الخيار
82
ديسمبر
1
الخيار 82، يكرر ما جاء في DHCPDISCOVER

 
طول الخيار
18
ديسمبر
1

 
قيمة الخيار
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4 د:المركز الأوروبي
ديسمبر
18

 
نهاية الحزمة
255
ديسمبر
1
255 يرمز إلى نهاية الحزمة

طلب DHCP

بعد أن يتلقى العميل DHCPOFFER، يقوم بتكوين حزمة تطلب معلمات الشبكة ليس لجميع خوادم DHCP الموجودة على الشبكة، ولكن فقط لخادم واحد محدد، الذي "أعجبه" عرض DHCPOFFER الخاص به أكثر من غيره. يمكن أن تكون معايير "الإعجاب" مختلفة وتعتمد على تطبيق DHCP الخاص بالعميل. يتم تحديد مستلم الطلب باستخدام عنوان MAC الخاص بخادم DHCP. بالإضافة إلى ذلك، يمكن للعميل إرسال حزمة DHCPREQUEST دون إنشاء DHCPDISCOVER أولاً، إذا تم الحصول على عنوان IP الخاص بالخادم مسبقًا.

جدول بنية الحزمة DHCPREQUEST

الموقف في الحزمة
اسم القيمة (عام)
مثال
فكرة
بايت
توضيح

1
طلب التمهيد
1
عرافة
1
نوع الرسالة. 1 - طلب من عميل إلى خادم، 2 - استجابة من خادم إلى عميل

2
نوع الجهاز
1
عرافة
1
نوع عنوان الجهاز في هذا البروتوكول 1 - MAC

3
طول عناوين الأجهزة
6
عرافة
1
طول عنوان MAC للجهاز

4
القفزات
1
عرافة
1
عدد الطرق الوسيطة

5
معرف المعاملة
23:راجع:دي:1د
عرافة
4
معرف المعاملة الفريد. يتم إنشاؤها بواسطة العميل في بداية عملية الطلب

7
انقضت الثانية
0
عرافة
4
الوقت بالثواني من بداية عملية الحصول على العنوان

9
أعلام التمهيد
8000
عرافة
2
إشارات معينة يمكن تعيينها للإشارة إلى معلمات البروتوكول. في هذه الحالة، يتم تعيين "البث".

11
عنوان IP للعميل
0.0.0.0
صف
4
عنوان IP للعميل (إن وجد)

15
عنوان IP الخاص بالعميل
172.16.134.61
صف
4
عنوان IP الذي يقدمه الخادم (إن وجد)

19
عنوان IP للخادم التالي
0.0.0.0
صف
4
عنوان IP للخادم (إذا كان معروفًا)

23
عنوان IP لوكيل الترحيل
172.16.114.41
صف
4
عنوان IP الخاص بعامل الترحيل (على سبيل المثال، المحول)

27
عنوان MAC للعميل
14:d6:4d:a7:c9:55
عرافة
6
عنوان MAC لمرسل الحزمة (العميل)

31
حشوة عنوان أجهزة العميل
 
عرافة
10
مقعد محجوز. عادة ما تكون مليئة بالأصفار

41
اسم مضيف الخادم
 
صف
64
اسم خادم DHCP. عادة لا تنتقل

105
اسم ملف التمهيد
 
صف
128
اسم الملف الموجود على الخادم الذي تستخدمه المحطات التي لا تحتوي على أقراص عند التشغيل

235
ملفات تعريف الارتباط السحرية
63: 82: 53: 63
عرافة
4
الرقم "السحري" والذي بموجبه يشمل. يمكنك تحديد أن هذه الحزمة تنتمي إلى بروتوكول DHCP

خيارات DHCP. يمكن أن تذهب في أي أمر

236
رقم الخيار
53
ديسمبر
3
الخيار 53، الذي يحدد نوع حزمة DHCP 3 - DHCPREQUEST

 
طول الخيار
1
ديسمبر
1

 
قيمة الخيار
3
ديسمبر
1

 
رقم الخيار
61
ديسمبر
1
معرف العميل: 01 (لـ Ehernet) + عنوان MAC للعميل

 
طول الخيار
7
ديسمبر
1

 
قيمة الخيار
01:2c:ab:25:ff:72:a6
عرافة
7

 
رقم الخيار
60
ديسمبر
 
"معرف فئة البائع". في حالتي، فإنه يُبلغ عن إصدار عميل DHCP. ربما ترجع الأجهزة الأخرى شيئًا مختلفًا. Windows على سبيل المثال يُبلغ عن MSFT 5.0

 
طول الخيار
11
ديسمبر
 

 
قيمة الخيار
يودكب 0.9.8
صف
 

 
رقم الخيار
55
 
1
معلمات الشبكة المطلوبة من قبل العميل. قد يختلف التكوين

01 - قناع الشبكة
03 - البوابة
06 - DNS
أوك - اسم المضيف
0f - اسم مجال الشبكة
1ج - عنوان طلب البث (البث)
42 - اسم خادم TFTP
79 - طريق ثابت بلا فئات

 
طول الخيار
8
 
1

 
قيمة الخيار
01:03:06:0c:0f:1c:42:79
 
8

 
رقم الخيار
82
ديسمبر
1
الخيار 82، يكرر ما جاء في DHCPDISCOVER

 
طول الخيار
18
ديسمبر
1

 
قيمة الخيار
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4 د:المركز الأوروبي
ديسمبر
18

 
نهاية الحزمة
255
ديسمبر
1
255 يرمز إلى نهاية الحزمة

DHCPACK

كتأكيد على أن "نعم، هذا صحيح، هذا هو عنوان IP الخاص بك، ولن أعطيه لأي شخص آخر" من خادم DHCP، يتم تقديم حزمة بتنسيق DHCPACK من الخادم إلى العميل. يتم إرساله بثًا تمامًا مثل الحزم الأخرى. على الرغم من أنه في الكود أدناه لخادم DHCP المطبق في Python، فقط في حالة تكرار أي طلب بث عن طريق إرسال حزمة إلى عنوان IP لعميل معين، إذا كان معروفًا بالفعل. علاوة على ذلك، لا يهتم خادم DHCP على الإطلاق بما إذا كانت حزمة DHCPACK قد وصلت إلى العميل. إذا لم يتلق العميل DHCPACK، فبعد فترة من الوقت يكرر DHCPREQUEST

جدول بنية حزمة DHCPACK

الموقف في الحزمة
اسم القيمة (عام)
مثال
فكرة
بايت
توضيح

1
طلب التمهيد
2
عرافة
1
نوع الرسالة. 1 - طلب من عميل إلى خادم، 2 - استجابة من خادم إلى عميل

2
نوع الجهاز
1
عرافة
1
نوع عنوان الجهاز في هذا البروتوكول 1 - MAC

3
طول عناوين الأجهزة
6
عرافة
1
طول عنوان MAC للجهاز

4
القفزات
1
عرافة
1
عدد الطرق الوسيطة

5
معرف المعاملة
23:راجع:دي:1د
عرافة
4
معرف المعاملة الفريد. يتم إنشاؤها بواسطة العميل في بداية عملية الطلب

7
انقضت الثانية
0
عرافة
4
الوقت بالثواني من بداية عملية الحصول على العنوان

9
أعلام التمهيد
8000
عرافة
2
إشارات معينة يمكن تعيينها للإشارة إلى معلمات البروتوكول. في هذه الحالة، يتم تعيين "البث".

11
عنوان IP للعميل
0.0.0.0
صف
4
عنوان IP للعميل (إن وجد)

15
عنوان IP الخاص بالعميل
172.16.134.61
صف
4
عنوان IP الذي يقدمه الخادم (إن وجد)

19
عنوان IP للخادم التالي
0.0.0.0
صف
4
عنوان IP للخادم (إذا كان معروفًا)

23
عنوان IP لوكيل الترحيل
172.16.114.41
صف
4
عنوان IP الخاص بعامل الترحيل (على سبيل المثال، المحول)

27
عنوان MAC للعميل
14:d6:4d:a7:c9:55
عرافة
6
عنوان MAC لمرسل الحزمة (العميل)

31
حشوة عنوان أجهزة العميل
 
عرافة
10
مقعد محجوز. عادة ما تكون مليئة بالأصفار

41
اسم مضيف الخادم
 
صف
64
اسم خادم DHCP. عادة لا تنتقل

105
اسم ملف التمهيد
 
صف
128
اسم الملف الموجود على الخادم الذي تستخدمه المحطات التي لا تحتوي على أقراص عند التشغيل

235
ملفات تعريف الارتباط السحرية
63: 82: 53: 63
عرافة
4
الرقم "السحري" والذي بموجبه يشمل. يمكنك تحديد أن هذه الحزمة تنتمي إلى بروتوكول DHCP

خيارات DHCP. يمكن أن تذهب في أي أمر

236
رقم الخيار
53
ديسمبر
3
الخيار 53، الذي يحدد نوع حزمة DHCP 5 - DHCPACK

 
طول الخيار
1
ديسمبر
1

 
قيمة الخيار
5
ديسمبر
1

 
رقم الخيار
1
ديسمبر
1
خيار تقديم قناع شبكة لعميل DHCP

 
طول الخيار
4
ديسمبر
1

 
قيمة الخيار
255.255.224.0
صف
4

 
رقم الخيار
3
ديسمبر
1
خيار تقديم بوابة افتراضية لعميل DHCP

 
طول الخيار
4
ديسمبر
1

 
قيمة الخيار
172.16.12.1
صف
4

 
رقم الخيار
6
ديسمبر
1
خيار تقديم DHCP لعميل DNS

 
طول الخيار
4
ديسمبر
1

 
قيمة الخيار
8.8.8.8
صف
4

 
رقم الخيار
51
ديسمبر
1
عمر معلمات الشبكة الصادرة بالثواني، وبعد ذلك يجب على عميل DHCP طلبها مرة أخرى

 
طول الخيار
4
ديسمبر
1

 
قيمة الخيار
86400
ديسمبر
4

 
رقم الخيار
82
ديسمبر
1
الخيار 82، يكرر ما جاء في DHCPDISCOVER

 
طول الخيار
18
ديسمبر
1

 
قيمة الخيار
01:08:00:06:00
01:01:00:00:01
02:06:00:03:0f
26:4 د:المركز الأوروبي
ديسمبر
18

 
نهاية الحزمة
255
ديسمبر
1
255 يرمز إلى نهاية الحزمة

تركيب

يتكون التثبيت في الواقع من تثبيت وحدات بايثون اللازمة للعمل. من المفترض أن MySQL قد تم تثبيته وتكوينه بالفعل.

فري

pkg تثبيت python3 python3 -m Enpip pip3 تثبيت موصل MySQL

أوبونتو

سودو الرابطة بين الحصول على تثبيت python3 سودو الرابطة بين الحصول على تثبيت pip3 سودو pip3 تثبيت الخلية موصل

نقوم بإنشاء قاعدة بيانات MySQL، ونرفع ملف pydhcp.sql إليها، ونقوم بتكوين ملف التكوين.

ترتيب

جميع إعدادات الخادم موجودة في ملف xml. الملف المرجعي:

1.0 0.0.0.0 255.255.255.255 192.168.0.71 8600 1 255.255.255.0 192.168.0.1 مضيف محلي امتحان امتحان 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 حدد ip,mask,router,dns من المستخدمين حيث Upper(mac)=upper('{option_3_AgentRemoteId_hex}') و Upper(port)=upper('{option_1_AgentCircuitId_port_hex}') حدد ip,mask,router,dns من المستخدمين حيث Upper(mac)=upper('{sw_mac}') و Upper(port)=upper('{sw_port82}') حدد ip,mask,router,dns من المستخدمين حيث Upper(mac)=upper('{ClientMacAddress}') أدخل في السجل (id,dt,mac,ip,comment) القيم (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

الآن بمزيد من التفاصيل حول العلامات:

يصف قسم dhcpserver الإعدادات الأساسية لبدء تشغيل الخادم، وهي:

  • المضيف - عنوان IP الذي يستمع إليه الخادم على المنفذ 67
  • البث - أي عنوان IP هو البث لـ DHCPOFFER وDHCPACK
  • DHCPServer - ما هو IP لخادم DHCP
  • LeaseTime وقت تأجير عنوان IP الصادر
  • ThreadLimit - كم عدد الخيوط التي تعمل في وقت واحد لمعالجة حزم UDP الواردة على المنفذ 67. من المفترض أن يساعد في المشاريع ذات التحميل العالي 😉
  • defaultMask,defaultRouter,defaultDNS - ما يتم تقديمه للمشترك افتراضيًا إذا تم العثور على عنوان IP في قاعدة البيانات، ولكن لم يتم تحديد معلمات إضافية له

قسم الخلية:

المضيف واسم المستخدم وكلمة المرور والاسم الأساسي - كل شيء يتحدث عن نفسه. يتم نشر بنية قاعدة البيانات التقريبية على GitHub جيثب:

قسم الاستعلام: طلبات تلقي العرض/الإقرار موصوفة هنا:

  • Offer_count - عدد الأسطر التي تحتوي على طلبات تُرجع نتيجة مثل ip،mask،router،dns
  • Offer_n - سلسلة الاستعلام. إذا كان الإرجاع فارغًا، فقم بتنفيذ طلب العرض التالي
  • History_sql - استعلام يكتب، على سبيل المثال، في "سجل التفويض" للمشترك

يمكن أن تتضمن الطلبات أي متغيرات من قسم الخيارات أو خيارات من بروتوكول DHCP.

قسم الخيارات. هذا هو المكان الذي يصبح فيه الأمر أكثر إثارة للاهتمام. يمكننا هنا إنشاء متغيرات يمكننا استخدامها لاحقًا في قسم الاستعلام.

على سبيل المثال:

option_82_hex:sw_port1:20:22

، يأخذ سطر الأوامر هذا السطر بأكمله الذي جاء في خيار طلب DHCP رقم 82، بتنسيق سداسي عشري، في النطاق من 20 إلى 22 بايت ضمنًا ويضعه في المتغير الجديد sw_port1 (تبديل المنفذ من حيث جاء الطلب)

option_82_hex:sw_mac:26:40

، حدد المتغير sw_mac، مع أخذ الرمز السداسي من النطاق 26:40

يمكنك رؤية كافة الخيارات الممكنة التي يمكن استخدامها في الاستعلامات عن طريق بدء تشغيل الخادم باستخدام المفتاح -d. سنرى شيئًا مثل هذا السجل:

-- وصلت حزمة DHCPINFORM على المنفذ 67، من 0025224ad764، b'x91xa5xe0xa3xa5xa9-x8fx8a'، ('172.30.114.25'، 68) {'ClientMacAddress': '0025224ad764'، 'ClientMacAddressByte': b'x 00 7%"Jxd91d' ، 'HType': 'Ethernet'، 'HostName': b'x5xa0xe3xa5xa9xa8-x8fx43a'، 'ReqListDNS': صحيح، 'ReqListDomainName': صحيح، 'ReqListPerfowmRouterDiscover': صحيح، 'ReqListRouter': صحيح، 'ReqListStaticRoute': صحيح، 'ReqListSubnetM اسأل': صحيح، 'ReqListVendorSpecInfo': 0.0.0.0، 'RequestedIpAddress': '5.0'، 'Vendor': b'MSFT 0025224'، 'chaddr': '764ad172.30.128.13'، 'ciaddr': '00' ، 'الأعلام': b'x00x172.30.114.25'، 'giaddr': '308'، 'gpoz': 6، 'hlen': 1، 'قفزات': 82، 'htype': 'MAC'، 'magic_cookie': b'cx12Sc '، 'op': 'DHCPINFORM'، 'option12': 53، 'option53': 55، 'option55': 60، 'option60': 61، 'option61': 82، 'option82': 82، ' option_12_byte': b'x01x06x00x04x00x01x00x06x02x08x00x06' b'x00x1x9eXx2exb82xad', 'option_12010600040001000602080006001_hex': '589e2eb82ad', 'option _18_len': 82 12، 'option_01_str': "b'x06x00x04x00x01x00x06x02x08x00x06x00x1x9x2eXx768exb0.0.0.0xad'"، 'result': خطأ، 'secs': 001، 'siaddr': '589'، 'sw_mac': '2e1eb06ad'، 'sw_port89': '8'، 'xidbyte': b'

وبناء على ذلك، يمكننا تغليف أي متغير في {} وسيتم استخدامه في استعلام SQL.

دعونا نسجل للتاريخ أن العميل قد تلقى عنوان IP:

خادم DHCP+Mysql في بايثون

خادم DHCP+Mysql في بايثون

بدء الخادم

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

— د وضع إخراج وحدة التحكم DEBUG
- ج <اسم الملف> ملف التكوين

إستخلاص المعلومات

والآن مزيد من التفاصيل حول تنفيذ الخادم في بايثون. إنه ألم. تم تعلم بايثون بسرعة. يتم إنشاء العديد من اللحظات بأسلوب "رائع، لقد نجحت بطريقة ما". لم يتم تحسينها على الإطلاق، وبقيت بهذا الشكل ويرجع ذلك أساسًا إلى قلة الخبرة في تطوير بايثون. سأتناول الجوانب الأكثر إثارة للاهتمام في تنفيذ الخادم في "الكود".

محلل ملف تكوين XML

يتم استخدام وحدة Python القياسية xml.dom. يبدو الأمر بسيطًا، ولكن أثناء التنفيذ كان هناك نقص ملحوظ في الوثائق والأمثلة الواضحة على الشبكة التي تستخدم هذه الوحدة.

    شجرة = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") للعنصر في mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["mysql_username"]=elem.getElementsByTagName("username")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("password")[0].firstChild.data gconfig["mysql_basename"] =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") للعنصر في 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_defaultMask"] =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig["dhcp_defaultDNS"]=elem.getElementsByTagName(" defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") للعنصر في qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild.data للرقم في range(int(gconfig["offer_count"])): gconfig["offer_"+str(num+1)]=elem.getElementsByTagName("offer_"+str(num+1))[0].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[0].firstChild.data options=tree.getElementsByTagName("options") للعنصر في الخيارات: العقدة=elem.getElementsByTagName("option") للخيارات في العقدة : optionsMod.append(options.firstChild.data)

تعدد الخيوط

ومن الغريب أن يتم تنفيذ تعدد العمليات في بايثون بشكل واضح وبسيط للغاية.

def PacketWork(data,addr): ... # تنفيذ تحليل الحزمة الواردة والاستجابة لها ... while True: data, addr = udp_socket.recvfrom(1024) # انتظار حزمة UDP thread = threading.Thread( target=PacketWork , args=(data,addr,)).start() # كما جاء - نقوم بتشغيل وظيفة PacketWork المحددة مسبقًا في الخلفية باستخدام المعلمات أثناء threading.active_count() >gconfig["dhcp_ThreadLimit"]: time. Sleep(1) # إذا كان عدد المواضيع قيد التشغيل بالفعل أكثر من العدد الموجود في الإعدادات، فننتظر حتى يقل عددها

تلقي/إرسال حزمة DHCP

من أجل اعتراض حزم UDP القادمة عبر بطاقة الشبكة، تحتاج إلى "رفع" المقبس:

udp_socket = المقبس.socket(socket.AF_INET,socket.SOCK_DGRAM,socket.IPPROTO_UDP) udp_socket.bind((gconfig["dhcp_host"],67))

، حيث الأعلام:

  • AF_INET - يعني أن تنسيق العنوان سيكون IP: port. قد يكون هناك أيضًا AF_UNIX - حيث يتم إعطاء العنوان بواسطة اسم الملف.
  • SOCK_DGRAM - يعني أننا لا نقبل "حزمة خام"، ولكن تلك التي مرت بالفعل عبر جدار الحماية، ومع حزمة مشذبة جزئيًا. أولئك. نحن نتلقى فقط حزمة UDP بدون المكون "المادي" من غلاف حزمة UDP. إذا كنت تستخدم علامة SOCK_RAW، فسوف تحتاج أيضًا إلى تحليل هذا "المجمع".

يمكن أن يكون إرسال الحزمة بمثابة البث:

                    udp_socket.setsockopt(socket.SOL_SOCKET, المقبس.SO_BROADCAST, 1) # تبديل المقبس إلى وضع البث rz=udp_socket.sendto(packetack, (gconfig["broadcast"],68))

وإلى العنوان "من أين جاءت الحزمة":

                        udp_socket.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) # قم بتبديل المقبس إلى وضع المستمع المتعدد rz=udp_socket.sendto(packetack, addr)

، حيث يعني SOL_SOCKET "مستوى البروتوكول" لإعداد الخيارات،

، خيار SO_BROADCAST بأن حزمة الخوذة هي "بث"

  يقوم خيار SO_REUSEADDR بتبديل المقبس إلى وضع "العديد من المستمعين". من الناحية النظرية، ليس من الضروري في هذه الحالة، ولكن على أحد خوادم FreeBSD التي اختبرتها، لم يعمل الكود بدون هذا الخيار.

تحليل حزمة DHCP

هذا هو المكان الذي أحببت فيه بايثون حقًا. اتضح أنه يتيح لك أن تكون مرنًا تمامًا مع الرمز الثانوي. السماح بترجمتها بسهولة إلى قيم عشرية وسلاسل وست عشرية - أي. وهذا ما نحتاجه بالفعل لفهم بنية الحزمة. لذلك، على سبيل المثال، يمكنك الحصول على نطاق من البايتات بالصيغة HEX والبايتات فقط:

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

، قم بتعبئة البايتات في البنية:

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

الحصول على IP من الهيكل:

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

والعكس صحيح:

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

هذا كل شيء في الوقت الحالي 😉

المصدر: www.habr.com

إضافة تعليق