بررسی سانسور اینترنت از طریق کاوشگر OONI

بررسی سانسور اینترنت از طریق کاوشگر OONI #

ooni-logo

OONI و یا Open Observatory of Network Interference، ترجمه شده به فارسی: «رصد خانه آزاد دخالت در شبکه»، یک پروژه ی نرم افزاری متن باز و آزاد با هدف توانمند سازی تلاش های غیرمتمرکز در افزایش شفافیت سانسور اینترنت در سراسر جهان است. OONI یک سَمَن یا سازمان غیردولتی است که توسط پروژه ی Tor راه اندازی شد و اکنون به صورت نیمه مستقل فعالیت می کند.

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

ooni mobile

ooni desktop

به صورت پیشفرض این اطلاعات با حفظ حریم خصوصی کاربران، برای سرور OONI ارسال می شوند. اطلاعات دریافتی در سرور دوباره پردازش می شوند و در اکثر مواقع در کمتر از یک دقیقه در بخشی به نام Explorer تحت وب در دسترس همگان خواهد بود.

ooni explorer

از سال 2012 تاکنون از بیش از 200 کشور نتایج اندازه گیری دریافت کرده.

چگونگی کارکرد تست Websites #

در Probe های OONI بخشی به نام Websites وجود دارد که در حال حاضر می تواند آدرس های http:// و https:// را مورد آزمایش قرار دهد. این تست که با اسم Web connectivity شناخته می شود به این صورت کار می کند که ابتدا یک بار آدرس درخواستی را از طریق backend خود مورد آزمایش قرار می دهد تا از فعال بودن آن اطمینان حاصل کند و همچنین جواب DNS و محتوای دریافتی در backend را با DNS و محتوای دریافتی در شبکه ی مورد تست مقایسه کند. به این معنی که اگر پاسخ تست ای، Anomaly و یا Confirmed بوده است، تست در backend و خارج از شبکه در همان لحظه با موفقیت انجام شده است. این مسئله صحت نتیجه در مورد وجود سانسور را تضمین می کند.

به صورت پیشفرض این تست از لیست آدرس هایی استفاده می کند که توسط CitizenLab ساخته شده و هر کسی میتواند در بهبود آن مشارکت داشته باشد. در هر کشور دو لیست مورد استفاده قرار میگیرد که یک لیست اختصاصی آن کشور و یک لیست جهانی است. در زمان نوشتن این مقاله این دو لیست شامل 2242 آدرس است.

باید توجه داشته باشید که این لیست سایت هایی نیست که احتمال سانسور شدن آنها زیاد است. می توان گفت که این لیست ای از سرویس های پر استفاده است. اما نه لیست ای که توسط سرویس هایی مانند Alexa معرفی می شود، چون در بسیاری از کشور ها، مردم از ابزار های حفظ حریم خصوصی همانند VPN ها استفاده می کنند و یا در کشورهایی مثل ایران، اکثر سرویس های پراستفاده ی مردم، مسدود یا تحریم هستند و کاربر نمی تواند به صورت مستقیم به آنها دسترسی پیدا کند.

تست های پیشفرض در این بخش، به صورت پیشفرض فقط 90 ثانیه اجرا می شوند که از بخش تنظیمات این مقدار قابل تغییر است.

مقدار 0 برابر با انجام اندازه گیری تمام آدرس های لیست پیشفرض است.

البته این امکان وجود دارد تا آدرس ها و یا آدرس های سفارشی خودتان را نیز بدون نیاز به ثبت در لیست پیشفرض در شبکه ی خود و یا دوستانتان تست کنید. برای این کار دو روش وجود دارد:

  • وارد کردن مستقیم لیست در اپ ها
  • ایجاد لیست تست سفارشی

وارد کردن مستقیم آدرس های سفارشی در نرم افزار #

برای انجام این کار به صورت درون برنامه ای، وارد بخش Websites شوید و بر روی دکمه ی Choose websites و یا «انتخاب وبسایت ها» کلیک کنید :

OONI mobile webconnectivity first page

OONI mobile webconnectivity first page

آدرس های مورد نظر خود را وارد کنید. و در انتها دکمه ی Run در پایین صفحه را بزنید.

OONI mobile webconnectivity add urls page

OONI desktop webconnectivity add urls page

و در انتها بر روی دکمه ی Run و یا اجرا کلیک کنید تا اندازه گیری آغاز شود.

در نسخه ی cli، برای دفعه ی اول، ابتدا باید شرایط استفاده را بخوانید و در صورت موافقت، تایید کنید:

> .\ooniprobe.exe

سپس لیست انتخابی خود را به این صورت اجرا کنید:

> .\ooniprobe.exe run websites --input=https://yahoo.com/ --input=https://yimg.com/

OONI cli

در این حالت نتیجه ی هر تست و تفاوت ها به صورت لحظه ای نشان داده می شود.

ایجاد لیست تست سفارشی #

برای اینکه یک لیست سفارشی داشته باشید که بتوانید با دیگران به اشتراک بگذارید، می توانید به این آدرس رجوع کرده: https://run.ooni.io/

OONI run web

بعد از اضافه کردن آدرس های دلخواه از طریق دکمه ی Add URL دکمه ی Generate را بزنید.

OONI run web generate

آدرس داده شده را کپی کرده و از طریق شبکه های اجتماعی برای دیگران بفرستید.

OONI share social network

کاربران در موبایل می توانند فقط با زدن بر روی لینک، اپ OONI Probe را انتخاب کرده:

OONI open shared social network

و با زدن دکمه ی Run اندازه گیری را شروع کنند.

OONI run mobile

آنالیز نتایج #

آنالیز نتایج OONI بسیار ساده و آسان است. شما نیاز به داشتن دانش فنی برای درک وجود سانسور یا نبود آن ندارید. به عنوان مثال در این تصویر:

OONI mobile websites test results

از 7 مورد آزمایش شده، دو مورد را با اطمینان می توان گفت که ارتباطشان به دلیلی در آن لحظه مسدود شده است و چهار مورد در دسترس بودند.

همچنین یک مورد با رنگ خاکستری است که سه دلیل شایع می تواند داشته باشد:

  • غیرفعال بودن سایت مورد تست
  • قطع شدن لحظه ای اینترنت کاربر در زمان انجام آن تست
  • وجود باگ یا ناتوانی در تحلیل

توضیحات آن نیز به این صورت است که علاوه بر مشاهده ی توضیحات بیشتر می توانید با زدن بر روی دکمه ی Try Again، دوباره اقدام به تست آن یک آدرس کنید:

OONI mobile websites failed test again

آنالیز ساده ی نتایج #

برای بررسی دقیقتر، در توضیحات هر نتیجه، دلیل آنها بیان شده است. چند مورد را که ممکن است بیشتر با آنها مواجه شوید در ادامه توضیح داده خواهد شد.

HTTP blocking (a blockpage might be served) #

OONI result HTTP blocking blockpage served

در این تست احتمال می رود که ممکن است صفحه ی مربوط به سانسور به جای صفحه ی اصلی دریافت شده باشد. این اتفاق فقط در ارتباط های غیر رمزنگاری شده و مخصوصا HTTP ممکن است. در این حالت چهار دلیل ممکن است:

  • دریافت خطای 503، که خود نوعی سانسور است (در بخشی های بعدی توضیح داده خواهد شد)
  • حساسیت به آدرس سایت در بخش Host ارتباط HTTP
  • حساسیت به Request URI یا همان ادامه ی آدرس بعد از Hostname. (در این تست فقط / هست و حاوی path نیست.)
  • حساسیت به یک کلمه در محتوای آن سایت.

DNS tampering #

OONI result DNS tampering

در این تست احتمال می رود که یک IP ی جعلی دریافت شده است. در این حالت، این ارتباط از طریق دستکاری DNS مسدود شده است.

TCP/IP based blocking #

OONI result tcp ip blocking

در این تست، عمل TCP Handshake انجام نشده. که ممکن است به دلیل وارد سیاهچاله شدن ارتباط باشد و یا ارسال packet های RST از سوی سیستم سانسور. در این حالت، IP مسدود شده است.

HTTP blocking (HTTP requests failed) #

OONI result HTTP blocking failed

در این تست TCP Hnadshake انجام شده است (IP مسدود نیست) اما بعد از آن ناموفق بوده است. این خطا ممکن است در هر دو ارتباط HTTP و HTTPS مشاهده شود. (در نسخه ی فعلی)

آنالیز پیشرفته ی نتایج #

برای آنالیز پیشرفته تر، در نرم افزار های OONI این امکان وجود دارد تا دیتای جمع آوری شده از هر تست را ببینید.

OONI android result menu

این دیتا از طریق آدرس اختصاصی Explorer نیز در دسترس است.

OONI explorer result data

در این دیتا، اطلاعات کلی و جزئیِ هر اندازه گیری به صورت مجزا وجود دارد.

توضیح بعضی از بخش ها:

probe_ip #

مقدار probe_ip که برابر با IP کاربر است. برای حفظ حریم خصوصی، به صورت پیشفرض در سمت کلاینت به 127.0.0.1 تغییر داده می شود.

resolver_ip #

مقدار resolver_ip برابر IP سرور ای است که کاربر احتمالا* در این تست از آن استفاده کرده است. این مقدار با درخواست DNS مستقل به آدرس whoami.akamai.net محاسبه می شود. به صورت زیر:

Akamai DNS resolver information whoami طراحی شده با draw.io

[*] به دلیل مستقل بودن هر درخواست، در برخی شبکه ها و در بعضی شرایط، ممکن است که دو درخواست، از دو DNS سرور متفاوت درخواست شوند. اگر:

  • کاربر در تنظیمات DNS خودش، سرور دوم را از یک سرویس دهنده ی متفاوت استفاده کند.
  • اگر ISP به صورت random از سرور های متفاوتی برای resolve کردن استفاده کند. (به عنوان مثال: DNS پیشفرض همراه اول)

test_keys #

دیتای اصلی هر تست، در بخش test_keys قرار دارد:

OONI result data test keys

توضیحات در مورد زیرمجموعه های test_keys:

network_events #

بخش network_events شامل رویداد های ارتباطی مابین کلاینت و سرور است. ساده تر از چیزی که با capture کردن packet ها به دست می آوریم. برای اینکه ببینیم که مسدود شدن بعد از Client hello بوده است و یا بعد از TLS handshake.

OONI result data network events

در اینجا زمانی که TLS handshake شروع شد و write انجام داده است (معادل Client hello)، جواب دریافتی reset بود. (معادل packet های RST یا RST,ACK). بدان معنی که سیستم سانسور با مواجه شدن مقدار SNI در Client Hello، از ادامه ی ارتباط جلوگیری کرده است.

tls_handshakes #

بخش tls_handshakes شامل certificate هایی است که در هر بار request از سرور دریافت می شود. (در Server Hello)

OONI result data tls handshakes

در صورت حمله ی MITM این دیتا بسیار مفید خواهد بود. و در صورت خطا در زمان TLS handshake، توضیح آن بیان می شود:

OONI result data tls handshakes error

queries #

بخش queries شامل درخواست های DNS و جواب های دریافت شده می شود:

OONI result data queries

همچنین در این بخش، در همان لحظه، IP های دریافتی بررسی می شوند که متعلق به کدام شبکه هستند.

dns_consistency #

بخش dns_consistency مربوط می شود به یکسان بودن و یا نبودن جواب DNS در تست انجام شده در سرور OONI و در این شبکه ی فعلی در همان لحظه.

control #

بخش control مربوط می شود به تست های انجام شده در سرور OONI که همزمان صورت می گیرد.

OONI result data control

(در مورد موارد درون این بخش در ادامه توضیح داده نخواهد شد. به دلیل تکراری بودن با مواردی که در خود شبکه در حال تست است. و همچنین نبود سانسور در این شبکه ی سرور OONI.)

tcp_connect #

بخش tcp_connect مربوط می شود به تست TCP handshake تمام IP هایی که از درخواست DNS به دست آمد.

OONI result data tcp connect

requests #

بخش requests مربوط می شود به درخواست ها و جواب هایی که در سطح HTTP انجام می شوند.

OONI result data requests error

در اینجا از ادامه ی ارتباط جلوگیری شده. به این معنی که احتمالا سیستم سانسور بعد از مشاهده ی مقدار Host در packet ارسالی یک packet با پرچم حاوی RST برای کاربر ارسال کرده است.

OONI result data requests

در اینجا جوابی با iframe از صفحه ی سیستم سانسور جمهوری اسلامی بازگردانده/تزریق شده.

موارد بیشتر #

بخش های دیگر نیز نسبت به HTTP و یا HTTPS بودن ارتباط متفاوت است.

به عنوان مثال، در اینجا نشان می دهد که تبادل HTTP در HTTPS به درستی انجام نشده است:

OONI result data match HTTPS reset

و یا مقادیر دو تست درون و بیرون شبکه در ارتباط HTTP یکسان نیست:

OONI result data match HTTP different

تشخیص تحریم #

یکی از سوال های مهم که در هر بار عدم دسترسی به سرویس ای یک ایرانی از خودش می پرسد این است که «آیا این سایت فیلتر شده و یا تحریم؟» برای پاسخ به این سوال نیز می توان از OONI کمک گرفت. چرا که علاوه بر اینکه موارد زیادی را آنالیز می کند، همزمان هم در شبکه ی فعلی و هم از طریق سرور backend، اتصال به آدرس مورد نظر را بررسی و مقایسه می کند.

اگر آدرس وارد شده HTTPS باشد، به دلیل اینکه توسط شخص ناشناس قابل دستکاری نیست، نتیجه قابل اعتمادتر خواهد بود. در ادامه یک آدرسی را که به دلیل استفاده از کلاد گوگل در ایران قابل استفاده نیست را به صورت نمونه بررسی می کنیم.

OONI result data sanction ok

در نتیجه ی آنالیز می بینیم که به رنگ سبز است و این یعنی مشکلی در ارتباط وجود ندارد.

OONI result data sanction failure null

در بخش Failure نیز می بینیم که تمام آنها null هستند و این یعنی هیچ دستکاری ای در شبکه انجام نشده است.

OONI result data sanction control

در بخش داده ها و در زیرمجموعه ی control می بنیم که مقدار عنوان درست است و همینطور کد دریافتی برابر با 200 است. که این یعنی سرور سایت به شبکه ای دیگر در خارج از کشور به درستی جواب می دهد.

OONI result data sanction response

اما در بخش requests کد دریافتی و همچنین response دارای مقدار متفاوتی است.

کد 403 و گاهی کد 404 اگر در این شرایط گفته شده (ارتباط HTTPS و متفاوت با نتیجه ی خارج از کشور) باشد، به معنای تحریم است.

همچنین در انتهای بخش test_keys مقایسه هایی صورت میگیرد که نتیجه ی کلی از تمام موارد گفته شده در بالا را نشان می دهد.

OONI result data sanction match

ذکر این نکته مهم است که طی یک سال اخیر مورد ای از تحریم مشاهده نشده که بدون نمایش خطای 403 و یا 404 در ارتباط HTTPS از درخواست ها به دلیل تحریم جلوگیری کنند. در نتیجه اگر نتیجه غیر از سبز بود، احتمالا سایت به طریقی در شبکه ی شما سانسور شده است.

تنظیم داخلی فیلترشکن فقط برای ارتباط با backend #

به دلیل سانسور های دسته ای سرویس ها در ایران و بدون در نظر گرفتن عواقب آن و زیر پا گذاشتن حق‌الناس توسط حکومتی که مدعی آن است، ارتباط با سرور OONI در موبایل، به دلیلی که در بخش «شناسایی مسدود شدن از طریق fingerprint» توضیح داده شد، امکان پذیر نیست.

OONI probe service failed

برای حل این مشکل، تیم OONI دو تغییر مهم ایجاد کردند:

  • تغییر TLS fingerprint برای تقلید fingerprint مرورگر
  • اضافه کردن بخش Proxy برای ارتباط با backend

برای فعال کردن proxy، به بخش تنظیمات رفته و OONI backend Proxy را انتخاب می کنیم:

OONI android settings backend proxy

در این بخش (در زمان نوشتن این مقاله) سه گزینه ی اصلی داریم: از هیچ proxy ای استفاده نشود از Psiphon استفاده شود از یک Proxy شخصی استفاده شود. (در حال حاضر فقط SOCKS5)

OONI android backend proxy settings

تنظیماتی که در تصویر می بینید (127.0.0.1:9050) متعلق به SOCKS5 ای است که توسط Orbot ایجاد می شود.

Orbot connected SOCKS5

توجه داشته باشید که برای استفاده از OONI، نباید حالت VPN فعال باشد. اگر از Tor Browser استفاده می کنید، port آن برای SOCKS5 برابر با 9150 است.

بعد از فعال کردن یکی از این گزینه ها. ارتباط با backend توسط آن proxy صورت می گیرد اما تست ها از طریق خود شبکه:

OONI android runnig test with Psiphon as proxy

در تصویر می بینید که ابتدا به Psiphon متصل می شود.

OONI android measurement result page

اما تست ها از طریق شبکه ی کاربر انجام می شود.

داده کاوی در داده های نتایج OONI #

اگر قصد دارید که نتایج OONI را بیشتر از چیزی که در Explorer مشاهده می کنید، بررسی و آنالیز کنید، این امکان فراهم است تا بتوانید تمام داده ها را از سرویس عمومی S3 آمازون مخصوص OONI به صورت دسته بندی شده به تاریخ، کشور، نوع تست و ساعت دریافت کنید.

به عنوان مثال در ادامه، تمام نتایج مربوط به تست webconnectivity را از طریق ابزار aws cli دانلود می کنیم:

aws --no-sign-request s3 sync --exclude '*' --include '*/IR/webconnectivity/*.jsonl.gz' 's3://ooni-data-eu-fra/raw/' ./ooni-data-iran

OONI s3 download IR webconnectivity data

حجم این نتایج برای هر روز متغیر است:

du -h --max-depth=0 ./ooni-data-iran/202106*

OONI s3 downloaded webconnectivity data size

و بیشترین اندازه را در روز می توان نزدیک به 150 مگابایت در نظر گرفت.

du -h --max-depth=1 ./ooni-data-iran | sort -hr

OONI s3 downloaded webconnectivity data size sort

البته داده این داده ها فقط مربوط به تست webconnectivity بودند.

برای دانلود تمام نتایج، به عنوان مثال در روز 22 ماه May به این صورت عمل می کنیم:

aws --no-sign-request s3 sync --exclude '*' --include '*/IR/*.jsonl.gz' 's3://ooni-data-eu-fra/raw/20210522' ./ooni-data-iran

OONI s3 download all data IR

که کل حجم آن برابر است با 137 مگابایت.

$ du -sch 
137M    .
137M    total

این فایل ها با نسبت حدود 80٪ فشرده سازی شده اند.

$ gzip -l *
         compressed        uncompressed  ratio uncompressed_name
            2277712            12444162  81.7% ./2021052222_IR_webconnectivity.n0.0.jsonl

به عنوان مثال یک فایل حدود 2 مگابایتی، بعد از decompress کردن حدود 12 مگابایت فضا را اشغال خواهد کرد.

$ ls -shi
total 15M
1082  12M 2021052222_IR_webconnectivity.n0.0.jsonl
1071 2.2M 2021052222_IR_webconnectivity.n0.0.jsonl.gz

در این فایل ها، هر خط جدید شامل یک نتیجه ی مجزا می شود:

OONI s3 downloaded webconnectivity data content

یک طرح ساده از مورد استفاده شده از داده های NDT ی OONI را می توانید در اینجا ببینید:

برای دریافت توضیحات بیشتر در این رابطه، می توانید متن OONI در مورد داده کاوی نتایج را مطالعه کنید.