Python ۾ DHCP + Mysql سرور

Python ۾ DHCP + Mysql سرور

هن منصوبي جو مقصد هو:

  • IPv4 نيٽ ورڪ تي DHCP بابت سکيا
  • سکيا پائٿون (شروع کان ٿورو وڌيڪ 😉)
  • سرور جي بدلي DB2DHCP (منهنجو ڪانٽو)، اصل هتي، جيڪو نئين او ايس لاءِ گڏ ڪرڻ وڌيڪ ۽ وڌيڪ مشڪل ٿي رهيو آهي. ۽ مان اهو پسند نٿو ڪريان ته اهو هڪ بائنري آهي ته "في الحال تبديل ڪرڻ" جو ڪو طريقو ناهي.
  • ڪم ڪندڙ DHCP سرور حاصل ڪرڻ جي صلاحيت سان گڏ رڪنيت حاصل ڪرڻ واري جي IP پتي کي چونڊڻ جي صلاحيت استعمال ڪندي سبسڪرائبر جي ميڪ يا سوئچ ميڪ + پورٽ ميلاپ (آپشن 82)
  • ٻي سائيڪل لکڻ (او! هي منهنجي پسنديده سرگرمي آهي)
  • Habrahabr تي توهان جي ڪلب جي حوالي سان تبصرا حاصل ڪرڻ (يا اڃا بهتر، هڪ دعوت) 😉

نتيجو: اهو ڪم ڪري ٿو 😉 آزمائشي FreeBSD ۽ Ubuntu OS تي. نظرياتي طور، ڪوڊ ڪنهن به او ايس تحت ڪم ڪرڻ لاء چيو وڃي ٿو، ڇاڪاڻ ته ڪوڊ ۾ ڪو خاص پابند نه لڳي.
هوشياري سان! اڃا به گهڻو ڪجهه اچڻو آهي.

شوقين لاءِ مخزن سان ڳنڍيو "زندہ ٽچ".

انسٽال ڪرڻ، ترتيب ڏيڻ ۽ استعمال ڪرڻ جو عمل "هارڊويئر جي مطالعي" جي نتيجي ۾ تمام گهٽ آهي، ۽ پوء DHCP پروٽوڪول بابت ٿورو نظريو. پنهنجي لاءِ. ۽ تاريخ لاءِ 😉

هڪ ننڍڙو نظريو

DHCP ڇا آهي؟

هي هڪ نيٽ ورڪ پروٽوڪول آهي جيڪو هڪ ڊوائيس کي ان جي IP پتي کي ڳولڻ جي اجازت ڏئي ٿو (۽ ٻيا پيٽرولر جهڙوڪ گيٽ وي، DNS، وغيره) DHCP سرور کان. UDP پروٽوڪول استعمال ڪندي پيڪيٽ مٽائي رهيا آهن. ڊوائيس جي آپريشن جو عام اصول جڏهن نيٽ ورڪ پيٽرولر جي درخواست ڪئي وئي آهي هن ريت آهي:

  1. ڊيوائس (ڪلائنٽ) سڄي نيٽ ورڪ ۾ يو ڊي پي براڊڪاسٽ ريڪوسٽمينٽ (DHCPDISCOVER) موڪلي ٿو ان درخواست سان ”چڱو، ڪو مون کي IP پتو ڏيو. ان کان علاوه، عام طور تي (پر هميشه نه) درخواست پورٽ 68 (ذريعو) کان ٿيندي آهي، ۽ منزل آهي بندرگاهه 67 (منزل). ڪجهه ڊوائيس پڻ بندرگاهن 67 کان پيڪيٽ موڪليندا آهن. ڪلائنٽ ڊيوائس جو MAC پتو DHCPDISCOVER پيڪٽ اندر شامل ڪيو ويو آهي.
  2. نيٽ ورڪ تي موجود سڀ DHCP سرورز (۽ انهن مان ڪيترائي ٿي سگهن ٿا) هڪ DHCPOFFER آڇ ٺاهيندا آهن نيٽ ورڪ سيٽنگن سان گڏ ڊيوائس لاءِ جنهن DHCPDISCOVER موڪليو، ۽ ان کي نيٽ ورڪ تي پڻ نشر ڪيو. جنهن جي سڃاڻپ هن پيڪٽ لاءِ آهي ان تي ٻڌل آهي ڪلائنٽ جي MAC ايڊريس تي جيڪا اڳ ۾ DHCPDISCOVER درخواست ۾ مهيا ڪئي وئي آهي.
  3. ڪلائنٽ نيٽ ورڪ سيٽنگن لاءِ تجويزن سان پيڪيٽ قبول ڪري ٿو، سڀ کان وڌيڪ پرڪشش چونڊيو (معيار مختلف ٿي سگهي ٿو، مثال طور، پيڪٽ پهچائڻ جو وقت، وچولي رستن جو تعداد)، ۽ نيٽ ورڪ سيٽنگن سان "سرڪاري درخواست" DHCPREQUEST ٺاهي ٿو. DHCP سرور مان اهو پسند ڪري ٿو. انهي حالت ۾، پيڪٽ هڪ مخصوص DHCP سرور ڏانهن وڃي ٿو.
  4. سرور جيڪو DHCPREQUEST وصول ڪري ٿو هڪ DHCPACK فارميٽ پيڪٽ موڪلي ٿو، جنهن ۾ اهو هڪ ڀيرو ٻيهر نيٽ ورڪ سيٽنگون لسٽ ڪري ٿو جيڪو هن ڪلائنٽ لاءِ ارادو ڪيو ويو آهي

Python ۾ DHCP + Mysql سرور

ان کان علاوه، DHCPINFORM پيڪيٽ موجود آهن جيڪي ڪلائنٽ کان ايندا آهن، ۽ جنهن جو مقصد DHCP سرور کي خبر ڏيڻ آهي ته "ڪلائنٽ زنده آهي" ۽ جاري ڪيل نيٽ ورڪ سيٽنگون استعمال ڪري رهيو آهي. هن سرور جي عمل ۾، اهي پيڪيٽ نظر انداز ڪيا ويا آهن.

پيڪيج فارميٽ

عام طور تي، هڪ Ethernet پيڪٽ فريم هن طرح ڪجهه ڏسڻ ۾ اچي ٿو:

Python ۾ DHCP + Mysql سرور

اسان جي صورت ۾، اسان صرف UDP پيڪٽ جي مواد مان سڌو سنئون ڊيٽا تي غور ڪنداسين، بغير OSI پرت پروٽوڪول هيڊرز، يعني DHCP ساخت:

DHCPDISCOVER

تنهن ڪري، هڪ ڊوائيس لاء IP پتي حاصل ڪرڻ جو عمل شروع ٿئي ٿو DHCP ڪلائنٽ پورٽ 68 کان 255.255.255.255:67 تائين براڊڪاسٽ درخواست موڪلڻ سان. هن پيڪيج ۾، ڪلائنٽ شامل آهي ان جي MAC ايڊريس، انهي سان گڏ اهو ڇا آهي جيڪو اهو حاصل ڪرڻ چاهي ٿو DHCP سرور کان. پيڪيج جي جوڙجڪ هيٺ ڏنل جدول ۾ بيان ڪئي وئي آهي.

DHCPDISCOVER پيڪٽ جي جوڙجڪ ٽيبل

پيڪيج ۾ پوزيشن
نالو قدر
مثال طور
تعارف
بيٽ
وضاحت

1
بوٽ جي درخواست
1
Hex
1
پيغام جو قسم. 1 - ڪلائنٽ کان سرور تائين درخواست، 2 - سرور کان ڪلائنٽ جو جواب

2
هارڊويئر جو قسم
1
Hex
1
هارڊويئر ايڊريس جو قسم، هن پروٽوڪول ۾ 1 - MAC

3
هارڊويئر ايڊريس ڊگھائي
6
Hex
1
ڊوائيس MAC پتي جي ڊيگهه

4
هپس
1
Hex
1
وچولي رستن جو تعداد

5
ٽرانزيڪشن شناخت
23:cf:de:1d
Hex
4
منفرد ٽرانزيڪشن جي سڃاڻپ ڪندڙ. درخواست جي آپريشن جي شروعات ۾ ڪلائنٽ پاران ٺاهيل

7
ٻيو گذري ويو
0
Hex
4
ايڊريس حاصل ڪرڻ جي عمل جي شروعات کان سيڪنڊن ۾ وقت

9
بوٽ جھنڊو
0
Hex
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
Hex
6
پيڪيٽ موڪليندڙ جو MAC پتو (ڪلائنٽ)

31
ڪلائنٽ هارڊويئر ايڊريس padding
 
Hex
10
مخصوص سيٽ. عام طور تي صفر سان ڀريل

41
سرور ميزبان جو نالو
 
لڪير
64
DHCP سرور جو نالو. عام طور تي منتقل نه ڪيو ويو آهي

105
بوٽ فائل جو نالو
 
لڪير
128
فائل جو نالو سرور تي استعمال ٿيل ڊسڪ بيس اسٽيشنن پاران بوٽ ڪرڻ وقت

235
جادو ڪوڪيز
63: 82: 53: 63
Hex
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 ۾، ذيلي آپشنز رکيل آهن:
Agent Circuit 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
Hex
 

 
پيڪيج جي پڄاڻي
255
کهڙو
1
255 پيٽ جي آخر جي علامت آهي

DHCPOFFER

جيئن ئي سرور وصول ڪري ٿو DHCPDISCOVER پيڪٽ ۽ جيڪڏهن اهو ڏسي ٿو ته اهو ڪلائنٽ کي گهربل هڪ کان ڪجهه پيش ڪري سگهي ٿو، پوءِ اهو ان لاءِ جواب پيدا ڪري ٿو - DHCPDISCOVER. جواب بندرگاهه ڏانهن موڪليو ويو آهي “جتان اهو آيو”، نشر ذريعي، ڇاڪاڻ ته هن وقت، ڪلائنٽ وٽ اڃا تائين IP پتو نه آهي، تنهن ڪري اهو صرف پيڪٽ قبول ڪري سگهي ٿو جيڪڏهن اهو نشر ذريعي موڪليو ويو آهي. ڪلائنٽ تسليم ڪري ٿو ته هي هڪ پيڪيج آهي هن لاءِ هن جي MAC ايڊريس طرفان پيڪيج اندر، انهي سان گڏ اهو ٽرانزيڪشن نمبر جيڪو هو ٺاهي ٿو جڏهن پهريون پيڪيج ٺاهيو ويو آهي.

DHCPOFFER پئڪيٽ جي جوڙجڪ ٽيبل

پيڪيج ۾ پوزيشن
قدر جو نالو (عام)
مثال طور
تعارف
بيٽ
وضاحت

1
بوٽ جي درخواست
1
Hex
1
پيغام جو قسم. 1 - ڪلائنٽ کان سرور تائين درخواست، 2 - سرور کان ڪلائنٽ جو جواب

2
هارڊويئر جو قسم
1
Hex
1
هارڊويئر ايڊريس جو قسم، هن پروٽوڪول ۾ 1 - MAC

3
هارڊويئر ايڊريس ڊگھائي
6
Hex
1
ڊوائيس MAC پتي جي ڊيگهه

4
هپس
1
Hex
1
وچولي رستن جو تعداد

5
ٽرانزيڪشن شناخت
23:cf:de:1d
Hex
4
منفرد ٽرانزيڪشن جي سڃاڻپ ڪندڙ. درخواست جي آپريشن جي شروعات ۾ ڪلائنٽ پاران ٺاهيل

7
ٻيو گذري ويو
0
Hex
4
ايڊريس حاصل ڪرڻ جي عمل جي شروعات کان سيڪنڊن ۾ وقت

9
بوٽ جھنڊو
0
Hex
2
ڪجھ جھنڊا جيڪي مقرر ڪري سگھجن ٿا پروٽوڪول پيٽرولن جي نشاندهي ڪرڻ لاءِ. انهي حالت ۾، 0 جو مطلب آهي يونيڪاسسٽ درخواست جو قسم

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
Hex
6
پيڪيٽ موڪليندڙ جو MAC پتو (ڪلائنٽ)

31
ڪلائنٽ هارڊويئر ايڊريس padding
 
Hex
10
مخصوص سيٽ. عام طور تي صفر سان ڀريل

41
سرور ميزبان جو نالو
 
لڪير
64
DHCP سرور جو نالو. عام طور تي منتقل نه ڪيو ويو آهي

105
بوٽ فائل جو نالو
 
لڪير
128
فائل جو نالو سرور تي استعمال ٿيل ڊسڪ بيس اسٽيشنن پاران بوٽ ڪرڻ وقت

235
جادو ڪوڪيز
63: 82: 53: 63
Hex
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
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
Hex
1
پيغام جو قسم. 1 - ڪلائنٽ کان سرور تائين درخواست، 2 - سرور کان ڪلائنٽ جو جواب

2
هارڊويئر جو قسم
1
Hex
1
هارڊويئر ايڊريس جو قسم، هن پروٽوڪول ۾ 1 - MAC

3
هارڊويئر ايڊريس ڊگھائي
6
Hex
1
ڊوائيس MAC پتي جي ڊيگهه

4
هپس
1
Hex
1
وچولي رستن جو تعداد

5
ٽرانزيڪشن شناخت
23:cf:de:1d
Hex
4
منفرد ٽرانزيڪشن جي سڃاڻپ ڪندڙ. درخواست جي آپريشن جي شروعات ۾ ڪلائنٽ پاران ٺاهيل

7
ٻيو گذري ويو
0
Hex
4
ايڊريس حاصل ڪرڻ جي عمل جي شروعات کان سيڪنڊن ۾ وقت

9
بوٽ جھنڊو
8000
Hex
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
Hex
6
پيڪيٽ موڪليندڙ جو MAC پتو (ڪلائنٽ)

31
ڪلائنٽ هارڊويئر ايڊريس padding
 
Hex
10
مخصوص سيٽ. عام طور تي صفر سان ڀريل

41
سرور ميزبان جو نالو
 
لڪير
64
DHCP سرور جو نالو. عام طور تي منتقل نه ڪيو ويو آهي

105
بوٽ فائل جو نالو
 
لڪير
128
فائل جو نالو سرور تي استعمال ٿيل ڊسڪ بيس اسٽيشنن پاران بوٽ ڪرڻ وقت

235
جادو ڪوڪيز
63: 82: 53: 63
Hex
4
"جادو" نمبر، جنهن جي مطابق، شامل. توهان اندازو لڳائي سگهو ٿا ته هي پيڪٽ DHCP پروٽوڪول سان تعلق رکي ٿو

DHCP اختيارن. ڪنهن به ترتيب ۾ وڃي سگهي ٿو

236
آپشن نمبر
53
کهڙو
3
آپشن 53، جيڪو وضاحت ڪري ٿو DHCP پيٽ جي قسم 3 - DHCPREQUEST

 
اختيار جي ڊيگهه
1
کهڙو
1

 
اختياري قدر
3
کهڙو
1

 
آپشن نمبر
61
کهڙو
1
ڪلائنٽ ID: 01 (Ehernet لاءِ) + ڪلائنٽ MAC پتو

 
اختيار جي ڊيگهه
7
کهڙو
1

 
اختياري قدر
01:2c:ab:25:ff:72:a6
Hex
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
Hex
1
پيغام جو قسم. 1 - ڪلائنٽ کان سرور تائين درخواست، 2 - سرور کان ڪلائنٽ جو جواب

2
هارڊويئر جو قسم
1
Hex
1
هارڊويئر ايڊريس جو قسم، هن پروٽوڪول ۾ 1 - MAC

3
هارڊويئر ايڊريس ڊگھائي
6
Hex
1
ڊوائيس MAC پتي جي ڊيگهه

4
هپس
1
Hex
1
وچولي رستن جو تعداد

5
ٽرانزيڪشن شناخت
23:cf:de:1d
Hex
4
منفرد ٽرانزيڪشن جي سڃاڻپ ڪندڙ. درخواست جي آپريشن جي شروعات ۾ ڪلائنٽ پاران ٺاهيل

7
ٻيو گذري ويو
0
Hex
4
ايڊريس حاصل ڪرڻ جي عمل جي شروعات کان سيڪنڊن ۾ وقت

9
بوٽ جھنڊو
8000
Hex
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
Hex
6
پيڪيٽ موڪليندڙ جو MAC پتو (ڪلائنٽ)

31
ڪلائنٽ هارڊويئر ايڊريس padding
 
Hex
10
مخصوص سيٽ. عام طور تي صفر سان ڀريل

41
سرور ميزبان جو نالو
 
لڪير
64
DHCP سرور جو نالو. عام طور تي منتقل نه ڪيو ويو آهي

105
بوٽ فائل جو نالو
 
لڪير
128
فائل جو نالو سرور تي استعمال ٿيل ڊسڪ بيس اسٽيشنن پاران بوٽ ڪرڻ وقت

235
جادو ڪوڪيز
63: 82: 53: 63
Hex
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
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 surepip pip3 انسٽال ڪريو mysql-connector

Ubuntu

sudo apt-get install python3 sudo apt-get install pip3 sudo pip3 انسٽال ڪريو 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 localhost ٽيسٽ ٽيسٽ 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 from user where upper(mac)=upper('{ClientMacAddress}') تاريخ ۾ داخل ڪريو (id,dt,mac,ip,comment) قدر (null,now(),'{ClientMacAddress}','{RequestedIpAddress}','DHCPACK/INFORM')

هاڻي ٽيگ تي وڌيڪ تفصيل سان:

dhcpserver سيڪشن بيان ڪري ٿو بنيادي سيٽنگون سرور کي شروع ڪرڻ لاءِ، يعني:

  • ميزبان - سرور 67 پورٽ تي ڪهڙو IP پتو ٻڌندو آهي
  • براڊڪاسٽ - جيڪو ip DHCPOFFER ۽ DHCPACK لاءِ براڊڪاسٽ آهي
  • DHCPServer - DHCP سرور جو ip ڇا آهي
  • جاري ڪيل IP پتي جي ليز ٽائيم ليز ٽائيم
  • ThreadLimit - پورٽ 67 تي ايندڙ يو ڊي پي پيڪٽس کي پروسيس ڪرڻ لاءِ ڪيترا ٿريڊس هڪ ئي وقت هلندا آهن. اهو سمجهيو ويندو آهي ته مدد ڪرڻ لاءِ وڌيڪ لوڊ منصوبن تي 😉
  • defaultMask,defaultRouter,defaultDNS - ڊفالٽ طور سبسڪرائبر کي ڇا پيش ڪيو ويندو آهي جيڪڏهن ڊيٽابيس ۾ هڪ IP ملي ٿي، پر ان لاءِ اضافي پيٽرولر بيان نه ڪيا ويا آهن.

mysql سيڪشن:

ميزبان، يوزرنيم، پاسورڊ، بنيادي نالو - سڀ ڪجهه پاڻ لاء ڳالهائيندو آهي. هڪ تقريبن ڊيٽابيس جي جوڙجڪ تي پوسٽ ڪئي وئي آهي GitHub

سوال سيڪشن: OFFER/ACK حاصل ڪرڻ لاءِ درخواستون هتي بيان ڪيون ويون آهن:

  • offer_count - درخواستن سان لائنن جو تعداد جيڪو نتيجو موٽائي ٿو جهڙوڪ ip,mask,router,dns
  • offer_n - سوال جي تار. جيڪڏهن واپسي خالي آهي، پوء هيٺ ڏنل پيشڪش جي درخواست تي عمل ڪري ٿو
  • history_sql - هڪ سوال جيڪو لکي ٿو، مثال طور، "اجازت جي تاريخ" ڏانهن سبسڪرائيبر لاءِ

درخواستن ۾ اختيارن جي سيڪشن مان ڪي به متغير شامل ٿي سگھن ٿا يا DHCP پروٽوڪول جا اختيار.

اختيارن سيڪشن. هي اهو آهي جتي اهو وڌيڪ دلچسپ ٿيندو. هتي اسان variables ٺاهي سگهون ٿا جيڪي اسان بعد ۾ پڇا ڳاڇا سيڪشن ۾ استعمال ڪري سگهون ٿا.

مثال طور

option_82_hex:sw_port1:20:22

، هي ڪمانڊ لائين پوري لائن وٺي ٿي جيڪا آئي ڊي ايڇ سي پي جي درخواست آپشن 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',C0025224dAdress764M00) yte': b'x7 91%"Jxd5d' , 'HType': 'Ethernet', 'HostName': b'x0xa3xe5xa9xa8xa8-x43fx0.0.0.0a', 'ReqListDNS': سچو, 'ReqListDomainName': سچو, 'ReqListPerfowmRouterDiscover': TruqistRouter', TruqistRouter': e': سچ، 'ReqListSubnetM پڇو': سچو, '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'

ان مطابق، اسان ڪنهن به variable کي {} ۾ لپي سگھون ٿا ۽ اهو SQL سوال ۾ استعمال ڪيو ويندو.

اچو ته تاريخ لاءِ رڪارڊ ڪريون ته ڪلائنٽ مليل IP پتو:

Python ۾ DHCP + Mysql سرور

Python ۾ DHCP + Mysql سرور

سرور جي شروعات

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

- ڊي ڪنسول آئوٽ پٽ موڊ ڊيبگ
- c <filename> configuration file

بحث مباحثو ڪرڻ

۽ هاڻي Python ۾ سرور لاڳو ڪرڻ تي وڌيڪ تفصيل. اهو هڪ درد آهي. پٿرن کي اڏامڻ تي سکيو ويو. ڪيترائي لمحا "واه، ڪنهن به طرح مون ان کي ڪم ڪيو." جي انداز ۾ ٺاهيو ويو آهي. بلڪل به بهتر نه ڪيو ويو، ۽ هن فارم ۾ ڇڏي ويو خاص طور تي پٿون ڊولپمينٽ ۾ ٿورو تجربو جي ڪري. مان "ڪوڊ" ۾ سرور جي عمل درآمد جي سڀ کان دلچسپ پهلوئن تي رھندس.

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("صارف جو نالو")[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. dhcp_ThreadLimit"] = int(elem.getElementsByTagName("ThreadLimit")[0].firstChild.data) gconfig["dhcp_Server"]=elem.getElementsByTagName("DHCPServer")[0]dec_fault. =elem.getElementsByTagName("defaultMask")[0].firstChild.data gconfig["dhcp_defaultRouter"]=elem.getElementsByTagName("defaultRouter")[0].firstChild.data"gconfig_defaultMask]"faultTaglements " defaultDNS"). حد (int(gconfig["offer_count"])): gconfig["offer_"+str(num+0)]=elem.getElementsByTagName("offer_"+str(num+0))[1].firstChild.data gconfig ["history_sql"]=elem.getElementsByTagName("history_sql")[1].firstChild.data options=tree.getElementsByTagName("options") اختيارن ۾ عنصرن لاءِ: node=elem.getElementsByTagName("options no"in) : optionsMod.append(options.firstChild.data)

ملٽي ٽريڊنگ

حيرت انگيز طور تي، پٿون ۾ ملٽي ٿريڊنگ بلڪل واضح ۽ آسان طور تي لاڳو ڪئي وئي آهي.

def PacketWork(data,addr): ... # اچڻ واري پيڪٽ کي پارس ڪرڻ ۽ ان تي جواب ڏيڻ جو عمل... جڏهن ته صحيح: data, addr = udp_socket.recvfrom(1024) # انتظار ڪري رهيو آهي UDP پيڪٽ thread = threading.Thread( target=PacketWork , args=(data,addr,)).start() # جيئن آيو آهي - اسان اڳئين بيان ڪيل PacketWork فنڪشن کي پس منظر ۾ پيرا ميٽرز سان شروع ڪيو جڏهن ته threading.active_count() >gconfig["dhcp_ThreadLimit"]: وقت. sleep(1) # جيڪڏهن نمبر سيٽنگن جي ڀيٽ ۾ اڳ ۾ ئي وڌيڪ سلسلا هلندڙ آهن، اسان انتظار ڪريون ٿا جيستائين انهن مان گهٽ آهن

وصول ڪريو / موڪليو 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: port هوندي. اتي پڻ ٿي سگھي ٿو AF_UNIX - جتي ايڊريس فائل جي نالي سان ڏنل آھي.
  • SOCK_DGRAM - مطلب ته اسان "خام پيڪٽ" کي قبول نه ڪندا آهيون، پر هڪ جيڪو اڳ ۾ ئي فائر وال مان گذري چڪو آهي، ۽ جزوي طور تي ٺهيل پيڪٽ سان. اهي. اسان صرف يو ڊي پي پيڪٽ حاصل ڪندا آهيون بغير "جسماني" اجزاء جي 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 پيڪيٽ کي پارس ڪرڻ

هي آهي جتي مون کي پٿون واقعي پسند ڪيو. اهو ظاهر ٿئي ٿو ته دٻي مان ٻاهر اهو توهان کي بائيٽ ڪوڊ سان ڪافي لچڪدار ٿيڻ جي اجازت ڏئي ٿو. ان کي تمام آسانيءَ سان decimal values، strings ۽ hex - i.e. اھو اھو آھي جيڪو اسان کي اصل ۾ پيڪيج جي جوڙجڪ کي سمجھڻ جي ضرورت آھي. تنهن ڪري، مثال طور، توهان حاصل ڪري سگهو ٿا بائيٽ جي حد HEX ۾ ۽ صرف بائيٽس:

    res["xidhex"]=data[4:8].hex() Res["xidbyte"]=ڊيٽا[4:8]

، بائيٽ کي ھڪڙي جوڙجڪ ۾ پيڪ ڪريو:

res["flags"]=pack('BB'،ڊيٽا[10]،ڊيٽا[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

تبصرو شامل ڪريو