سرور DHCP+Mysql در پایتون

سرور DHCP+Mysql در پایتون

هدف از این پروژه این بود:

  • آموزش در مورد DHCP در شبکه IPv4
  • یادگیری پایتون (کمی بیشتر از ابتدا 😉)
  • تعویض سرور DB2DHCP (چنگال من)، اصلی اینجا، که مونتاژ آن برای سیستم عامل جدید روز به روز دشوارتر می شود. و من دوست ندارم که این یک باینری است که هیچ راهی برای "در حال حاضر تغییر" وجود ندارد
  • به دست آوردن یک سرور DHCP فعال با قابلیت انتخاب آدرس IP مشترک با استفاده از ترکیب مک مشترک یا سوئیچ مک + پورت (گزینه 82)
  • نوشتن یک دوچرخه دیگر (اوه! این فعالیت مورد علاقه من است)
  • دریافت نظرات در مورد باشگاه دستی شما در Habrahabr (یا بهتر است بگوییم دعوت) 😉

نتیجه: کار می کند 😉 تست شده بر روی FreeBSD و سیستم عامل اوبونتو. از نظر تئوری، می توان از کد درخواست کرد که تحت هر سیستم عاملی کار کند، زیرا به نظر می رسد که هیچ الزام آور خاصی در کد وجود ندارد.
با دقت! چیزهای بیشتری در راه است.

پیوند به مخزن برای آماتورها "لمس زنده".

فرآیند نصب، پیکربندی و استفاده از نتیجه "مطالعه سخت افزار" بسیار پایین تر است و سپس کمی تئوری در مورد پروتکل 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 است که «کلاینت زنده است» و از تنظیمات شبکه صادر شده استفاده می‌کند. در پیاده سازی این سرور، این بسته ها نادیده گرفته می شوند.

قالب بسته

به طور کلی، یک فریم بسته اترنت چیزی شبیه به این است:

سرور DHCP+Mysql در پایتون

در مورد ما، ما فقط داده ها را مستقیماً از محتویات بسته UDP، بدون سرفصل های پروتکل لایه OSI، یعنی ساختار DHCP در نظر می گیریم:

DHCPDISCOVER

بنابراین، فرآیند به دست آوردن آدرس IP برای یک دستگاه با ارسال درخواست پخش از پورت 68 به 255.255.255.255:67 توسط مشتری DHCP آغاز می شود. در این بسته، کلاینت آدرس MAC خود و همچنین آنچه را که دقیقاً می خواهد از سرور DHCP دریافت کند را درج می کند. ساختار بسته در جدول زیر توضیح داده شده است.

جدول ساختار بسته DHCPDISCOVER

موقعیت در بسته بندی
نام ارزش
مثال
مقدمه
بایت
وضوح

1
درخواست بوت
1
سحر و جادو کردن
1
نوع پیام 1 - درخواست از مشتری به سرور، 2 - پاسخ از سرور به مشتری

2
نوع سخت افزار
1
سحر و جادو کردن
1
نوع آدرس سخت افزار، در این پروتکل 1 - MAC

3
طول آدرس های سخت افزاری
6
سحر و جادو کردن
1
طول آدرس MAC دستگاه

4
رازک
1
سحر و جادو کردن
1
تعداد مسیرهای میانی

5
شناسه تراکنش
23:cf:de:1d
سحر و جادو کردن
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
آدرس مک مشتری
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 - DHCPREQUEST
2 - DHCPOFFER
5 - DHCPACK
8 - DHCPINFORM

 
طول گزینه
1
دسامبر
1

 
مقدار گزینه
1
دسامبر
1

 
شماره گزینه
50
دسامبر
1
مشتری می خواهد چه آدرس IP دریافت کند؟

 
طول گزینه
4
دسامبر
1

 
مقدار گزینه
172.16.134.61
خط
4

 
شماره گزینه
55
 
1
پارامترهای شبکه درخواستی مشتری ترکیب ممکن است متفاوت باشد

01 - ماسک شبکه
03 - دروازه
06 - DNS
oc - نام میزبان
0f - نام دامنه شبکه
1c - آدرس درخواست پخش (پخش)
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:cf:de:1d
سحر و جادو کردن
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
آدرس مک مشتری
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:4d:ec
دسامبر
18

 
پایان بسته
255
دسامبر
1
255 نماد پایان بسته است

DHCPREQUEST

پس از اینکه مشتری 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:cf:de:1d
سحر و جادو کردن
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
آدرس مک مشتری
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 را گزارش می کند. شاید دستگاه های دیگر چیز متفاوتی را برگردانند. برای مثال ویندوز MSFT 5.0 را گزارش می دهد

 
طول گزینه
11
دسامبر
 

 
مقدار گزینه
udhcp 0.9.8
خط
 

 
شماره گزینه
55
 
1
پارامترهای شبکه درخواستی مشتری ترکیب ممکن است متفاوت باشد

01 - ماسک شبکه
03 - دروازه
06 - DNS
oc - نام میزبان
0f - نام دامنه شبکه
1c - آدرس درخواست پخش (پخش)
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:4d:ec
دسامبر
18

 
پایان بسته
255
دسامبر
1
255 نماد پایان بسته است

DHCPACK

به عنوان تأیید این موضوع که «بله، درست است، این آدرس IP شما است، و من آن را به هیچ کس دیگری نمی دهم» از سرور DHCP، بسته ای با فرمت DHCPACK از سرور به مشتری ارائه می شود. مانند سایر بسته ها پخش می شود. اگرچه، در کد زیر برای یک سرور DHCP پیاده‌سازی شده در پایتون، در هر صورت، من هر درخواست پخشی را با ارسال یک بسته به یک 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:cf:de:1d
سحر و جادو کردن
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
آدرس مک مشتری
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:4d:ec
دسامبر
18

 
پایان بسته
255
دسامبر
1
255 نماد پایان بسته است

نصب

نصب در واقع شامل نصب ماژول های پایتون لازم برای کار است. فرض بر این است که MySQL قبلاً نصب و پیکربندی شده است.

FreeBSD

pkg نصب python3 python3 -m surepip pip3 نصب کانکتور mysql

اوبونتو

sudo apt-get نصب python3 sudo apt-get نصب pip3 sudo pip3 نصب کانکتور mysql

ما یک پایگاه داده MySQL ایجاد می کنیم، Dump 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، روتر، dns را از کاربران انتخاب کنید که در آنها upper(mac)=upper('{sw_mac}') و upper(port)=upper('{sw_port82}') ip، mask، روتر، dns را از کاربران انتخاب کنید که در آن upper(mac)=upper('{ClientMacAddress}') مقادیر (id,dt,mac,ip,comment) را در تاریخچه وارد کنید (null,now(,'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

اکنون با جزئیات بیشتر در مورد برچسب ها:

بخش dhcpserver تنظیمات اولیه برای راه اندازی سرور را شرح می دهد، یعنی:

  • میزبان - چه آدرس IP سرور در پورت 67 به آن گوش می دهد
  • پخش - کدام آی پی پخش DHCPOFFER و DHCPACK است
  • DHCPServer - آی پی سرور DHCP چیست
  • LeaseTime زمان اجاره آدرس IP صادر شده
  • ThreadLimit - چند رشته به طور همزمان برای پردازش بسته های UDP ورودی در پورت 67 در حال اجرا هستند. قرار است به پروژه های پر بار کمک کند.
  • defaultMask,defaultRouter,defaultDNS - اگر IP در پایگاه داده یافت شود، اما پارامترهای اضافی برای آن مشخص نشده باشد به طور پیش فرض به مشترک ارائه می شود.

بخش mysql:

میزبان، نام کاربری، رمز عبور، نام پایه - همه چیز برای خود صحبت می کند. یک ساختار تقریبی پایگاه داده در پست شده است GitHub

بخش پرس و جو: درخواست های دریافت OFFER/ACK در اینجا شرح داده شده است:

  • offer_count - تعداد خطوط با درخواست هایی که نتیجه ای مانند ip، mask، روتر، dns را برمی گرداند.
  • offer_n - رشته پرس و جو. اگر بازگشت خالی باشد، درخواست پیشنهاد زیر را اجرا می کند
  • history_sql - پرس و جوی که برای یک مشترک، به عنوان مثال، در "تاریخچه مجوز" می نویسد.

درخواست ها می توانند شامل هر متغیری از بخش گزینه ها یا گزینه هایی از پروتکل DHCP باشند.

بخش گزینه ها اینجاست که جالب تر می شود. در اینجا می توانیم متغیرهایی ایجاد کنیم که بعداً در قسمت query از آنها استفاده کنیم.

به عنوان مثال:

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 می‌توانید تمام گزینه‌های ممکنی را که می‌توان در کوئری‌ها استفاده کرد، مشاهده کرد. چیزی شبیه به این log را خواهیم دید:

--یک بسته DHCPINFORM به درگاه 67 رسید، از 0025224ad764 , b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress': '0025224ClientMacAddress', '764y00Maddress', '7y91', '5yMacAddress', '0ClientMacAddress', '3y5' 9 8%"Jxd8d" , 'HType': 'Ethernet'، 'HostName': b'x43xa0.0.0.0xe5.0xa0025224xa764xa172.30.128.13-x00fx00a'، 'ReqListDNS': True، 'ReqListDomainName': True، 'ReqListPerfowmRouterDiscover':ReqLuteS, TrueRute' درسته، 'ReqListSubnetM ask': True، 'ReqListVendorSpecInfo': 172.30.114.25، 'RequestedIpAddress': '308'، 'Vendor': b'MSFT 6'، 'chaddr': '1ad82'، '12': '12': '53' , 'پرچم ها': b'x53x55'، 'giaddr': '55'، 'gpoz': 60، 'hlen': 60، 'hops': 61، 'htype': 'MAC'، 'magic_cookie': b'cx61Sc '، 'op': 'DHCPINFORM'، 'option82': 82، 'option82': 12، 'option01': 06، 'option00': 04، 'option00': 01، 'option00': 06، ' option_02_byte': b'x08x00x06x00x1x9x2x82x12010600040001000602080006001x589x2x82' b'x18x82x12eXx01exb06xad'، 'option_00_hex': '04 _00_len': 01 00، 'option_06_str': "b'x02x08x00x06x00x1x9x2x768x0.0.0.0x001x589x2x1x06eXx89exb8xad"، 'نتیجه': نادرست، 'secs': 3 'siaddr': '897'، 'sw_mac': '8e0.0.0.0ebXNUMXad'، 'sw_portXNUMX': 'XNUMX'، 'xidbyte': b'

بر این اساس، ما می‌توانیم هر متغیری را در {} قرار دهیم و در پرس و جوی SQL استفاده می‌شود.

اجازه دهید تاریخچه ای را ثبت کنیم که مشتری آدرس IP را دریافت کرده است:

سرور DHCP+Mysql در پایتون

سرور DHCP+Mysql در پایتون

شروع سرور

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

- حالت خروجی کنسول DEBUG
- c <filename> فایل پیکربندی

رفع اشکال

و اکنون جزئیات بیشتر در مورد پیاده سازی سرور در پایتون. درد است. پایتون در پرواز یاد گرفت. بسیاری از لحظات به سبک "وای، به نحوی من آن را به کار انداختم" ساخته شده است. به هیچ وجه بهینه نشده است و عمدتاً به دلیل تجربه کمی در توسعه پایتون به این شکل باقی مانده است. من در مورد جالب ترین جنبه های اجرای سرور در "کد" صحبت خواهم کرد.

تجزیه کننده فایل پیکربندی XML

ماژول استاندارد پایتون xml.dom استفاده می شود. ساده به نظر می رسد، اما در حین اجرا کمبود قابل توجهی از اسناد و نمونه های واضح در شبکه با استفاده از این ماژول وجود داشت.

    tree = minidom.parse(gconfig["config_file"]) mconfig=tree.getElementsByTagName("mysql") برای عنصر در mconfig: gconfig["mysql_host"]=elem.getElementsByTagName("host")[0].datast gconfig["mysql_username"]=elem.getElementsByTagName("username")[0].firstChild.data gconfig["mysql_password"]=elem.getElementsByTagName("password")[0].firstqconfigemy." =elem.getElementsByTagName("basename")[0].firstChild.data dconfig=tree.getElementsByTagName("dhcpserver") برای عنصر در dconfig: gconfig["broadcast"]=elem.getElementsByTag.)"(" firstChild.data gconfig["dhcp_host"]=elem.getElementsByTagName("host")[0].firstChild.data gconfig["dhcp_LeaseTime"]=elem.getElementsByTagName("LeaseTime")[0]config[0]. dhcp_ThreadLimit"]=int(elem.getElementsByTagName("ThreadLimit")[0].firstChild.data) gconfig["dhcp_Server"]=elem.getElementsByTagName("DHCPServer")[0]configd.fault. =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data gconfig[element.NSaGet " defaultDNS")[0].firstChild.data qconfig=tree.getElementsByTagName("query") برای elem در qconfig: gconfig["offer_count"]=elem.getElementsByTagName("offer_count")[0].firstChild in.data برای num 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") برای عنصر در گزینه‌ها: node=elem.getElementsByTagName") در گزینه‌ها : optionsMod.append(options.firstChild.data)

چند رشته ای

به اندازه کافی عجیب، multithreading در پایتون بسیار واضح و ساده پیاده سازی می شود.

def PacketWork(data,addr): ... # پیاده سازی تجزیه بسته ورودی و پاسخ به آن ... در حالی که True: data, addr = udp_socket.recvfrom(1024) # در انتظار رشته بسته UDP = threading.Thread( target=PacketWork, args=(data,addr,)).start() # همانطور که آمد - تابع PacketWork که قبلاً تعریف شده بود را با پارامترها در پس‌زمینه اجرا می‌کنیم در حالی که threading.active_count() >gconfig["dhcp_ThreadLimit"]: زمان. sleep(1) # اگر تعداد Thread های بیشتری نسبت به تنظیمات در حال اجرا هستند، صبر می کنیم تا تعداد آنها کمتر شود.

دریافت/ارسال بسته DHCP

برای رهگیری بسته های UDP که از طریق کارت شبکه می آیند، باید سوکت را "بالا" کنید:

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

، جایی که پرچم ها عبارتند از:

  • AF_INET - به این معنی است که فرمت آدرس IP: پورت خواهد بود. همچنین ممکن است AF_UNIX وجود داشته باشد - جایی که آدرس با نام فایل داده می شود.
  • SOCK_DGRAM - به این معنی است که ما یک "بسته خام" را نمی پذیریم، بلکه بسته ای را نمی پذیریم که قبلاً از فایروال عبور کرده باشد و بسته ای جزئی بریده شده باشد. آن ها ما فقط یک بسته UDP بدون مولفه "فیزیکی" بسته بندی بسته UDP دریافت می کنیم. اگر از پرچم SOCK_RAW استفاده می‌کنید، باید این "wrapper" را نیز تجزیه کنید.

ارسال یک بسته می تواند مانند یک پخش باشد:

                    udp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, 1) #سوکت را به حالت ارسال پخش تبدیل کنید rz=udp_socket.sendto(packetack, (gconfig["پخش"],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

اضافه کردن نظر