Python میں DHCP+Mysql سرور

Python میں DHCP+Mysql سرور

اس منصوبے کا مقصد یہ تھا:

  • IPv4 نیٹ ورک پر DHCP کے بارے میں سیکھنا
  • Python سیکھنا (شروع سے تھوڑا زیادہ 😉)
  • سرور کی تبدیلی DB2DHCP (میرا کانٹا)، اصل یہاں، جو نئے OS کے لیے جمع کرنا مشکل تر ہوتا جا رہا ہے۔ اور مجھے یہ پسند نہیں ہے کہ یہ ایک بائنری ہے جسے "ابھی تبدیل کرنے" کا کوئی طریقہ نہیں ہے۔
  • سبسکرائبر کے میک کا استعمال کرتے ہوئے سبسکرائبر کا آئی پی ایڈریس منتخب کرنے کی صلاحیت کے ساتھ ورکنگ ڈی ایچ سی پی سرور حاصل کرنا یا میک + پورٹ کا مجموعہ سوئچ کرنا (آپشن 82)
  • ایک اور موٹر سائیکل لکھنا (اوہ! یہ میری پسندیدہ سرگرمی ہے)
  • ہبراہبر پر آپ کے کلب کے بارے میں تبصرے وصول کرنا (یا اس سے بھی بہتر، ایک دعوت) 😉

نتیجہ: یہ کام کرتا ہے 😉 FreeBSD اور Ubuntu OS پر تجربہ کیا گیا۔ نظریاتی طور پر، کوڈ کو کسی بھی OS کے تحت کام کرنے کے لیے کہا جا سکتا ہے، کیونکہ ایسا لگتا ہے کہ کوڈ میں کوئی خاص پابندیاں نہیں ہیں۔
احتیاط سے! ابھی بہت کچھ آنا باقی ہے۔

شوقیہ افراد کے لیے مخزن کا لنک "زندہ چھو".

"ہارڈ ویئر کا مطالعہ کرنے" کے نتیجے کو انسٹال کرنے، ترتیب دینے اور استعمال کرنے کا عمل بہت کم ہے، اور پھر DHCP پروٹوکول کے بارے میں تھوڑا سا نظریہ۔ میرے لیے. اور تاریخ کے لیے 😉

ایک چھوٹا سا نظریہ

DHCP کیا ہے؟

یہ ایک نیٹ ورک پروٹوکول ہے جو ایک ڈیوائس کو DHCP سرور سے اس کا IP ایڈریس (اور دوسرے پیرامیٹرز جیسے گیٹ وے، DNS وغیرہ) کو تلاش کرنے کی اجازت دیتا ہے۔ UDP پروٹوکول کا استعمال کرتے ہوئے پیکٹس کا تبادلہ کیا جاتا ہے۔ نیٹ ورک کے پیرامیٹرز کی درخواست کرتے وقت ڈیوائس کے آپریشن کا عمومی اصول حسب ذیل ہے:

  1. ڈیوائس (کلائنٹ) پورے نیٹ ورک پر ایک UDP براڈکاسٹ ریکوسٹ (DHCPDISCOVER) اس درخواست کے ساتھ بھیجتا ہے "اچھا، کوئی مجھے IP ایڈریس دے"۔ مزید یہ کہ، عام طور پر (لیکن ہمیشہ نہیں) درخواست پورٹ 68 (ذریعہ) سے ہوتی ہے، اور منزل پورٹ 67 (منزل) ہوتی ہے۔ کچھ آلات پورٹ 67 سے پیکٹ بھی بھیجتے ہیں۔ کلائنٹ ڈیوائس کا MAC ایڈریس DHCPDISCOVER پیکٹ کے اندر شامل ہے۔
  2. نیٹ ورک پر موجود تمام DHCP سرورز (اور ان میں سے کئی ہو سکتے ہیں) DHCPDISCOVER بھیجنے والے ڈیوائس کے لیے نیٹ ورک سیٹنگز کے ساتھ DHCPOFFER پیشکش بناتے ہیں، اور اسے نیٹ ورک پر نشر بھی کرتے ہیں۔ یہ پیکٹ کس کے لیے ہے اس کی شناخت کلائنٹ کے میک ایڈریس پر مبنی ہے جو پہلے DHCPDISCOVER درخواست میں فراہم کیا گیا تھا۔
  3. کلائنٹ نیٹ ورک کی ترتیبات کے لیے تجاویز کے ساتھ پیکٹوں کو قبول کرتا ہے، سب سے زیادہ پرکشش کو منتخب کرتا ہے (معیار مختلف ہو سکتا ہے، مثال کے طور پر، پیکٹ کی ترسیل کا وقت، درمیانی راستوں کی تعداد)، اور نیٹ ورک کی ترتیبات کے ساتھ "سرکاری درخواست" DHCPREQUEST کرتا ہے۔ DHCP سرور سے جو اسے پسند ہے۔ اس صورت میں، پیکٹ ایک مخصوص DHCP سرور پر جاتا ہے۔
  4. DHCPREQUEST حاصل کرنے والا سرور DHCPACK فارمیٹ پیکٹ بھیجتا ہے، جس میں یہ ایک بار پھر اس کلائنٹ کے لیے نیٹ ورک کی ترتیبات کی فہرست دیتا ہے۔

Python میں DHCP+Mysql سرور

اس کے علاوہ، DHCPINFORM پیکٹ ہیں جو کلائنٹ کی طرف سے آتے ہیں، اور جن کا مقصد DHCP سرور کو مطلع کرنا ہے کہ "کلائنٹ زندہ ہے" اور جاری کردہ نیٹ ورک کی ترتیبات استعمال کر رہا ہے۔ اس سرور کے نفاذ میں، ان پیکٹوں کو نظر انداز کر دیا جاتا ہے۔

پیکیج کی شکل

عام طور پر، ایک ایتھرنیٹ پیکٹ فریم کچھ اس طرح نظر آتا ہے:

Python میں DHCP+Mysql سرور

ہمارے معاملے میں، ہم صرف UDP پیکٹ کے مواد سے براہ راست ڈیٹا پر غور کریں گے، بغیر OSI لیئر پروٹوکول ہیڈر، یعنی DHCP ڈھانچہ:

DHCPDISCOVER

لہذا، ایک ڈیوائس کے لیے IP ایڈریس حاصل کرنے کا عمل DHCP کلائنٹ کی جانب سے پورٹ 68 سے 255.255.255.255:67 پر براڈکاسٹ کی درخواست بھیجنے سے شروع ہوتا ہے۔ اس پیکج میں، کلائنٹ اپنا MAC ایڈریس بھی شامل کرتا ہے، ساتھ ہی وہ DHCP سرور سے بالکل کیا وصول کرنا چاہتا ہے۔ پیکیج کا ڈھانچہ نیچے دیے گئے جدول میں بیان کیا گیا ہے۔

DHCPDISCOVER پیکٹ کی ساخت کی میز

پیکیج میں پوزیشن
قدر کا نام
مثال کے طور پر
تعارف
بائٹ
وضاحت

1
بوٹ کی درخواست
1
ہیکس
1
پیغام کی قسم۔ 1 - کلائنٹ سے سرور کی درخواست، 2 - سرور سے کلائنٹ کو جواب

2
ہارڈ ویئر کی قسم
1
ہیکس
1
ہارڈ ویئر ایڈریس کی قسم، اس پروٹوکول میں 1 - MAC

3
ہارڈ ویئر کے پتوں کی لمبائی
6
ہیکس
1
ڈیوائس کے میک ایڈریس کی لمبائی

4
Hops
1
ہیکس
1
درمیانی راستوں کی تعداد

5
ٹرانزیکشن ID
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
پیکٹ بھیجنے والے کا میک ایڈریس (کلائنٹ)

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 - ڈی ایچ سی پیک
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، جو ریپیٹر ڈیوائس کے میک ایڈریس اور کچھ اضافی اقدار کو منتقل کرتا ہے۔

اکثر، یہ سوئچ کا وہ پورٹ ہوتا ہے جس پر اینڈ ڈی ایچ سی پی کلائنٹ چلتا ہے۔ یہ آپشن اضافی پیرامیٹرز پر مشتمل ہوتا ہے۔ پہلا بائٹ "سب آپشن" کا نمبر ہوتا ہے، دوسرا اس کی لمبائی، پھر اس کی قدر۔

اس صورت میں، آپشن 82 میں، ذیلی اختیارات نیسٹڈ ہیں:
ایجنٹ سرکٹ ID = 00:04:00:01:00:04، جہاں آخری دو بائٹس DHCP کلائنٹ پورٹ ہیں جہاں سے درخواست آئی تھی۔

ایجنٹ ریموٹ ID = 00:06:c8:be:19:93:11:48 - DHCP ریپیٹر ڈیوائس کا MAC پتہ

 
اختیاری لمبائی
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 ایڈریس نہیں ہے، اس لیے وہ پیکٹ کو تب ہی قبول کر سکتا ہے جب اسے براڈکاسٹ کے ذریعے بھیجا گیا ہو۔ کلائنٹ تسلیم کرتا ہے کہ یہ اس کے لیے پیکیج کے اندر موجود اس کے میک ایڈریس کے ساتھ ساتھ وہ ٹرانزیکشن نمبر ہے جو وہ پہلا پیکج بننے کے وقت تیار کرتا ہے۔

DHCPOFFER پیکٹ کی ساخت کی میز

پیکیج میں پوزیشن
قدر کا نام (عام)
مثال کے طور پر
تعارف
بائٹ
وضاحت

1
بوٹ کی درخواست
1
ہیکس
1
پیغام کی قسم۔ 1 - کلائنٹ سے سرور کی درخواست، 2 - سرور سے کلائنٹ کو جواب

2
ہارڈ ویئر کی قسم
1
ہیکس
1
ہارڈ ویئر ایڈریس کی قسم، اس پروٹوکول میں 1 - MAC

3
ہارڈ ویئر کے پتوں کی لمبائی
6
ہیکس
1
ڈیوائس کے میک ایڈریس کی لمبائی

4
Hops
1
ہیکس
1
درمیانی راستوں کی تعداد

5
ٹرانزیکشن ID
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
پیکٹ بھیجنے والے کا میک ایڈریس (کلائنٹ)

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
ڈی ایچ سی پی کلائنٹ کو ڈیفالٹ گیٹ وے پیش کرنے کا اختیار

 
اختیاری لمبائی
4
دسمبر
1

 
اختیاری قدر
172.16.12.1
سٹرنگ
4

 
آپشن نمبر
6
دسمبر
1
DNS کلائنٹ کو DHCP پیش کرنے کا اختیار

 
اختیاری لمبائی
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 کے نفاذ پر منحصر ہے۔ درخواست کے وصول کنندہ کی وضاحت DHCP سرور کے MAC ایڈریس کے ذریعے کی گئی ہے۔ نیز، ایک DHCPREQUEST پیکٹ کلائنٹ کے ذریعے پہلے DHCPDISCOVER بنائے بغیر بھیجا جا سکتا ہے، اگر سرور کا IP ایڈریس پہلے ہی حاصل کر لیا گیا ہو۔

DHCPREQUEST پیکٹ سٹرکچر ٹیبل

پیکیج میں پوزیشن
قدر کا نام (عام)
مثال کے طور پر
تعارف
بائٹ
وضاحت

1
بوٹ کی درخواست
1
ہیکس
1
پیغام کی قسم۔ 1 - کلائنٹ سے سرور کی درخواست، 2 - سرور سے کلائنٹ کو جواب

2
ہارڈ ویئر کی قسم
1
ہیکس
1
ہارڈ ویئر ایڈریس کی قسم، اس پروٹوکول میں 1 - MAC

3
ہارڈ ویئر کے پتوں کی لمبائی
6
ہیکس
1
ڈیوائس کے میک ایڈریس کی لمبائی

4
Hops
1
ہیکس
1
درمیانی راستوں کی تعداد

5
ٹرانزیکشن ID
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
پیکٹ بھیجنے والے کا میک ایڈریس (کلائنٹ)

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
کلائنٹ ID: 01 (ایہرنیٹ کے لیے) + کلائنٹ میک ایڈریس

 
اختیاری لمبائی
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 پیکٹ کے اختتام کی علامت ہے۔

ڈی ایچ سی پیک

تصدیق کے طور پر کہ "ہاں، یہ ٹھیک ہے، یہ آپ کا IP پتہ ہے، اور میں اسے کسی اور کو نہیں دوں گا" DHCP سرور سے، DHCPACK فارمیٹ میں ایک پیکٹ سرور سے کلائنٹ کو پیش کرتا ہے۔ اسے دوسرے پیکٹوں کی طرح براڈکاسٹ بھیجا جاتا ہے۔ اگرچہ، Python میں لاگو DHCP سرور کے لیے نیچے کوڈ میں، صرف اس صورت میں، میں کسی بھی براڈکاسٹ کی درخواست کو کسی مخصوص کلائنٹ IP کو پیکٹ بھیج کر نقل کرتا ہوں، اگر یہ پہلے سے معلوم ہو۔ مزید یہ کہ، DHCP سرور کو اس بات کی بالکل بھی پرواہ نہیں ہے کہ آیا DHCPACK پیکٹ کلائنٹ تک پہنچ گیا ہے۔ اگر کلائنٹ کو DHCPACK موصول نہیں ہوتا ہے، تو تھوڑی دیر بعد یہ صرف DHCPREQUEST کو دہراتا ہے۔

DHCPACK پیکٹ کی ساخت کی میز

پیکیج میں پوزیشن
قدر کا نام (عام)
مثال کے طور پر
تعارف
بائٹ
وضاحت

1
بوٹ کی درخواست
2
ہیکس
1
پیغام کی قسم۔ 1 - کلائنٹ سے سرور کی درخواست، 2 - سرور سے کلائنٹ کو جواب

2
ہارڈ ویئر کی قسم
1
ہیکس
1
ہارڈ ویئر ایڈریس کی قسم، اس پروٹوکول میں 1 - MAC

3
ہارڈ ویئر کے پتوں کی لمبائی
6
ہیکس
1
ڈیوائس کے میک ایڈریس کی لمبائی

4
Hops
1
ہیکس
1
درمیانی راستوں کی تعداد

5
ٹرانزیکشن ID
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
پیکٹ بھیجنے والے کا میک ایڈریس (کلائنٹ)

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
ڈی ایچ سی پی کلائنٹ کو ڈیفالٹ گیٹ وے پیش کرنے کا اختیار

 
اختیاری لمبائی
4
دسمبر
1

 
اختیاری قدر
172.16.12.1
سٹرنگ
4

 
آپشن نمبر
6
دسمبر
1
DNS کلائنٹ کو DHCP پیش کرنے کا اختیار

 
اختیاری لمبائی
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 یقینی بنائیں pip pip3 mysql-connector انسٹال کریں

اوبنٹو

sudo apt-get install python3 sudo apt-get install pip3 sudo pip3 install mysql-connector

ہم ایک 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 لوکل ہوسٹ پرکھ پرکھ پی ڈی ایچ سی پی option_8.8.8.8_hex:sw_port82:1:20 آپشن_22_ہیکس:sw_port82:2:16 آپشن_18_ہیکس: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}') جہاں upper(mac)=upper('{ClientMacAddress}') صارفین سے ip,mask,router,dns منتخب کریں تاریخ میں داخل کریں (id,dt,mac,ip,comment) اقدار (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

اب ٹیگز پر مزید تفصیل سے:

dhcpserver سیکشن سرور کو شروع کرنے کے لیے بنیادی ترتیبات کی وضاحت کرتا ہے، یعنی:

  • میزبان - پورٹ 67 پر سرور کون سا IP ایڈریس سنتا ہے۔
  • براڈکاسٹ - کون سا ip DHCPOFFER اور DHCPACK کے لیے براڈکاسٹ ہے۔
  • DHCPServer - DHCP سرور کا آئی پی کیا ہے۔
  • جاری کردہ آئی پی ایڈریس کا لیز ٹائم لیز ٹائم
  • ThreadLimit - پورٹ 67 پر آنے والے UDP پیکٹس پر کارروائی کرنے کے لیے بیک وقت کتنے تھریڈز چل رہے ہیں۔ یہ سمجھا جاتا ہے کہ یہ زیادہ بوجھ والے پروجیکٹس میں مدد کرے گا 😉
  • ڈیفالٹ ماسک، ڈیفالٹ روٹر، ڈیفالٹ ڈی این ایس - اگر ڈیٹا بیس میں آئی پی پایا جاتا ہے تو سبسکرائبر کو بطور ڈیفالٹ کیا پیش کیا جاتا ہے، لیکن اس کے لیے اضافی پیرامیٹرز متعین نہیں کیے گئے ہیں۔

mysql سیکشن:

میزبان، صارف نام، پاس ورڈ، بیس نام - سب کچھ خود بولتا ہے۔ ایک تخمینی ڈیٹا بیس ڈھانچہ پر پوسٹ کیا گیا ہے۔ GitHub کے

سوال کا سیکشن: پیشکش/ACK وصول کرنے کی درخواستیں یہاں بیان کی گئی ہیں:

  • 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 سوئچ کے ساتھ شروع کرکے سوالات میں استعمال کیے جاسکتے ہیں۔ ہم اس لاگ کی طرح کچھ دیکھیں گے:

--a DHCPINFORM پیکٹ پورٹ 67 پر پہنچا، 0025224ad764 سے، b'x91xa5xe0xa3xa5xa9-x8fx8a' , ('172.30.114.25', 68) {'ClientMacAddress',C0025224dAdress':764Mc'Ad00 yte': b'x7 91%"Jxd5d' , 'HType': 'ایتھرنیٹ', 'میزبان کا نام': b'x0xa3xe5xa9xa8xa8-x43fx0.0.0.0a', 'ReqListDNS': True, 'ReqListDomainName': True, 'ReqListPerfowmRouterDiscover': TruqistRouter', TruqistRouter': e': سچ، 'ReqListSubnetM ask': True, 'ReqListVendorSpecInfo': 5.0, 'RequestedIpAddress': '0025224', 'Vendor': b'MSFT 764', 'chaddr': '172.30.128.13ad00', 'ciaddr': '00. , 'flags': b'x172.30.114.25x308', 'giaddr': '6', 'gpoz': 1, 'hlen': 82, 'hops': 12, 'htype': 'MAC', 'magic_cookie': b'cx12Sc ', 'op': 'DHCPINFORM', 'option53': 53, 'option55': 55, 'option60': 60, 'option61': 61, 'option82': 82, 'option82': 12, ' option_01_byte': b'x06x00x04x00x01x00x06x02x08x00x06x00' b'x1x9x2eXx82exb12010600040001000602080006001xad', 'option_589_hex': '2 _82_len': 18 82, 'option_12_str': "b'x01x06x00x04x00x01x00x06x02x08x00x06x00x1x9eXx2exb768xad'", 'نتائج': غلط، 'سیکنڈ': 0.0.0.0 'siaddr': '001', 'sw_mac': '589e2eb1ad', 'sw_port06': '89', 'xidbyte': b'

اس کے مطابق، ہم کسی بھی متغیر کو {} میں لپیٹ سکتے ہیں اور اسے SQL استفسار میں استعمال کیا جائے گا۔

آئیے ہم تاریخ کے لیے ریکارڈ کریں کہ کلائنٹ کو آئی پی ایڈریس موصول ہوا:

Python میں DHCP+Mysql سرور

Python میں DHCP+Mysql سرور

سرور شروع

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

- ڈی کنسول آؤٹ پٹ موڈ ڈیبگ
- c <filename> کنفیگریشن فائل

ڈیبریٹنگ

اور اب ازگر میں سرور کو نافذ کرنے کے بارے میں مزید تفصیلات۔ یہ ایک درد ہے۔ ازگر کو اڑتے ہوئے سیکھا گیا۔ بہت سے لمحات "واہ، کسی طرح میں نے کام کر دیا" کے انداز میں بنائے جاتے ہیں۔ بالکل بھی بہتر نہیں ہے، اور بنیادی طور پر ازگر کی ترقی میں بہت کم تجربے کی وجہ سے اس شکل میں چھوڑ دیا گیا ہے۔ میں "کوڈ" میں سرور کے نفاذ کے سب سے دلچسپ پہلوؤں پر غور کروں گا۔

XML کنفیگریشن فائل پارسر

معیاری Python ماڈیول xml.dom استعمال کیا جاتا ہے۔ یہ آسان لگتا ہے، لیکن نفاذ کے دوران اس ماڈیول کا استعمال کرتے ہوئے نیٹ ورک پر واضح دستاویزات اور مثالوں کی نمایاں کمی تھی۔

    tree = 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("پاس ورڈ")[0].firstChild"config_basedaname] =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.config[0]. dhcp_ThreadLimit"]=int(elem.getElementsByTagName("ThreadLimit")[0].firstChild.data) gconfig["dhcp_Server"]=elem.getElementsByTagName("DHCPServer")[0]. =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data"gconfig_defaultRouter") " defaultDNS"). رینج(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("options") اختیارات میں عنصر کے لیے: node=elem.getElementsByTagName("اختیارات میں نہیں") : optionsMod.append(options.firstChild.data)

ملٹی تھریڈنگ

عجیب بات یہ ہے کہ ازگر میں ملٹی تھریڈنگ کو بہت واضح اور آسانی سے نافذ کیا گیا ہے۔

def PacketWork(data,addr) target=PacketWork , args=(data,addr,)).start() # جیسا کہ آیا ہے - ہم threading.active_count() >gconfig["dhcp_ThreadLimit"]: time sleep(1024) # اگر نمبر سیٹنگز کے مقابلے میں پہلے سے زیادہ تھریڈز چل رہے ہیں تو ہم ان میں سے کم ہونے تک انتظار کرتے ہیں

DHCP پیکٹ وصول/بھیجیں۔

نیٹ ورک کارڈ کے ذریعے آنے والے UDP پیکٹ کو روکنے کے لیے، آپ کو ساکٹ کو "اٹھانا" ہوگا:

udp_socket = ساکٹ ساکٹ

، جھنڈے کہاں ہیں:

  • AF_INET - کا مطلب ہے کہ ایڈریس فارمیٹ IP: پورٹ ہوگا۔ AF_UNIX بھی ہو سکتا ہے - جہاں پتہ فائل کے نام سے دیا گیا ہے۔
  • SOCK_DGRAM - کا مطلب ہے کہ ہم "کچا پیکٹ" کو قبول نہیں کرتے ہیں، لیکن وہ جو پہلے ہی فائر وال سے گزر چکا ہے، اور جزوی طور پر تراشے ہوئے پیکٹ کے ساتھ۔ وہ. ہمیں UDP پیکٹ ریپر کے "فزیکل" جزو کے بغیر صرف ایک UDP پیکٹ ملتا ہے۔ اگر آپ SOCK_RAW پرچم استعمال کرتے ہیں، تو آپ کو اس "ریپر" کو پارس کرنے کی بھی ضرورت ہوگی۔

ایک پیکٹ بھیجنا براڈکاسٹ کی طرح ہو سکتا ہے:

                    udp_socket.setsockopt(socket.SOL_SOCKET, 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 آپشن ساکٹ کو "بہت سے سننے والوں" موڈ میں بدل دیتا ہے۔ نظریہ میں، اس معاملے میں یہ غیر ضروری ہے، لیکن فری بی ایس ڈی سرورز میں سے ایک پر جس پر میں نے تجربہ کیا، کوڈ اس اختیار کے بغیر کام نہیں کرتا تھا۔

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

نیا تبصرہ شامل کریں