درباره فیلترینگ اینترنت ایران


(سعی شده این مطلب ساده نوشته بشه که برای افراد غیر متخصص هم مفید باشه. پس اگر دیدید جایی دقت کافی رو نداره، بدونید برای سادگی به این شکل گفته شده)

بحث فیلترینگ و دخالت دولت ها تو اینترنت چیزی نیست که فقط تو ایران باشه. خیلی جاها نگران دخالت دولت/حکومت/سرویس‌دهنده/بقیه تو اینترنت هستن. این هایی که گفتم فقط می‌تونن تو اطلاعات رمزنگاری نشده دست ببرن. برای همین ssl و بعداً tls اومد که نمودش برای ما آدرس هاییه که با https شروع شده و ارتباط رو رمزنگاری می‌کنن و یکپارچگی ارتباط رو تضمین می‌کنن.

آدرس هایی که با https شروع میشن و امن هستن
آدرس هایی که با https شروع میشن و امن هستن


تقریباً میشه گفت هیچ راه ساده ای نیست که بشه توی اینجور آدرس ها دست برد. یا حداقل قبلاً راه ساده ای نبود.

حالا نمی‌خوام خیلی وارد ریزش بشم ولی در کل چند جای ارتباطات اینترنتی هست که هنوز رمزنگاری نشده مونده. یکی DNS ئه. توضیحش اینه که کامپیوتر یک کم با ما فرق می‌کنه. ما با آدرس راحتیم، کامپیوتر با IP. مثلاً وقتی شما مثلاً آدرس youtube.com رو می‌زنید، کامپیوتر اینو دوست نداره. دوست داره شما به جاش بهش 172.217.3.46 رو بگید که آدرس سرور گوگله که یوتوب هم روشه. حالا برای اینکه اینو بفهمه، مفهوم DNS بوجود اومد که در حقیقت یه چیزی تو مایه های ۱۱۸ خودمونه که زنگ می‌زنیم میگیم شماره فلانی که ساکن فلان جاست رو بده و اون شماره رو میده. تلفن ها هم به جای آقای فلانی، با شماره تلفن راحت تر هستن. حالا این DNS ها آدرس رو می‌گیرن و IP رو بر می‌گردونن.

حالا مشکل DNS اینه که رمزنگاری نشده س و وقتی آدرس youtube.com رو بپرسید، به راحتی حکومت شنودش می‌کنه و به جای IP سرور گوگل، براتون IP پیوند ها رو می‌فرسته.

صفحه ای که هم مون باهاش آشنا هستیم
صفحه ای که هم مون باهاش آشنا هستیم


برای حل شدن مشکل این بخش میشه dnscrypt.info رو نصب کرد که اون درخواست های DNS رو رمزنگاری می‌کنه و دیگه نمیشه شنودش کرد یا توش تغییرات ایجاد کرد. این رو نصب کنید، یه بخش بزرگی از مشکل فیلترینگ حل میشه. آموزشش نصبش از محدوده این نوشته خارجه اما برای ویندوز حداقل یه کلاینت سر راست داره که راحت میشه فهمید چجوری باید باهاش کار کرد. برای هر سیستم عامل و دستگای هم یه نسخه داره. حتا اگر مودم تون پشیبانی کنه می‌تونید روی مودم نصبش کنید که خب بهترین گزینه اینه اگر امکانش باشه.

حالا با فرض اینکه مشکل DNS حل شده، بخش رمزنگاری نشده دیگه آدرس هایی هستن که با https شروع نمیشن و دست دوستان بازه تا هر چیزی که دلشون می‌خواد رو توش پیدا کنن و تشخیص بدن که به جاش پیوند ها رو ببینید بهتره. مثلاً یه زمانی می‌خواستم فلش نصب کنم و اسم فایلش flashinstall.exe بود و فیلتر میشد چون توش lashi بود. ?‍♂️

راه حل اینجور صفحه ها فقط فیلترشکن های عادی خودمونه که با تشکر از حکومت، الان حتا اون پیرزنی که تو یه دهات دور افتاده تو یه اتاق خالی با یه لامپ نشسته هم می‌دونه چیه و داره ش.

اما بحث اصلیم صفحه هایی هست که با https شروع میشه و تقریباً الان کل وب داره ازش استفاده می‌کنه و خیلی سخته آدرسی رو پیدا کنی که فیلتر باشه و با https شروع نشه. حداقل برای من خیلی سخته براش مثالی بدم.
اینجور ارتباط های رمزنگاری شده تا یه مدت قبل به هیچ وجه قابل دستکاری نبودن ولی الان هستن. البته دستکاری نه، همونطور که گفتم https یکپارچی ارتباط رو تضمین می‌کنه. کاری که می‌تونن بکنن، قطع دسترسی به این سایت هاست. دلیل این ماجرا چیزیه به اسم SNI یا Server Name Indication که تو اولین مرحله ارتباط که رمزنگاری نشده س، آدرس سروری که بهش درخواست دادین رو می‌فرسته. دلیل داره واسه این کار ولی خب باعث شده آدرس سایت مورد نظرتون توسط دوستان قابل رویت باشه و بتونن توش خرابکاری کنن.
یعنی حکومت اول توافقات برای ارتباط و قبل از شروع رمزنگاری، آدرس youtube.com رو می‌بینه و تو توافقات و اصطلاحاً handshaking اختلال ایجاد می‌کنه و در نتیجه صفحه پیوند ها رو نمی‌بینید ولی چیز دیگه ای هم نمی‌بینید. ارور می‌بینید.

با ایجاد اختلال در handshaking ارتباط رمزنگاری شده، این صفحه رو می‌بینیم
با ایجاد اختلال در handshaking ارتباط رمزنگاری شده، این صفحه رو می‌بینیم


برای اثبات ادعام، از دستورهای openssl استفاده می‌کنم که کمک می‌کنه این نوع ارتباطات امن رو بررسی کنیم. تو حالتی که servername رو ننویسیم، اصلاً SNI رو نمی‌فرسته و می‌بینید که ارتباط کامل و بدون مشکل انجام میشه

ارتباط بدون دستکاری بدون ارسال SNI
ارتباط بدون دستکاری بدون ارسال SNI


حالا اگر servername رو بهش بدم و همون youtube.com رو بدم، می‌بینید که ارتباط با مشکل مواجه میشه. یعنی حکومت دیده می‌خوام به یوتوب وصل بشم و ارتباطم رو مختل می‌کنه

ارتباط دستکاری شده با ارسال SNI
ارتباط دستکاری شده با ارسال SNI


حالا اگر چیزی که توی SNI می‌فرستیم چرت و پرت باشه چی؟ اگه همینجوری الکی بهش chiztube.com بدم، می‌بینید که به زیبایی میاد. البته این خیلی اشتباهه و اکثر سرور ها نباید به این جواب درستی بدن یا باید گواهی‌نامه پیشفرض شون رو بدن ولی یوتوب پسر خوبی بود و جواب داد. می‌بینید که ادعام با این اثبات میشه

ارتباط بدون دستکاری با ارسال SNI بی ربط و فیلتر نشده
ارتباط بدون دستکاری با ارسال SNI بی ربط و فیلتر نشده


خب حالا چاره چیه؟ نمی‌دونم. راه اصلی اینه که منتظر TLS های ورژن 1.3 و 1.4 باشیم که SNI رو رمز میکنه. (البته مثکه توی TLS 1.3 خبری از این قضیه نیست)

راه دیگه اینه که SNI رو غیر فعال کنیم که الان کار سختیه. مثلاً قبلاً ایشون یه پلاگین برای فایرفاکس نوشته بودن که غیرفعالش می‌کرد

http://madynes.loria.fr/Research/Software#toc2

اما خب قدیمیه و الان دیگه کار نمی‌کنه.
راه دیگه اینکه که دست به کار شیم و خودمون براش کد بنویسیم که SNI رو همه جا موقتاً غیر فعال کنیم. بله، می‌دونم که با غیر فعال شدن SNI بعضی از سایت ها دیگه درست کار نمی‌کنن و گواهی‌نامه اشتباه میدن و بلا بلا بلا، ولی خب چاره چیه؟ این مشکل ها رو میشه سمت سرویس گیرنده چشم پوشی کرد و ارتباط رو ادامه داد.

این بخشیه که از دوستان دولوپر می‌خوام که پاچه هاشونو بزنن بالا و وارد این کثافت بشن و درستش کنن.

مچکرم


پ.ن. کله گنده ها دارن روش سعی می‌کنن https://twitter.com/grittygrease/status/1018566026320019457


پ.پ.ن. به نظر میاد کلادفلر داره یه حرکت هایی می‌زنه

https://blog.cloudflare.com/encrypted-sni/


پ.پ.پ.ن. کلادفلر حرکت قبلی رو بی‌خیال شده و دنبال حرکت جدیدیه:

https://blog.cloudflare.com/encrypted-client-hello/

که قراره در فایرفاکس ۸۵ اضافه بشه:

https://blog.mozilla.org/security/2021/01/07/encrypted-client-hello-the-future-of-esni-in-firefox/