آشنایی و نحوه کلی کار با هسته Xray و نوشتن کانفیگ برای آن

آشنایی و نحوه کلی کار با هسته Xray و نوشتن کانفیگ برای آن

سیفون

پروژه Xray، برای عبور از فیلترینگ و دیواره آتش بزرگ چین (GFW) طراحی شده. با کمک xray میتونید بر روی پلتفرم های مختلف پروکسی راه اندازی کنید. لیست کلاینت ها با رابط کاربری گرافیکی رو میتونید از اینجا ببینید.


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

https://github.com/xtls/xray-core

https://xtls.github.io/en/config/

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

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

https://github.com/xtls/xray-core#installation

 توجه داشته باشید که خود xray-core رابط گرافیکی نداره و باید با command line / terminal باهاش کار کنید.

شاید براتون سوال پیش بیاد که چرا از ابزار های آماده ای که بهشون اشاره کردیم استفاده نمیکنیم. مگه مرض داریم؟ خیر. اگر شما چهارچوب تنظیمات xray رو متوجه بشید، عیب یابی اتصالاتتون خیلی راحت تر میشه. در ضمن همه جا نمیتونید از این اسکریپت ها استفاده کنید (مثل کانتینتر آروان) و مجبور میشید کانفیگتون رو خودتون بنویسید. علاوه بر همه اینها، کارکردن با پروژه ها و ابزار های مشابه (sing-box و bepass و...) خیلی راحت تر میشه. برای استفاده از فرگمنت هم مجبورید خودتون تنظیماتش رو دستی وارد کنید. اینکه فرگمنت چیه و به چه دردی میخوره رو بعدا در موردش میخونیم.


فایل متناسب با سیستم عامل و معماری کامپیوترمون رو از مخزن رسمی دانلود میکنیم. اگر ویندوز نصب دارید و سیستمتون مربوط به دو دهه اخیره، باید فایل Xray-windows-64.zip رو از قسمت Releases (سمت راست صفحه) دانلود کنید.

فایل اصلی که باهاش کار داریم xray.exe هست. دو فایل geoip.dat و geosite.dat مربوط به یکسری قوانین خاص routing هستند که اگر ازشون استفاده کنید، این دو تا رو لازم دارید. اینجا باهاشون کاری نداریم. فایل wxray.exe هم مخصوص ریلیز ویندوز هست ولی به دردمون نمیخوره.

میتونیم محل فایل باینری (xray.exe) رو به متغیر محیطی path اضافه کنیم یا cmd رو تو اون دایرکتوری باز کنیم. اگر این جمله رو متوجه نشدید نادیده بگیریدش. اگر ویندوز 11 دارید میتونید راست کلیک > open in terminal رو بزنید، در غیر این صورت مثل تصویر (وارد فولدری که xray.exe قرار داره بشید و) تو navbar بنویسید cmd و اینتر رو بزنید.

با وارد کردن دستور “xray.exe help” در cmd، میتونید فرامین مختلف مورد قبول برنامه رو ببینید. به عنوان مثال با “xray.exe uuid” میتونید یک uuid جدید درست کنید.

دستوری که باهاش کار داریم، “xray.exe run -c config.json” هست. البته پارامتر پیشفرضش همین config.json هست، یعنی اگر کانفیگی با این اسم دارید، نوشتن xray.exe run کفایت میکنه. میریم برای نوشتن کانفیگ.

در این رشته با قالب JSON آشنا شدیم. همون طور که مشاهده میکنید، کانفیگ های xray همچین ساختاری دارند. برای اتصال، شما حداقل به دو آرایه inbounds و outbounds نیاز دارید.

همونطور که از اسمش پیداست، inbounds مربوط به کانکشن های ورودی و outbounds مربوط به کانکشن های خروجیمون میشه. به عبارت دیگه اگر بخوایم مثلا به یک نود (node) VLESS وصل بشیم، سمت کلاینت (خودمون) باید یک کانکشن VLESS در قسمت outbounds (خروجی از xray) و یک کانکشنی که بتونیم بهش وصل شیم (مثل socks)، سمت inbounds (ورودی به xray) تعریف کنیم. چرا socks؟ چون از معدود پروتکل هایی هست که ویندوز میتونه ازش استفاده کنه.

حالا سمت سرور چی؟ باید یک کانکشن vless در قسمت inbounds و یک شی (object) با پروتکل freedom تو قسمت outbound تعریف کنیم. Freedom دیگه چیه؟ خروجیمونه که پکت هامونو میرسونه به مقصد. نکته خیلی خاصی نداره. چیزی که من متوجه شدم اینه که، چون وقتی به سرور خارجیتون وصل شین، به اینترنت آزاد وصل شدید، برادران چینی مون هم به خاطر همین اسمشو گذاشتن freedom (به معنای آزادی).

رایج ترین پروتکل های پروکسی، VMess و VLESS هستند. VLESS بر خلاف VMess رمزنگاری نداره و برای همین نسبت به VMess سبکتره و احتیاجی به تنظیم بودن ساعت نداره. اگر از VLESS استفاده میکنید، باید این رمزنگاری تو لایه transport اتفاق بیفته، در غیر این صورت تمامی اطلاعاتی رد و بدل شده، برای هرکسی که بین شما و مقصد باشه، قابل خوندن و تغییره(؟). البته در مواردی مانند استفاده از cdn داخلی، همچنان توصیه نمیشه.

در مورد transport هم بگم که اینجا فقط با وب سوکت (ws) کار میکنیم. اگر سرور شخصی دارید و میخواید بهش به طور مستقیم وصل بشید، بهتره برید بقیه مستندات رو بخونید. اگر UDP براتون بازه، پروژه sing-box رو حتما چک کنید.

ساده ترین کانفیگ ممکنمون اینطوری میشه (برای سرور)

https://gist.github.com/444open/9ef9b31f1610fc1b034e87b8346a628d

اینجا xray میاد رو پورت 80 همه آدرس های ipv4 محلی شروع میکنه به گوش کردن برای کانکشن های ورودی از نوع VMess.

و ساده ترین کانفیگ ممکن برای کلاینت:

https://gist.github.com/444open/ed5033b1d767aafa0c38cc6d28236460

بعد از اجرا کردن xray با هر دو تا کانفیگ (همزمان) و وارد کردن 127.0.0.1:2085 (لوکال هاست آفتاب بالانس مهتاب بالانس) به عنوان پروکسی socks5 تو تنظیمات ویندوز، میبینیم که با همون اینترنت قبلی و بدون هیچ تغییری وصل شدیم به اینترنت. بعدا برمیگردیم به تنظیمات سرور، فعلا میخوایم بدون پروکسی سرور و با اینترنت خودمون از فیلترینگ عبور کنیم.

قبل از همه چیز باید بگم پروژه های خوب دیگه ای (مثل bepass) برای اینکار هستند، ولی شخصا با تنظیمات DNS این پروژه مشکل داشتم و عملا نمیتونستم از DoH فیلتر شده استفاده کنم. (Dns over Https یه پروتکل رمزنگاری شده)

سرور DNS، مثل یک دفترچه تلفن عمل میکنه. اسم میگیره، آدرس (جای شماره تلفن) میده. وقتی (بدون رمزنگاری) آدرس یک سایت فیلتر شده رو ازش بخواید، فیلترچی این وسط دخالت میکنه و یه آدرس اشتباه بهتون برمیگردونه. یکی از سرویس دهنده های معروف، کلاودفلر (cloudflare) هست. البته، خودِ دامنه این سرویس ها هم فیلترشده! برای همین نمیتونیم آدرس آیپی هاشو رو از سرور dns بپرسیم. حالا آیپی کلاودفلر از کجا بیاریم؟ دو تا راه معرفی میکنم.

با سرچ کردن عبارت online dns lookup در اینترنت، کلی سایت پیدا میکنید که با وارد کردن دامنه (cloudflare-dns.com) بهتون آدرس ها رو برمیگردونه.

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

میریم سراغ فرگمنت. یکی از قابلیت های GFW، Deep Packet Inspection یا همون DPI هست. DPI امکان تشخیص نام دامنه مقصد (با وجود رمزنگاری ارتباط) رو به سانسورچی میده. این اتفاق از طریق خوندن SNI میفته. اینکه SNI چیه و این ارتباط رمزنگاری شده چه طور انجام میشه رو میتونید در این لینک ها بخونید:

https://www.cloudflare.com/learning/ssl/what-happens-in-a-tls-handshake/

https://www.cloudflare.com/learning/ssl/what-is-sni/

در تکنیک فرگمنت، میایم پکت اول (client hello) رو تکه تکه میکنیم.

 

اگر این صفحه از مستندات رو بخونید متوجه وجود تنظیمات fragment میشید. باید این تنظیمات رو تو قسمت freedom تعریف کنیم.با این تنظیمات شروع میکنیم.

https://gist.github.com/444open/4710f860a8c34333a63ad15e384792b3

مقدار پیشفرض domainStrategy برابر با AsIS است. باعث میشه که از DNS سرور خود سیستم استفاده کنه. بنابراین روی UseIP گذاشتیمش. برای کارکرد صحیح فرگمنت روی لینوکس، tcpNoDelay حتما باید روشن باشه. برای ویندوز نباید تفاوتی ایجاد کنه.

اگر وصل شدید که تبریک میگم. ولی ممکنه همچنان مشکل داشته باشید. اپراتور با اپراتور فرق میکنه، باید تنظیمات مختلف رو امتحان کنید. میتونید رنج تاخیر بین هر فرگمنتو ببرید بالاتر. میتونید تعداد فرگمنت هارو (با بزرگتر کردنشون) کمتر کنید. در مرحله آخر، مقدار packets رو به 1-3 تغییر بدید یعنی:

“packets”: “1-3”

اصلاحیه: "1-1" (فقط پکت اول) هم کفایت میکنه. بیشتر لازم نیست.

اتفاقی که میفته اینه که بجای تکنیک tls hello fragment از tcp segment استفاده میکنیم. که میتونید تفاوتش رو تو لینک زیر ببینید:

https://upb-syssec.github.io/blog/2023/record-fragmentation/

با توجه به این مطلب، tcp segment باید زودتر از fragment شناسایی بشه. ولی همونطور که عرض کردم باید امتحان کنید، اپراتور با اپراتور فرق میکنه!

خب میریم یه مرحله جلوتر. میخوایم چند تا inbound داشته باشیم که هرکدوم به یک خروجی مختلف وصل شن. همچنین، مثل کانتینتر های ابرآروان، فقط میخوایم از یک پورت (80) استفاده کنیم.

https://gist.github.com/444open/2a5a16685d78d71048459e182c752ab9

برای اینکار اومدیم از قابلیت fallback استفاده کردیم. اگر صفحه مرتبطش رو بخونید میبینید که از پارامتر های مختلف میتونید برای تقسیم ترافیک استفاده کنید. همچنین برای جلوگیری از active probing و فیلتر شدن آیپی سرور ها میشه ازش استفاده کرد. برای این موضوع پست های زیر رو ببینید:

https://xtls.github.io/en/document/level-1/fallbacks-with-sni.html#application-scenarios

https://github.com/XTLS/Xray-core/discussions/2623

اگر دقت کنید، میبینید که هرکدوم از کانکشن های خروجی و ورودیمون (و dns) یک اسم دارن که با tag مشخص میشه. از این تگ ها پایینتر تو قسمت routing یا همون مسیریابی استفاده شدن. در ضمن از اونجایی که به عیب یابی احتیاج نداشتیم، لاگ رو هم غیر فعال کردیم.

نکته: اولین outbound، خروجی پیشفرضمونه. مسیری که بهش ختم میشه نیازی به تعریف rule (قانون) نداره. اینجا برای raw-in قانونی ننوشتیم.

در آخرین مثال هم میخوایم از فرگمنت برای استفاده از کانفیگ با دامنه فیلتر شده (مثل ورکر) استفاده کنیم.

https://gist.github.com/444open/bcea16519801763df9d4738b034c8399

تنها نکته جدید: استفاده از dialerProxy. چیکار میکنه؟ خروجیمون رو از یک خروجی دیگه عبور میده (پروکسی میکنه). اینجا تگ proxy از fragment-out رد شده. اگر از sing-box استفاده کرده باشید، شبیه detour عمل میکنه. کلاینت های گرافیکی nekobox و nekoray که برای ویندوز و اندروید هستند از این قابلیت sing-box استفاده میکنن و اصطلاحا امکان ایجاد chain proxy رو به شما میدن. با چِین کردن میتونید پروکسی ها رو پروکسی کنید 😁 و به اینترنت آزاد (به صورت امن) وصل شید.

 

امیدوارم مفید بوده باشه. به امید آزادی ✌️

Report Page