Project V
برای اطلاعات بیشتر اسناد فارسی پروژه وی را مطالعه کنید
پروژه V مجموعه ای از ابزارهایی است که به شما کمک می کند شبکه خصوصی خود را بر روی اینترنت ایجاد کنید. هسته پروژه V، به نام V2Ray، مسئول پروتکل های شبکه و ارتباطات است. این می تواند به تنهایی کار کند و همچنین با ابزارهای دیگر ترکیب شود.
پروکسی V2Ray چیست؟
_ پروکسی V2ray همانند سایر پروکسی ها نیاز به یک پروکسی سرور دارد که به عنوان سرور V2ray باشد و می توان از طریق کامپیوتر، تلفن همراه یا سایر دستگاه ها به آن متصل شد.در نتیجه به وسیله یک پروکسی Local امکان گذر از محدودیت فراهم می شود.
_ V2Ray به طور موازی پروتکل های ورودی و خروجی چندگانه موازی است که هر پروتکل مستقل عمل می کند.
_ مسیریابی قابل برنامه ریزی: ترافیک ورودی می تواند به خروجی های مختلف بر اساس پیکربندی مسیریابی ارسال شود. مسیر ترافیکی را در منطقه یا دامنه هدف آسان است.
_ پروتکل های چندگانه: V2Ray از چندین پروتکل پشتیبانی می کند، از جمله Socks، HTTP، Shadowsocks، VMess و غیره. هر پروتکل ممکن است حمل و نقل خاص خود را داشته باشد، مانند TCP، mKCP، WebSocket و غیره.
_ Obfuscation: V2Ray در ترافیک برای مخفی کردن ترافیک در TLS ساخته شده است و می تواند به صورت موازی با سرورهای وب اجرا شود.
_ معکوس پروکسی: پشتیبانی عمومی پروکسی معکوس. می توان برای ساخت تونل ها به localhost استفاده کرد.
_ سیستم عامل های چندگانه: V2Ray بطور اولیه بر روی ویندوز، سیستم عامل مک، لینوکس و غیره اجرا می شود. پشتیبانی از شخص ثالث در تلفن همراه نیز وجود دارد.
_ VMess به زبان ساده پروتکل رمزنگاری
ارتباطات در پروتکل V2Ray است و این شامل پروکسی inbound (ورودی) و outbound (خروجی) است.
به عبارت دیگر پروتکل VMess راهی برای ارسال اطلاعات رمزگذاری شده است که اولین بار توسط V2Ray استفاده شد که مانند Shadowsocks برای بازرسی بسته های عمیق (deep packet inspection) فایروال ها ساخته شد. اما بین v2ray و Shadowsocks تفاوت وجود دارد. V2ray خودش یک پلتفرم است بنابراین، v2ray می تواند با بهبود نرم افزار به رشد خود ادامه دهد.
اسناد ساختار کد
v2ray-core
├── app
│ ├── router
├── common
├── proxy
│ ├── blackhole
│ ├── dokodemo-door
│ ├── freedom
│ ├── socks
│ ├── vmess
├── transport
طراحی هسته
هدف
- هسته V2Ray بستری را فراهم میکند که از توابع پروکسی شبکه لازم پشتیبانی میکند، که توسعه ثانویه را میتوان برای ارائه تجربه کاربری بهتر انجام داد.
- اولین اصل برای کاهش هزینه توسعه ثانویه، کراس پلتفرم را در نظر بگیرید
معماری
هسته به سه لایه تقسیم می شود: لایه کاربردی، لایه پروکسی و لایه انتقال. هر لایه شامل چندین ماژول است، ماژول ها مستقل از یکدیگر هستند و همان نوع ماژول ها را می توان به طور یکپارچه جایگزین کرد.سطح کاربردی
لایه برنامه شامل برخی از توابع رایج در لایه پروکسی است که برای استفاده مجدد در ماژول های مختلف پراکسی انتزاع می شوند. ماژول ها در لایه برنامه باید پیاده سازی نرم افزاری خالص باشند و به سخت افزار یا فناوری های مرتبط با پلت فرم مرتبط نباشندلیست ماژول های مهم:
- Dispatcher: برای انتقال داده های دریافتی توسط عامل ورودی به عامل خروجی استفاده می شود.
- روتر: مسیریابی داخلی، برای جزئیات به پیکربندی مسیریابی مراجعه کنید.
- DNS: حافظه پنهان DNS داخلی؛
- مدیر پروکسی: مدیر پروکسی ورودی؛
لایه پروکسی
لایه پروکسی به دو قسمت تقسیم می شود: Inbound Proxy و Outbound Proxy. این دو بخش مستقل از یکدیگر هستند و پروکسی ورودی به یک پراکسی خروجی خاص وابسته نیست و بالعکس. لیست تمام پروتکل های پیاده سازی شدهپروکسی ورودی
پیاده سازی proxy.Inbound رابط.پراکسی خروجی
پیاده سازی proxy.Outbound رابط.لایه حمل و نقل
لایه انتقال برخی از ماژول های ابزار مربوط به انتقال داده های شبکه را فراهم می کندپروتکل VMess
VMess پروتکل ارتباطی رمزگذاری شده اصلی V2Ray است.پروتکل زیربنایی
VMess یک پروتکل مبتنی بر TCP است، تمام داده ها با استفاده از TCP منتقل می شوندشناسه کاربر
ID معادل UUID است که یک عدد تصادفی 16 بایتی است و نقش آن معادل یک توکن (Token) است. شناسهای مانند این: de305d54-75b4-431b-adb2-eb6b9e546014، تقریباً کاملاً تصادفی، میتواند با استفاده از هر مولد UUID، مانند این ، تولید شود . شناسه کاربر را می توان در فایل پیکربندی مشخص کردعملکرد
- MD5: عملکرد MD5
- پارامتر ورودی یک آرایه بایت با هر طولی است
- خروجی یک آرایه 16 بایتی است
- HMAC: عملکرد HMAC
- پارامترهای ورودی عبارتند از:
- H: تابع هش
- K: کلید، آرایه بایتی با هر طول
- M: پیام، آرایه بایتی با هر طول
- پارامترهای ورودی عبارتند از:
- لرزش: عملکرد SHA3-Shake128
- پارامتر ورودی یک رشته با هر طولی است
- خروجی به عنوان کاراکتر با هر طول
فرآیند ارتباطی
VMess یک پروتکل بدون حالت است، یعنی کلاینت و سرور می توانند مستقیماً داده ها را بدون دست دادن ارسال کنند و هر انتقال داده تأثیری بر سایر انتقال داده ها قبل و بعد از آن ندارد. مشتری VMess یک درخواست را آغاز می کند و سرور قضاوت می کند که آیا درخواست از یک کلاینت قانونی می آید یا خیر. اگر تأیید تأیید شود، درخواست ارسال می شود و پاسخ به دست آمده به مشتری بازگردانده می شود. VMess از فرمت نامتقارن استفاده می کند، یعنی درخواست ارسال شده توسط مشتری و پاسخ سرور از فرمت های مختلف استفاده می کند.درخواست مشتری
16 بایت | X بایت | بقیه |
---|---|---|
اطلاعات گواهینامه | بخش دستورالعمل | بخش داده |
اطلاعات گواهینامه
اطلاعات احراز هویت یک مقدار هش (هش) 16 بایتی است که به صورت زیر محاسبه می شود:- H = MD5
- K = شناسه کاربر (16 بایت)
- M = زمان UTC، دقیق به ثانیه، مقدار یک مقدار تصادفی 30 ثانیه قبل و بعد از زمان فعلی است (8 بایت، Big Endian)
- هش = HMAC(H، K، M)
بخش دستورالعمل
بخش دستورالعمل رمزگذاری شده AES-128-CFB است:- کلید: MD5(شناسه کاربری + []بایت(‘c48619fe-8f02-49e0-b9e9-edf763e17e21’))
- IV: MD5 (X + X + X + X)، X = [] بایت (زمان تولید اطلاعات احراز هویت) (8 بایت، Big Endian)
- شماره نسخه نسخه: همیشه 1;
- رمزگذاری داده IV: مقدار تصادفی.
- کلید رمزگذاری داده ها: مقدار تصادفی.
- احراز هویت پاسخ V: مقدار تصادفی.
- انتخاب گزینه:
- S (0x01): جریان داده در قالب استاندارد (توصیه می شود باز شود).
- R (0x02): مشتری انتظار دارد از اتصال TCP مجدد استفاده کند (منسوخ شده در V2Ray 2.23+).
- این مورد فقط زمانی معتبر است که S روشن باشد.
- M (0x04): فعال کردن مبهم سازی ابرداده (توصیه می شود).
- این مورد فقط زمانی معتبر است که S روشن باشد.
- وقتی آیتم آن فعال است، کلاینت و سرور باید به ترتیب دو نمونه Shake بسازند، RequestMask = Shake (اطلاعات درخواست IV)، ResponseMask = Shake (داده پاسخ IV).
- X: رزرو شده
- حاشیه P: مقدار تصادفی P بایت قبل از مقدار بررسی اضافه می شود.
- روش رمزگذاری: روش رمزگذاری قسمت داده را مشخص کنید، مقادیر اختیاری عبارتند از:
- 0x00:AES-128-CFB؛
- 0x01: بدون رمزگذاری.
- 0x02:AES-128-GCM.
- 0x03:ChaCha20-Poly1305.
- دستور Cmd:
- 0x01: داده های TCP.
- 0x02: داده های UDP
- پورت پورت: شماره پورت عدد صحیح در قالب Big Endian.
- نوع آدرس T:
- 0x01:IPv4
- 0x02: نام دامنه
- 0x03:IPv6
- آدرس الف:
- وقتی T = 0x01، A یک آدرس IPv4 4 بایتی است.
- وقتی T = 0x02، A 1 بایت طول (L) + L بایت نام دامنه است.
- وقتی T = 0x03، A یک آدرس IPv6 16 بایتی است.
- F را بررسی کنید: FNV1a هش تمام محتویات به جز F در بخش دستورالعمل.
بخش داده
بخش داده دارای دو فرمت است، پیش فرض فرمت اصلی استقالب اصلی (منسوخ شده)
این قالب فقط برای سازگاری با عقب است و ممکن است در نسخه های بعدی حذف شود. فرض می شود تمام داده ها محتوای واقعی درخواست هستند. اینها به آدرسی که در قسمت فرمان مشخص شده ارسال می شود. هنگامی که Cmd = 0x01، این داده ها در قالب TCP ارسال می شوند و زمانی که Cmd = 0x02، این داده ها به شکل UDP ارسال می شوند. این فرمت از دو روش رمزگذاری “بدون رمزگذاری” و “AES-128-CFB” پشتیبانی می کند و کلید رمزگذاری شده و IV توسط قسمت فرمان مشخص می شوند.فرمت استاندارد
وقتی Opt(S) روشن است، بخش داده از این قالب استفاده می کند. داده های درخواست واقعی به چند بلوک کوچک تقسیم می شوند و فرمت هر بلوک کوچک به شرح زیر است. پس از اینکه سرور تمام بلوک های کوچک را بررسی کرد، آنها را در قالب اصلی فوروارد می کند.2 بایت | L بایت |
---|---|
طول L | بسته داده |
- طول L: عدد صحیح در قالب Big Endian، حداکثر مقدار 2^14 است.
- وقتی Opt(M) روشن است، مقدار L = مقدار واقعی xor Mask. Mask = (RequestMask. NextByte() « 8) + RequestMask. NextByte();
- بسته داده: بسته داده ای که با روش رمزگذاری مشخص شده رمزگذاری شده است.
- بدون رمزگذاری:
- L بایت: داده های واقعی.
- AES-128-CFB: کل بخش داده با استفاده از AES-128-CFB رمزگذاری شده است.
- 4 بایت: هش FNV1a از داده های واقعی.
- L – 4 بایت: داده های واقعی.
- AES-128-GCM: Key کلید قسمت فرمان است، IV = تعداد (2 بایت) + IV (10 بایت). تعداد از 0 افزایش می یابد و برای هر بسته داده 1 افزایش می یابد؛ IV بایت 3 تا 12 قسمت دستورالعمل IV است.
- L – 16 بایت: داده های واقعی.
- 16 بایت: اطلاعات احراز هویت GCM
- ChaCha20-Poly1305: کلید = MD5 (کلید دستورالعمل) + MD5 (MD5 (کلید دستورالعمل))، IV = تعداد (2 بایت) + IV (10 بایت). تعداد از 0 افزایش می یابد و برای هر بسته داده 1 افزایش می یابد؛ IV بایت 3 تا 12 قسمت دستورالعمل IV است.
- L – 16 بایت: داده های واقعی.
- 16 بایت: اطلاعات احراز هویت Poly1305
پاسخ سرور
دادههای سرصفحه پاسخ با AES-128-CFB رمزگذاری میشوند، IV MD5 (رمزگذاری داده IV) و کلید MD5 (کلید رمزگذاری دادهها) است. داده های پاسخ واقعی بسته به تنظیمات رمزگذاری متفاوت است.1 بایت | 1 بایت 1 بایت | 1 بایت | 1 بایت | M بایت | بقیه |
---|---|---|---|---|---|
احراز هویت پاسخ V | گزینه Opt | دستور Cmd | طول دستورالعمل M | محتوای فرمان | داده های پاسخ واقعی |
- احراز هویت پاسخ V: باید با احراز هویت پاسخ V در درخواست مشتری سازگار باشد.
- انتخاب گزینه:
- 0x01: سرور آماده استفاده مجدد از اتصال TCP است (منسوخ شده در V2Ray 2.23+).
- دستور Cmd:
- 0x01: دستور پورت پویا
- داده های پاسخ واقعی:
- اگر Opt(S) در درخواست روشن باشد، از قالب استاندارد استفاده می شود، در غیر این صورت از قالب اصلی استفاده می شود.
- فرمت مانند داده های درخواست است.
- وقتی Opt(M) روشن است، مقدار طول L = مقدار واقعی xor Mask. Mask = (ResponseMask. NextByte() « 8) + ResponseMask. NextByte();
دستورالعمل پورت پویا
1 بایت | 2 بایت | 16 بایت | 2 بایت | 1 بایت | 1 بایت |
---|---|---|---|---|---|
ذخیره | بندر بندر | شناسه کاربر | AlterID | سطح کاربر | زمان موثر T |
- پورت پورت: شماره پورت عدد صحیح در قالب Big Endian.
- زمان معتبر T: دقیقه;