درباره DoH: دی‌ان‌اس + HTTPS

این اولین نوشته من در ویرگول هست. شدیداً پذیرای نظرات شما در قسمت کامنت‌ها هستم :)

اگر حوصله خوندن ندارید، خلاصه‌ای که در آخر اومده رو بخونید.

پروتکل DNS برخلاف بسیاری از پروتکل هایی که در دنیای وب کاربرد زیادی دارن، هنوز از رمزنگاری پشتیبانی نمی‌کنه. این یعنی کسی که به ترافیک اینترنت کاربری دسترسی داره، می‌تونه بدون زحمت خاصی ببینه که اون کاربر به چه سایت‌هایی می‌ره؛ یا حتی بدتر از این، می‌تونه ترافیک مربوط به DNS Query هاش رو دستکاری کنه! (حمله DNS Hijacking)

در بعضی از کشور ها، ISP ها برای اهداف خاصی از این حمله ها روی کاربران خودشون انجام می‌دن! یکی از این اهداف، فیلترینگ هست. به این صورت که وقتی یه کاربری DNS Query مربوط به یه سایت غیر‌مجاز رو ارسال می‌کنه، سرور DNS اون ISP، که به طور پیش‌فرض روی کامپیوتر اون کاربر تنظیم شده، یه آی‌پی الکی به کاربر برمی‌گردونه که هیچ ربطی به سایت مورد نظرش نداره و اونو به یه سایت دیگه می‌بره! مثلا تو ایران، این آی‌پی الکی، مربوط به سایت پیوندها هست. :)

در بیشتر موارد، استفاده از سرور DNS ای غیر از سرور پیشفرض ISP مشکل رو حل می‌کنه. اما مثلا در ایران، حتی عوض کردن DNS هم مشکلی رو حل نمی‌کنه! چون همونطور که بالاتر گفتیم، DNS رمزنگاری نمی‌شه و توسط کسی که به ترافیک اینترنت شما دسترسی داره قابل دستکاری هست؛ مثل ISP شما! درواقع اگر شما از هر سرور DNS دیگه‌ای هم استفاده کنید، باز ISP می‌تونه با دستکاری جواب Query ای که کامپیوتر شما فرستاده، شما رو باز به همون آی‌پی الکی برسونه.

تقریباً به تازگی، چیزی معرفی شده به نام DNS over HTTPS یا DoH؛ که کارش رمزنگاری کردن ترافیک DNS هست. نتیجش اینه که دیگه ترافیک DNS قابل دستکاری نخواهد بود! تو این نوشته می‌خوایم درباره این DoH بصورت مختصر آشنا بشیم.



کوئری های رمزگذاری نشده

اول از همه، می‌خوایم ببینیم کوئری های DNS چه شکلی ان. برای این کار، DNS سیستم رو تنظیم می‌کنیم روی مثلا 1.1.1.1: (می‌شه از DNS های دیگه هم استفاده کرد)

تنظیمات مربوط به شبکه در Linux و میزکار Gnome. دی‌ان‌اس روی 1.1.1.1 تنظیم شده.
تنظیمات مربوط به شبکه در Linux و میزکار Gnome. دی‌ان‌اس روی 1.1.1.1 تنظیم شده.

اینجا از Wireshark استفاده می‌کنم تا همه پکت‌هایی که بین کامپیوترم و اینترنت رد و بدل میشه (مثل پکت های مربوط به DNS Query ها) رو با جزئیات ببینم. حالا Wireshark رو باز می‌کنم و در مرورگر آدرس یه سایتی رو وارد می‌کنم؛ مثل virgool.io. وقتی به Wireshark برگردیم، پکت های مربوط به DNS Query ها رو می‌بینیم. یکی از اون‌ها، DNS Query مربوط به سایت ویرگول هست:

اون پایین محتویات خام پکت رو می‌بینید که چون رمزنگاری نشده آدرس سایت توش مشخصه. اون وسط هم آدرس و آی‌پی ویرگول که از سرور DNS گرفتیم رو می‌بینید.
اون پایین محتویات خام پکت رو می‌بینید که چون رمزنگاری نشده آدرس سایت توش مشخصه. اون وسط هم آدرس و آی‌پی ویرگول که از سرور DNS گرفتیم رو می‌بینید.


اما اگر همین کار رو برای یه سایت فیلتر شده مثل Youtube.com انجام بدم، به جای آی‌پی واقعی یوتیوب، به آی‌پی پیوندها می‌رسیم:

پکت مربوط به DNS Query یوتیوب؛ که آی‌پی پیوندها رو به جای آی‌پی یوتیوب در اون می‌بینیم!
پکت مربوط به DNS Query یوتیوب؛ که آی‌پی پیوندها رو به جای آی‌پی یوتیوب در اون می‌بینیم!

همونطور که می‌بینید، کوئری توسط ISP محترم دستکاری شد!

و حالا، DoH وارد می‌شود!

پروتکل DoH، چیزی شبیه همون DNS خودمون هست؛ با این تفاوت که ترافیک شما و سرور در اون رمزنگاری می‌شه. در این حالت، فقط سرور DNS و کاربر می‌تونن محتویات Query ارسال شده رو ببینن. نه ISP، و نه هیچ کس دیگه ای که ترافیک شما رو در کنترلش داره، نمی‌تونه ترافیک DNS شما رو حتی ببینه! چه برسه به این که بخواد دستکاریش کنه...

وقتی از DoH استفاده می‌کنیم. چون ترافیک رمز گذاری شده، WIreshark حتی نمی‌تونه تشخیص بده که این پکت مربوط به یه DNS Query هست! (برخلاف اسکرین‌شات های قبلی)
وقتی از DoH استفاده می‌کنیم. چون ترافیک رمز گذاری شده، WIreshark حتی نمی‌تونه تشخیص بده که این پکت مربوط به یه DNS Query هست! (برخلاف اسکرین‌شات های قبلی)


در DoH از پروتکل HTTPS استفاده می‌شه. HTTPS پروتکل امنی هست و داده‌ها توش رمزنگاری می‌شن. درواقع انگار کامپیوتر شما بجای اینکه خالی خالی (یا تکنیکی‌تر بخوایم بگیم، بصورت Plain Text) کوئری ها رو ارسال کنه، اون ها رو در قالب درخواست های HTTPS می‌فرسته که رمز نگاری می‌شن. عین وقتی که از یک سایت HTTPS بازدید می‌کنید. برای همین موضوع هست که به این پروتکل میگن DNS over HTTPS.

چجوری از DoH استفاده کنیم؟

الان که این متن رو می‌نویسم، متاسفانه DoH به طور پیشفرض در سیستم عامل های امروزی پشتیبانی نمی‌شه (البته گویا در Android Pie این قابلیت به طور پیش‌فرض وجود داره). اما راهکار هایی هست که DoH رو در کامپیوتر یا موبایلمون فعال کنیم:

  • در لینوکس و ویندوز: درباره DNSCrypt گوگل کنید. فکر می‌کنم نحوه راه اندازیش از حوصله این متن خارج هست.
  • در اندروید و iOS: کلاودفلر (CloudFlare) که دی‌ان‌اس معروف 1.1.1.1 مال این شرکت هست، اپلیکیشنی برای اندروید و iOS داره که می‌تونید باهاش بدون دردسر با استفاده از DoH به این DNS متصل بشید. (گوگل پلی | اپ استور). همچنین در اندروید، اپلیکیشن Intra می‌تونه با استفاده از DoH شما رو به دی‌ان‌اس های معروفی که از این پروتکل پشتیبانی می‌کنن وصل کنه.



خلاصه

پروتکل DNS یک پروتکل رمزنگاری نشده هست. به همین دلیل ترافیکش توسط ISP ها قابل دستکاری هست. در واقع ISP ها با دستکاری کوئری های DNS مربوط به سایت های غیر مجاز، شما رو به یه آی‌پی الکی می‌رسونن که مثلا می‌تونه مربوط به صفحه پیوندها باشه! حتی اگر از سرور DNS مربوط به ISP تون استفاده نکنید، باز هم ISP می‌تونه جواب کوئری هایی که از سرور میاد رو دستکاری کنه و شما رو به همون آی‌پی الکی ببره. DoH که مخفف DNS over HTTPS هست، با رمزنگاری ترافیک DNS تون، باعث می‌شه که دیگه نشه کوئری ها رو دستکاری کرد و فقط شما و سرور DNS از محتویات کوئری ها باخبر باشید. DoH از پروتکل HTTPS برای ارسال کوئری ها استفاده می‌کنه که این یعنی کوئری ها رمزنگاری می‌شن. استفاده از DoH روی اکثر سیستم عامل های امروزی به طور پیش‌فرض ممکن نیست. اما ابزار هایی برای سیستم عامل های کامپیوتر و موبایل وجود دارن که به شما امکان استفاده از DoH رو ‌می‌دن؛ که در متن اون‌ها رو معرفی کردیم.