
مُحقن خيارات DHCP
هل سبق لك أن أردت اعتراض طلبات DHCP وإدراج بضع خيارات DHCP إضافية، دون علم المرسل؟ على الأرجح لا. ولكن إذا دعت الحاجة يومًا، فإن dhcpoptinj سيساعدك (آملًا).
يمكن أن تكون هناك أسباب عديدة لتشويه طلبات DHCP، على الرغم من أنك على الأرجح يجب أن تبحث عن طريقة أفضل بكثير لحل مشكلتك. ربما لا تملك حق الوصول إلى خادم/عملاء DHCP وتحتاج إلى تعديل خيارات DHCP الخاصة بهم، ربما يكون برنامج DHCP صعب التهيئة (أو لا يدعم ما تريد فعله)، ربما لديك إعداد معقد و/أو غريب، أو ربما تريد فقط تجربة إرسال خيارات غريبة أو مشوهة؟ هناك فرصة ضئيلة أن يكون dhcptinj مفيدًا بالفعل.
ينتظر dhcpoptinj وصول الحزم إلى قائمة netfilter. سيتأكد أن الحزمة هي في الواقع حزمة BOOTP/DHCP، وإذا كان الأمر كذلك، سيمضي قدمًا في حقن الخيارات. سيعيد حساب مجموع اختباري لرأس IPv4، ويعطل مجموع اختباري UDP (لتنفيذ أبسط)، ثم يعيد الحزمة إلى netfilter.
تحتاج إلى قاعدة iptables لاعتراض الحزم وإرسالها إلى dhcpoptinj. لنفترض أن لديك واجهتين مقترنتين معًا، eth0 و eth1. لنفترض أنك تريد اعتراض جميع طلبات BOOTP القادمة من eth0 وحقن خيار معلومات وكيل الترحيل (82/0x52). دعنا نبتكر حمولة سخيفة: خيار فرعي لمعرّف دائرة الوكيل بقيمة "Fjas".
أضف قاعدة إلى جدول mangle في iptables: sudo iptables -t mangle -A PREROUTING -m physdev --physdev-in eth0 -p udp --dport 67 -j NFQUEUE --queue-num 42.
ثم شغّل dhcpoptinj (لنشغله في المقدمة مع إخراج تصحيح إضافي): sudo dhcpoptinj -d -f -q 42 -o'52 01 04 46 6A 61 73'. لاحظ أن dhcpoptinj يجب أن يُشغّل بواسطة مستخدم لديه صلاحية CAP_NET_ADMIN. لست مضطرًا، ولا ينبغي حقًا، تشغيل dhcpoptinj كجذر. بدلاً من ذلك، يمكنك مثلاً منح صلاحية CAP_NET_ADMIN للملف الثنائي (باستخدام setcap) وتقييد حقوق التنفيذ لمستخدم أو مجموعة معينة فقط. هذه طريقة تُستخدم لتشغيل wireshark كغير جذر، لذا ستجد عدة أدلة تساعدك على تحقيق ذلك.
الآن أرسل حزمة DHCP إلى واجهة eth0 وشاهدها (باستخدام أداة مثل wireshark) وقد تم تعديلها عندما تصل إلى الواجهة المقرونة. يجب أن تحتوي على الخيار المحقون في نهاية قائمة الخيارات. إذا التقطت حزمة DHCP الواردة باستخدام Wireshark، فستظهر غير معدلة على الرغم من أنها في الواقع ستكون مشوهة.
لاحظ تنسيق الوسيطة للخيار -o: يجب أن تكون سلسلة سداسية عشرية تبدأ برمز خيار DHCP متبوعًا بحمولة الخيار. طول الخيار (البايت الذي يتبع عادة رمز الخيار) يُحسب تلقائيًا ولا يجب تحديده. يمكن فصل السلسلة السداسية العشرية بأحرف غير سداسية عشرية لتسهيل القراءة. جميع الخيارات يجب أن تحتوي على حمولة، باستثناء خيار الحشو الخاص (الرمز 0).
تخطيط الخيار غير المنطقي المستخدم في هذا المثال (أولاً تخطيط خيار DHCP، ثم تخطيط الخيار الفرعي لمعلومات وكيل الترحيل المحدد) هو كما يلي:
| الرمز | الطول | البيانات |
|---|---|---|
| 52 | (تلقائي) | 01 04 46 6A 61 73 ("Fjas") |
| الخيار الفرعي | الطول | البيانات |
|---|---|---|
| 01 | 4 | 46 6A 61 73 ("Fjas") |
لاحظ أن dhcpoptinj لا يهتم بما تكتبه في حمولات الخيارات، ولا يتحقق مما إذا كان رمز الخيار موجودًا. لكنه يمنعك من استخدام رمز الخيار 255 (خيار النهاية الختامي). يقوم dhcpoptinj بإدراج هذا الخيار كآخر خيار تلقائيًا.
dhcpoptinj -f -d -q42 -r -o'0C 66 6A 61 73 65 68 6F 73 74' -o'52 01 04 46 6A 61 73' -o 320A141E28
3 خيار(خيارات) DHCP للحقن (بإجمالي 25 بايت): 12 (0x0C) (اسم المضيف), 82 (0x52) (معلومات وكيل الترحيل), 50 (0x32) (طلب عنوان)
سيتم إزالة الخيارات الموجودة
تهيئة قائمة netfilter
تهيئة معالج الإشارات
اكتملت التهيئة. في انتظار الحزم لتشويهها في القائمة رقم 42
تم استلام 416 بايت
فحص حزمة DHCP بحجم 328 بايت من B6:40:FE:41:30:DC إلى 255.255.255.255:67
تشويه الحزمة
تم العثور على الخيار 53 (0x35) (نوع رسالة DHCP) DHCPREQUEST (نسخ)
تم العثور على الخيار 54 (0x36) (معرّف خادم DHCP) بحمولة 4 بايت 0A 14 1E 01 (نسخ)
تم العثور على الخيار 50 (0x32) (طلب عنوان) بحمولة 4 بايت 0A 14 1E 28 (إزالة)
تم العثور على الخيار 12 (0x0C) (اسم المضيف) بحمولة 12 بايت 33 31 36 64 65 39 31 34 64 61 62 34 (إزالة)
تم العثور على الخيار 55 (0x37) (قائمة المعلمات) بحمولة 13 بايت 01 1C 02 03 0F 06 77 0C 2C 2F 1A 79 2A (نسخ)
تم العثور على خيار النهاية (إزالة)
حقن الخيار 12 (0x0C) (اسم المضيف) بحمولة 9 بايت 66 6A 61 73 65 68 6F 73 74
حقن الخيار 82 (0x52) (معلومات وكيل الترحيل) بحمولة 6 بايت 01 04 46 6A 61 73
حقن الخيار 50 (0x32) (طلب عنوان) بحمولة 4 بايت 0A 14 1E 28
إدراج خيار النهاية
حشو بـ 10 بايت لتحقيق الحد الأدنى لحجم حمولة BOOTP
إرسال الحزمة المشوهة
dhcpoptinj موجود في Debian/Ubuntu. حزمة deb تحت التحكم في المصدر على salsa. يوصى بتثبيت dhcpoptinj من حزمة deb على إجراء التثبيت اليدوي التالي، لأنها تتضمن أيضًا صفحة دليل، قواعد إكمال bash، ملفات أمثلة إلخ.
تحتاج إلى cmake و libnetfilter_queue (ومترجم C يدعم C99). آملًا، أنت تستخدم نظامًا شبيهًا بـ Debian، وفي هذه الحالة يمكنك تشغيل ما يلي لتثبيتها: sudo apt-get install cmake libnetfilter-queue-dev.
git clone git://github.com/misje/dhcpoptinjcd dhcpoptinjmkdir build && cd buildcmake .. (أو cmake -DCMAKE_BUILD_TYPE=Debug .. إذا كنت تريد بناء تصحيح)make -j4sudo make installsudo make uninstall من دليل البناء الخاص بكيمكن حذف دليل البناء بكل محتوياته بأمان. إذا لم تستخدم دليل بناء، يمكنك التخلص من جميع مخلفات cmake عن طريق تشغيل git clean -dfx. لاحظ، مع ذلك، أن هذا يزيل كل شيء في دليل المشروع غير الخاضع للتحكم بالمصدر.
سيحاول dhcptopinj تحليل /etc/dhcpoptinj.conf أو الملف الذي تم تمريره باستخدام -c/--conf-file. بناء جملة ملف التكوين هو
المسافات اختيارية. أي شيء بعد ومن ضمن الحرف # يعتبر تعليقًا. يتم سرد خيارات DHCP واحدًا تلو الآخر كـ option=01:02:03. الاقتباسات حول سلسلة الخيار السداسية العشرية اختيارية، ويمكن فصل البايتات بأي عدد من الأحرف غير السداسية العشرية.
الخيارات version و help و conf-file غير مقبولة في ملف التكوين.
مثال:
# تشغيل في المقدمة:
foreground
# تفعيل إخراج التصحيح:
debug
# تجاوز اسم المضيف إلى "fjasehost":
option = '0C 66 6A 61 73 65 68 6F 73 74'
# إرسال معرف الوكيل "Fjas":
option = "52:01:04:46:6A:61:73"
# تجاوز طلب العنوان لطلب 10.20.30.40:
option=320A141E28
# استخدام القائمة رقم 12:
queue = 12
remove-existing-opt # إزالة الخيارات قبل الإدراج
من المفترض أن يكون هذا الملف القابلة للقراءة قد بدأك. تحقق أيضًا من صفحة الدليل (في حزمة deb) وإخراج المساعدة (dhcpoptinj -h)، والتي يجب أن تغطي كل ما تقدمه الأداة.
للأخطاء والاقتراحات، يرجى إنشاء مشكلة.
dhcpoptinj بسيط وسيبقى كذلك على أمل. ومع ذلك، فإن الميزات المفقودة التالية هي التي من المأمول إضافتها يومًا ما:
Failed to bind queue handler to AF_INET: Operation not permitted
على الأرجح ليس لديك صلاحية CAP_NET_ADMIN أو هناك عملية أخرى (ربما مثيل آخر من dhcpoptinj؟) مرتبطة بنفس رقم قائمة netfilter.
تسرب ذاكرة عند الخروج غير الطبيعي.
هذا لا يعتبر تسربًا. ومع ذلك، يجب ألا يكون هناك تسرب ذاكرة عند الخروج الطبيعي (القبض على SIGTERM أو SIGINT أو SIGHUP).
عند إنشاء قواعد iptables لاستخدامها مع dhcpoptinj، يمكن أن تكون الخيارات التالية مفيدة:
--queue-bypass
لا تقم بإسقاط الحزم، بل دعها تمر إذا كان dhcpoptinj لا يعمل (أو لا يستمع إلى رقم القائمة الصحيح).
إذا كان لديك أي اقتراحات، يرجى ترك مشكلة، وسأعود إليك. نرحب بمساهماتك وطلبات السحب محل تقدير كبير.
إذا وجدت dhcpoptinj مفيدًا، أحب أن أسمع ما تستخدمه من أجله. قم بتحديث صفحة الويكي ووصف استخدامك.
اخترت استخدام GPL لهذا المشروع. إذا كان ذلك لا يناسبك، اتصل بي، ويمكننا الاتفاق على ترخيص مختلف.