
मैं इस प्रक्रिया को स्वचालित करने के लिए और इस या उस सामग्री का अध्ययन करने के लिए अपनी खुद की बाइक लिखना पसंद करता हूं। मेरा नया लक्ष्य एक डीएचसीपी सर्वर था, जो छोटे नेटवर्क में एक पता जारी करेगा ताकि उपकरण का प्रारंभिक कॉन्फ़िगरेशन किया जा सके।
इस लेख में मैं डीएचसीपी प्रोटोकॉल और बैश से कुछ सूक्ष्मताओं के बारे में थोड़ी बात करूंगा।
अंतिम परिणाम
चलिए अंत से शुरू करते हैं, ताकि यह स्पष्ट हो जाए कि हम क्या लड़ रहे हैं।
कार्य का प्रदर्शन:

स्क्रिप्ट के साथ रिपोजिटरी:
फायरमून777 / बैश-डीएचसीपी-सर्वरप्रारंभिक समस्या
मुझे जिस कॉन्फ़िगरेशन की आवश्यकता है वह इस तरह से किया जाता है: हम सीधे उपकरण के लिए मुड़ जोड़ी के माध्यम से जुड़ते हैं, डीएचसीपी के माध्यम से एक अस्थायी पता जारी करते हैं, और पहले से बनाई गई स्क्रिप्ट के साथ इसे कॉन्फ़िगर करते हैं। और इसलिए लगातार दस से बीस बार।
कई लोगों के लिए, जाने-माने isc-dhcp-server अपना काम पूरी तरह से करता है, लेकिन, इसके साथ ही, यह मेरी स्क्रिप्ट को सूचित नहीं करता है कि पता जारी किया गया है, इसलिए आपको किसी तरह से पता जारी होने तक निष्पादन को ब्लॉक करने की आवश्यकता है।
समाधान, ऐसा लगता है, सतह पर है: चेहरे पर नीले रंग तक, जब तक उपकरण प्रतिक्रिया नहीं करता है:
while ! ping -c1 -W1 "$DHCP" | grep -q "time=" do echo "Waiting for $DHCP..." done
लेकिन इस फैसले में निश्चित रूप से रोमांच की कमी है।
सैद्धांतिक हिस्सा
एक एकल डीएचसीपी सर्वर के साथ एक पते को प्राप्त करना
डीएचसीपी प्रोटोकॉल 67 और 68 बंदरगाहों पर यूडीपी पर काम करता है। सर्वर हमेशा केवल 67 पर काम करता है, और क्लाइंट केवल 68 पर। ग्राहक के पास एड्रेस नहीं है (एड्रेस 0.0.0.0 है), डीएचसीपी पैकेट प्रसारित होते हैं। यानी क्लाइंट हमेशा पते से 255.255.255.255:67, 0.0.0.0:68 पते से पैकेट भेजता है और सर्वर इसके पते से 67: पता 255.255.255.255:68 पते पर भेजता है।
ग्राहक
को चार पैकेट (
DORA ) में पता
प्राप्त होता है :
- क्लाइंट को पता चलता है कि डीएचसीपी सर्वर कहां है ( D iscover)
- सर्वर अपना जवाब देता है और अपना पता देता है ( O ffer)
- ग्राहक एक विशिष्ट सर्वर ( आर इक्विटी) से प्रस्तावित पते का अनुरोध करता है
- सर्वर इससे सहमत है और पता जारी करता है ( A ck)
नेत्रहीन, इस योजना को निम्नानुसार दर्शाया जा सकता है:

कई डीएचसीपी सर्वर के साथ एक पते को प्राप्त करना
जब ग्राहक डिस्कवर भेजता है, तो सभी सर्वर जो क्लाइंट को अपना प्रस्ताव भेज सकते हैं, सुन सकते हैं। लेकिन ग्राहक को एक चुनना होगा। क्लाइंट का चयन विकल्प 54 (डीएचसीपी सर्वर) के साथ अनुरोध संदेश में किया जाता है, जिसमें पसंदीदा डीएचसीपी सर्वर का आईपी पता होता है। हालाँकि नेटवर्क पर सभी के लिए अनुरोध भी भेजा जाता है, केवल डीएचसीपी सर्वर जिसका आईपी विकल्प 54 में निर्दिष्ट है, प्रतिक्रिया देगा।

डीएचसीपी पैकेट सामग्री
एक डीएचसीपी पैकेट में दो भाग होते हैं: एक स्थिर, आकार में 236 बाइट्स, और एक चर जो विकल्प (डीएचसीपी विकल्प) को वहन करता है।
विकिपीडिया से डीएचसीपी पैकेट के सभी क्षेत्रों के साथ तालिकामैदान | विवरण | लंबाई (बाइट्स में) |
---|
सेशन
| संदेश का प्रकार। उदाहरण के लिए, यह मान ले सकता है: BOOTREQUEST (0x01, क्लाइंट से सर्वर पर अनुरोध) और BOOTREPLY (0x02, सर्वर से क्लाइंट की प्रतिक्रिया)।
| 1
|
htype
| हार्डवेयर पते का प्रकार। इस क्षेत्र के लिए मान्य मूल्य RFC 1700 निरुपित संख्या में परिभाषित किए गए हैं। उदाहरण के लिए, ईथरनेट मैक पते के लिए, यह फ़ील्ड 0x01 पर सेट है।
| 1
|
hlen
| बाइट्स में हार्डवेयर पते की लंबाई। ईथरनेट मैक एड्रेस 0x06 है।
| 1
|
हॉप्स
| मध्यवर्ती राउटर की संख्या (तथाकथित डीएचसीपी रिले एजेंट ) जिसके माध्यम से संदेश पास हुआ। क्लाइंट इस फ़ील्ड को 0x00 पर सेट करता है।
| 1
|
XID
| पता प्राप्त करने की प्रक्रिया की शुरुआत में ग्राहक द्वारा उत्पन्न 4 बाइट्स का एक अद्वितीय लेनदेन पहचानकर्ता।
| 4
|
सेकेंड
| पता प्राप्त करने की प्रक्रिया की शुरुआत के बाद से सेकंड में समय। उपयोग नहीं किया जा सकता है (इस मामले में यह 0x0000 पर सेट है)।
| 2
|
झंडे
| झंडे के लिए क्षेत्र डीएचसीपी प्रोटोकॉल के विशेष पैरामीटर हैं।
| 2
|
ciaddr
| क्लाइंट IP पता। यह केवल तभी भरा जाता है जब क्लाइंट के पास पहले से ही अपना आईपी पता है और ARP अनुरोधों का जवाब देने में सक्षम है (यह संभव है यदि क्लाइंट लीज समाप्त होने के बाद पते को अपडेट करने की प्रक्रिया करता है)।
| 4
|
yiaddr
| सर्वर द्वारा प्रस्तावित नया क्लाइंट आईपी पता।
| 4
|
siaddr
| सर्वर आईपी पता। डीएचसीपी क्लॉज में लौटे (नीचे देखें)।
| 4
|
giaddr
| रिले एजेंट का आईपी पता, यदि कोई सर्वर को डीएचसीपी संदेश देने की प्रक्रिया में शामिल था।
| 4
|
CHADDR
| क्लाइंट का हार्डवेयर पता (आमतौर पर मैक एड्रेस)।
| 16
|
SNAME
| एक शून्य समाप्त स्ट्रिंग के रूप में वैकल्पिक सर्वर नाम।
| 64
|
फ़ाइल
| दूरस्थ रूप से डाउनलोड करने पर डिस्कलेस वर्कस्टेशन द्वारा उपयोग किया जाने वाला एक वैकल्पिक सर्वर फ़ाइल नाम। Sname की तरह, इसे null- termized string के रूप में दर्शाया गया है।
| 128
|
विकल्प
| डीएचसीपी विकल्प क्षेत्र। विभिन्न अतिरिक्त कॉन्फ़िगरेशन विकल्प यहां दिए गए हैं। इस क्षेत्र की शुरुआत में, 99, 130, 83, 99 ("मैजिक नंबर") मूल्यों वाले चार विशेष बाइट्स इंगित किए जाते हैं, जिससे सर्वर को इस क्षेत्र की उपस्थिति निर्धारित करने की अनुमति मिलती है। फ़ील्ड में एक चर लंबाई है, लेकिन डीएचसीपी क्लाइंट को 576-बाइट डीएचसीपी संदेश प्राप्त करने के लिए तैयार होना चाहिए (इस संदेश में, विकल्प फ़ील्ड 340 बाइट्स लंबा है)।
| परिवर्तनशील
|
आरएफसी 2132 में सभी डीएचसीपी विकल्पों की सूचीDHCP विकल्प निम्नानुसार एन्कोड किए गए हैं:
उदाहरण के लिए, 10.0.0.1 के मान के साथ पैरामीटर 3 (प्रस्तावित गेटवे):
यदि आपको कई मापदंडों को पारित करने की आवश्यकता होती है, तो पैरामीटर की लंबाई बढ़ जाती है।
उदाहरण के लिए, पैरामीटर 6 (DNS सर्वर) में हम दो पते (1.1.1.1 और 8.8.4.4) प्रसारित करेंगे:
विकल्प फ़ील्ड के अंत का एक संकेत संख्या 255 (0xFF) के साथ एक पैरामीटर है और 0 की लंबाई है।
अक्सर, ग्राहक डीएचसीपी डिस्कवर में पैरामीटर 55 (पैरामीटर की एक सूची जिसे वह प्रतिक्रिया में प्राप्त करना चाहता है) डालता है, हालांकि, हमारे पास उसे वह सब कुछ देने का अधिकार है जो उसने अनुरोध किया था।
व्यावहारिक भाग
यह मूल रूप से सर्वर को इसके लिए कुछ और उपयुक्त भाषा (सी) में लिखने की योजना बनाई गई थी, हालांकि, यह सांसारिक और सरल होगा। यह या तो एक स्क्रिप्ट लिखने की बात है जो dhcp सर्वर के फंक्शन्स को संभालेगी।
सरल
चूंकि सर्वर को विकसित किया जा रहा था, उन्हें पैच से जुड़े दो नोड्स के नेटवर्क में उपयोग किया जाना था, निम्नलिखित सरलीकरण को अपनाया गया था:
- गारंटी है कि नेटवर्क पर एक ग्राहक;
- यह गारंटी है कि नेटवर्क में अधिक dhcp सर्वर नहीं हैं
- आरंभकर्ता यह तय करता है कि कौन सा पता जारी करना है
- डीएचसीपी रिलीज और डीएचसीपी डिक्लाइन की अनदेखी की जाती है
श्रोता
सबसे पहले, आपको यह जानने की ज़रूरत है कि पैकेट कैसे प्राप्त करें। इसके लिए एक
प्रमाणित सहानुभूति श्रोता की आवश्यकता होती है, उदाहरण के लिए, एन.सी. लेकिन हर एनसी इन उद्देश्यों के लिए उपयुक्त नहीं है। डेबियन से OpenBSD netcat 1.130 उपयुक्त है, लेकिन उबंटू के साथ 1.105 चला गया है। पोर्ट 67 पर आने वाले सभी यूडीपी पैकेटों को सुनने के लिए एनसी चलाएं।
nc -l 0.0.0.0 -up 67 -w0
OpenBSD netcat की आवश्यकता 0. के मान के साथ -w स्विच के कारण होती है। एक पैकेट (UDP ब्रॉडकास्ट) प्राप्त करने के बाद, पारंपरिक nc को अधिक पैकेट प्राप्त नहीं होते हैं, लेकिन यह समाप्त नहीं होता है।
कच्चा बाइट संभालना
शेल में, गैर-मुद्रण योग्य वर्णों के साथ काम करना बहुत मुश्किल है, जैसे कि एक अशक्त चरित्र: यह बस इसे अनदेखा करता है। एक DHCP पैकेट में कई बाइट्स 0x00 होते हैं (उदाहरण के लिए, फ़ाइल फ़ील्ड)। समस्या का हल हेक्स-डंप के रूप में आता है:
nc -l 0.0.0.0 -up 67 -w0 | stdbuf -o0 od -v -w1 -t x1 -An
डुप्लिकेट बाइट्स को लंघन के बिना, पते के आउटपुट के बिना प्रति पंक्ति एक बाइट। आप stdbuf -o0 को मसाला भी दे सकते हैं ताकि आउटपुट बफर न हो।
पैकेज प्राप्त करना, भंडारण और प्रसंस्करण करना
ओड कमांड स्टैडआउट से, बाइट्स को रीड कमांड द्वारा लिया जाता है और एक अरै में जोड़ा जाता है।
msg=() for i in {0..235}; do read -r tmp msg[$i]=$tmp done
यद्यपि सभी मान हेक्साडेसिमल संकेतन में प्रेषित होते हैं, डीएचसीपी विकल्प संख्या और विकल्प की लंबाई स्क्रीन पर / सामान्य दशमलव रूप में लॉग में प्रदर्शित होती है। ऐसा करने के लिए, आप एक छोटी प्रविष्टि bash'a का उपयोग कर सकते हैं:
$ op=AC $ echo $((16
प्राप्त पैकेट को अनुरोध के प्रकार (डिस्कवर या अनुरोध) के अनुसार संपादित किया जाता है और वापस भेजा जाता है।
जवाब भेजने
हालाँकि, पैकेज भेजना इतना आसान काम नहीं है। सबसे पहले आपको बाइट्स को डंप से कच्ची बाइट में बदलने और एक पैकेट के साथ सब कुछ एक साथ भेजने की आवश्यकता है।
एस्केप सीक्वेंस का उपयोग करके प्रिंटफ़ उपयोगिता के साथ रूपांतरण किया जा सकता है। और इसलिए कि कुछ भी नहीं खोया है, बाइट्स को तुरंत एक फ़ाइल में लिखें।
OpenBSD netcat को भेजने के लिए भी उपयोग किया जाता है। हालांकि, अगर उबंटू के साथ संस्करण 1.105 एक श्रोता के रूप में उपयुक्त है, तो यह यूडीपी संदेशों को प्रसारित करने के लिए उपयुक्त नहीं है: हमें प्रोटोकॉल उपलब्ध त्रुटि मिलती है।
cat /tmp/dhcp.payload | nc -ub 255.255.255.255 68 -s $SERVER -p 67 -w0
-B स्विच प्रसारण संदेशों को भेजने की अनुमति देता है, और यह दूसरा कारण है कि सर्वर को सुपरयुसर के तहत चलाया जाना चाहिए।
सीमाएं क्या हैं?
इस डीएचसीपी सर्वर को नेटवर्क पर एकल क्लाइंट की तरह सरलीकरण के साथ डिजाइन किया गया था। हालांकि, यह कई ग्राहकों के साथ काम करेगा। बस सबसे तेज पता।

निष्कर्ष
हालांकि बैश लिपियों को शायद ही एक पूर्ण प्रोग्रामिंग भाषा कहा जा सकता है, फिर भी, उचित इच्छा के साथ, आप इसके लिए विशेष रूप से डिज़ाइन किए गए सॉफ़्टवेयर का उपयोग किए बिना नेटवर्क पर एक आईपी पता जारी करने जैसी समस्याओं को भी हल कर सकते हैं। और विशिष्ट समस्याओं को हल करने से न केवल खुशी मिलती है, बल्कि समाधान के समय खोले गए नए ज्ञान भी प्राप्त होते हैं।
सूत्रों का कहना है
- डीएचसीपी - विकिपीडिया
- DHCP और BOOTP पैरामीटर - IANA