ڪم ڪندڙ DHCP سرور حاصل ڪرڻ جي صلاحيت سان گڏ رڪنيت حاصل ڪرڻ واري جي IP پتي کي چونڊڻ جي صلاحيت استعمال ڪندي سبسڪرائبر جي ميڪ يا سوئچ ميڪ + پورٽ ميلاپ (آپشن 82)
ٻي سائيڪل لکڻ (او! هي منهنجي پسنديده سرگرمي آهي)
Habrahabr تي توهان جي ڪلب جي حوالي سان تبصرا حاصل ڪرڻ (يا اڃا بهتر، هڪ دعوت) 😉
نتيجو: اهو ڪم ڪري ٿو 😉 آزمائشي FreeBSD ۽ Ubuntu OS تي. نظرياتي طور، ڪوڊ ڪنهن به او ايس تحت ڪم ڪرڻ لاء چيو وڃي ٿو، ڇاڪاڻ ته ڪوڊ ۾ ڪو خاص پابند نه لڳي.
هوشياري سان! اڃا به گهڻو ڪجهه اچڻو آهي.
شوقين لاءِ مخزن سان ڳنڍيو "زندہ ٽچ".
انسٽال ڪرڻ، ترتيب ڏيڻ ۽ استعمال ڪرڻ جو عمل "هارڊويئر جي مطالعي" جي نتيجي ۾ تمام گهٽ آهي، ۽ پوء DHCP پروٽوڪول بابت ٿورو نظريو. پنهنجي لاءِ. ۽ تاريخ لاءِ 😉
هڪ ننڍڙو نظريو
DHCP ڇا آهي؟
هي هڪ نيٽ ورڪ پروٽوڪول آهي جيڪو هڪ ڊوائيس کي ان جي IP پتي کي ڳولڻ جي اجازت ڏئي ٿو (۽ ٻيا پيٽرولر جهڙوڪ گيٽ وي، DNS، وغيره) DHCP سرور کان. UDP پروٽوڪول استعمال ڪندي پيڪيٽ مٽائي رهيا آهن. ڊوائيس جي آپريشن جو عام اصول جڏهن نيٽ ورڪ پيٽرولر جي درخواست ڪئي وئي آهي هن ريت آهي:
ڊيوائس (ڪلائنٽ) سڄي نيٽ ورڪ ۾ يو ڊي پي براڊڪاسٽ ريڪوسٽمينٽ (DHCPDISCOVER) موڪلي ٿو ان درخواست سان ”چڱو، ڪو مون کي IP پتو ڏيو. ان کان علاوه، عام طور تي (پر هميشه نه) درخواست پورٽ 68 (ذريعو) کان ٿيندي آهي، ۽ منزل آهي بندرگاهه 67 (منزل). ڪجهه ڊوائيس پڻ بندرگاهن 67 کان پيڪيٽ موڪليندا آهن. ڪلائنٽ ڊيوائس جو MAC پتو DHCPDISCOVER پيڪٽ اندر شامل ڪيو ويو آهي.
نيٽ ورڪ تي موجود سڀ DHCP سرورز (۽ انهن مان ڪيترائي ٿي سگهن ٿا) هڪ DHCPOFFER آڇ ٺاهيندا آهن نيٽ ورڪ سيٽنگن سان گڏ ڊيوائس لاءِ جنهن DHCPDISCOVER موڪليو، ۽ ان کي نيٽ ورڪ تي پڻ نشر ڪيو. جنهن جي سڃاڻپ هن پيڪٽ لاءِ آهي ان تي ٻڌل آهي ڪلائنٽ جي MAC ايڊريس تي جيڪا اڳ ۾ DHCPDISCOVER درخواست ۾ مهيا ڪئي وئي آهي.
ڪلائنٽ نيٽ ورڪ سيٽنگن لاءِ تجويزن سان پيڪيٽ قبول ڪري ٿو، سڀ کان وڌيڪ پرڪشش چونڊيو (معيار مختلف ٿي سگهي ٿو، مثال طور، پيڪٽ پهچائڻ جو وقت، وچولي رستن جو تعداد)، ۽ نيٽ ورڪ سيٽنگن سان "سرڪاري درخواست" DHCPREQUEST ٺاهي ٿو. DHCP سرور مان اهو پسند ڪري ٿو. انهي حالت ۾، پيڪٽ هڪ مخصوص DHCP سرور ڏانهن وڃي ٿو.
آپشن نمبر
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 پيش ڪرڻ جو اختيار
اختياري قدر
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
ايڊريس حاصل ڪرڻ جي عمل جي شروعات کان سيڪنڊن ۾ وقت
اختياري قدر
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
ايڊريس حاصل ڪرڻ جي عمل جي شروعات کان سيڪنڊن ۾ وقت
اسان هڪ 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 ملي ٿي، پر ان لاءِ اضافي پيٽرولر بيان نه ڪيا ويا آهن.
۽ هاڻي Python ۾ سرور لاڳو ڪرڻ تي وڌيڪ تفصيل. اهو هڪ درد آهي. پٿرن کي اڏامڻ تي سکيو ويو. ڪيترائي لمحا "واه، ڪنهن به طرح مون ان کي ڪم ڪيو." جي انداز ۾ ٺاهيو ويو آهي. بلڪل به بهتر نه ڪيو ويو، ۽ هن فارم ۾ ڇڏي ويو خاص طور تي پٿون ڊولپمينٽ ۾ ٿورو تجربو جي ڪري. مان "ڪوڊ" ۾ سرور جي عمل درآمد جي سڀ کان دلچسپ پهلوئن تي رھندس.
XML ٺاھ جوڙ فائل پارسر
معياري Python ماڊل xml.dom استعمال ڪيو ويندو آهي. اهو سادو لڳي ٿو، پر عملدرآمد دوران، واضح دستاويزن ۽ مثالن جي نيٽ ورڪ تي هن ماڊل کي استعمال ڪندي قابل ذڪر گهٽتائي هئي.
, SO_BROADCAST اختيار آهي ته هيلمٽ پيڪيج آهي ”براڊ ڪاسٽ“
SO_REUSEADDR آپشن ساکٽ کي ”ڪيترن ئي ٻڌندڙن“ موڊ ۾ تبديل ڪري ٿو. نظريي ۾، اهو ضروري ناهي ته هن معاملي ۾، پر هڪ فري بي ايس ڊي سرورز تي جنهن تي مون آزمائش ڪئي، ڪوڊ هن اختيار کان سواء ڪم نه ڪيو.
DHCP پيڪيٽ کي پارس ڪرڻ
هي آهي جتي مون کي پٿون واقعي پسند ڪيو. اهو ظاهر ٿئي ٿو ته دٻي مان ٻاهر اهو توهان کي بائيٽ ڪوڊ سان ڪافي لچڪدار ٿيڻ جي اجازت ڏئي ٿو. ان کي تمام آسانيءَ سان decimal values، strings ۽ hex - i.e. اھو اھو آھي جيڪو اسان کي اصل ۾ پيڪيج جي جوڙجڪ کي سمجھڻ جي ضرورت آھي. تنهن ڪري، مثال طور، توهان حاصل ڪري سگهو ٿا بائيٽ جي حد HEX ۾ ۽ صرف بائيٽس: