
مصدر الصورة
DNS (Eng. Domain Name System - نظام أسماء النطاقات) - نظام كمبيوتر موزع للحصول على معلومات حول المجالات.
TLS ( بروتوكول أمان طبقة النقل ) - يوفر نقل آمن للبيانات بين عقد الإنترنت.
بعد الأخبار "تشغيل Google Public DNS بهدوء DNS على دعم TLS" قررت أن أجربه. لدي Stunnel التي ستنشئ نفق TCP مشفر. لكن البرامج تتواصل عادةً مع DNS باستخدام بروتوكول UDP . لذلك ، نحتاج إلى وكيل يقوم بإعادة توجيه حزم UDP من وإلى دفق TCP. سنكتبها على لوا .
الفرق بين حزم TCP و UDP DNS:
4.2.2. استخدام TCP
تستخدم الرسائل المرسلة عبر اتصالات TCP منفذ الخادم 53 (عشري). تكون الرسالة مسبوقة بحقل بطول 2 بايت يعطي طول الرسالة ، باستثناء حقل بطول 2 بايت. يسمح حقل الطول هذا للمعالجة منخفضة المستوى بتجميع رسالة كاملة قبل البدء في تحليلها.
RFC1035: أسماء النطاقات - التنفيذ والمواصفات
أي أننا نفعل هناك:
- نأخذ حزمة من UDP
- أضف إليها في البداية بضع بايتات حيث يشار إلى حجم هذه الحزمة
- الإرسال إلى قناة TCP
وفي الاتجاه المعاكس:
- نقرأ بضع بايتات من TCP ، نحصل على حجم الحزمة
- نقرأ حزمة من TCP
- إرساله إلى المستلم عبر UDP
تخصيص Stunnel
- قم بتنزيل شهادة الجذر Root-R2.crt في الدليل بتكوين Stunnel
- تحويل الشهادة إلى PEM
openssl x509 -inform DER -in Root-R2.crt -out Root-R2.pem -text
نكتب في stunnel.conf:
[dns] client = yes accept = 127.0.0.1:53 connect = 8.8.8.8:853 CAfile = Root-R2.pem verifyChain = yes checkIP = 8.8.8.8
أي ستونيل:
- سيقبل TCP غير المشفر في 127.0.0.1:53
- سيفتح نفق TLS مشفر لمعالجة 8.8.8.8:853 (Google DNS)
- سينقل البيانات ذهابا وإيابا
إطلاق Stunnel
يمكن التحقق من تشغيل النفق باستخدام الأمر:
nslookup -vc ya.ru 127.0.0.1
يفرض الخيار -vc nslookup على استخدام اتصال TCP بخادم DNS بدلاً من UDP.
النتيجة:
*** Can't find server name for address 127.0.0.1: Non-existent domain Server: UnKnown Address: 127.0.0.1 Non-authoritative answer: Name: ya.ru Address: ( IP )
كتابة السيناريو
أكتب في لوا 5.3 . العمليات الثنائية مع الأرقام متاحة بالفعل فيه. حسنًا ، سنحتاج إلى وحدة Lua Socket .
اسم الملف: simple-udp-to-tcp-dns-proxy.lua
local socket = require "socket"
--[[--
دعنا نكتب وظيفة بسيطة تسمح لك بإرسال حزمة تفريغ إلى وحدة التحكم. أريد أن أرى ما يفعله الوكيل.
--]]--
function serialize(data)
--[[--
UDP إلى TCP والعودة
نكتب وظيفتين ستعمل مع قناتين لنقل البيانات.
--]]--
--[[--
تقوم كلتا الوظيفتين بتنفيذ coroutine.yield () مباشرة بعد الإطلاق. يسمح لك هذا بتمرير معلمات الوظيفة إلى المكالمة الأولى ثم القيام بـ coroutine.resume (co) بدون معلمات إضافية.
الرئيسية
والآن الوظيفة الرئيسية التي ستحضر وتبدأ الحلقة الرئيسية.
--]]--
function main() local tcp_dns_socket = socket.tcp()
--[[--
نطلق الوظيفة الرئيسية. إذا تم إغلاق الاتصال فجأة ، فبعد ثانية سنقوم بتأسيسه مرة أخرى عن طريق الاتصال الرئيسي.
--]]--
repeat local ok, err = coroutine.resume(coroutine.create(main)) -- main if not ok then print(err) end socket.sleep(1) -- until false
تحقق
تشغيل Stunnel
قم بتشغيل البرنامج النصي الخاص بنا
lua5.3 simple-udp-to-tcp-dns-proxy.lua
تحقق من عملية البرنامج النصي باستخدام الأمر
nslookup ya.ru 127.0.0.1
هذه المرة ، بدون "-vc" ، هذه هي الطريقة التي كتبنا بها وبدءنا الوكيل ، الذي يلف طلبات UDP DNS في نفق TCP.
النتيجة:
*** Can't find server name for address 127.0.0.1: Non-existent domain Server: UnKnown Address: 127.0.0.1 Non-authoritative answer: Name: ya.ru Address: ( IP )
إذا كان كل شيء على ما يرام ، يمكنك تحديد إعدادات الاتصال كخادم DNS "127.0.0.1"
الاستنتاج
الآن محمية استعلامات DNS الخاصة بنا بواسطة TLS .
بعد الاتصال مباشرة ، يحاول Windows تسجيلنا على خوادم DNS الخاصة بـ Google عبر نفقنا. تم تعطيل هذا في إعدادات DNS المتقدمة عن طريق إلغاء التحديد.

لا يزال هناك طلب لموقع time.windows.com. لم يعد شخصيًا بعد الآن ، لكنني لم أجد أبدًا كيفية إيقاف تشغيله. تم تعطيل المزامنة التلقائية للوقت.
الروابط
- RFC1035: أسماء النطاقات - التنفيذ والمواصفات
- DNS عبر TLS
- simple-udp-to-tcp-dns-proxy.lua
- إنشاء استعلام DNS يدويًا