وی مس net.vmess
پروتکل پراکسی ویمس، فقط شکل AEAD: کارخواه و سرور رمزگذاریشده، TCP و UDP، روی TCP، TLS، وبسوکت یا هر جریان تونل، با بلوکهای رمزنگاری در دسترس.
واردسازی شبکه.وی مس
نام آرگومانها شناسهی خود کد است و معادل فارسی ندارد؛ گونهها، کلیدواژهها و نام بستهها با معادل فارسی نوشته میشوند.
ویمس پروتکل قدیمیتر خانوادهی V2Ray است و برخلاف وی لس خودش رمزگذاری میکند. کارخواه با یک شناسهی احراز که زمان فعلی را دارد ثابت میکند UUID یک کاربر را دارد، درخواست (نشانی مقصد و کلیدهای نشست) را با کلیدهای برگرفته از UUID رمزگذاریشده میفرستد و بعد بار را در قطعههای رمزگذاریشده میفرستد. سرور با سرآیند رمزگذاریشدهی خودش و قطعههای خودش پاسخ میدهد. هر که نگاه کند بایتهای تصادفی میبیند، هر چه حاملشان باشد.
این بسته فقط شکل AEAD را پیاده میکند، شکلی که از V2Ray 4.28 به بعد به کار میرود و تنها شکلی است که کارخواههای امروزی تولید میکنند: کاربر با شناسهی احراز رمزگذاریشده شناخته میشود و سرآیند با AES-128-GCM مهر میشود. شکل قدیمیتر مبتنی بر MD5، همان که به alterId بالای ۰ نیاز دارد، پیاده نشده. alterId را در دو طرف ۰ بگذارید (در کارخواههای امروزی پیشفرض همین است).
بسته هر دو نیمه است. شماره گیری کارخواه را از راه انتقال شبکه وصل میکند و سرآیند را میفرستد، پذیرش آن را در سرور میخواند، خواندن و نوشتن بار را جابهجا میکنند و خواندن بسته یک قطعه را به عنوان یک بستهی UDP میخواند. به عنوان جریان، اتصال روی جریان و پذیرش روی جریان آن را به جریانهای تونل وصل میکنند. توابع سطح پایینتر (اشتقاق کلید، سرآیند مهرشده، رمزگذار قطعه) عمومیاند، چون پروتکل را وقتی تکهتکه بررسی و آزمایش کنید راحتتر میشود فهمید.
رمزگذاریهای بدنه
| ثابت | چه میکند |
|---|---|
امنیت ای ای اس۱۲۸ جی سی ام | هر قطعه با AES-128-GCM مهر میشود. انتخاب پیشفرض. |
امنیت چاچا۲۰ پلی۱۳۰۵ | هر قطعه با ChaCha20-Poly1305 مهر میشود. روی پردازندهای که دستور AES ندارد انتخاب خوبی است. |
امنیت هیچ | قطعهها قاببندی میشوند اما رمزگذاری نمیشوند. سرآیند باز هم مهر میشود. |
امنیت صفر | نه قطعه و نه رمزگذاری: بار همانطور که هست بعد از سرآیند میآید. فقط برای استفاده داخل TLS. |
سرآیند همیشه با AES-128-GCM و کلیدهای برگرفته از UUID مهر میشود، هر نوع بدنهای که انتخاب شود. گزینههای درخواست.گزینه ها بیتاند: گزینه جریان قطعه ای بدنه را در قطعهها قاببندی میکند، گزینه نقاب طول طول قطعهها را با جریان SHAKE128 پنهان میکند، گزینه لایه گذاری به هر قطعه لایهی تصادفی میافزاید و گزینه طول احراز شده طولها را با رمز بدنه احراز میکند. شماره گیری برای نوع امنیت از گزینه پیش فرض استفاده میکند؛ برای انتخاب بیتها با خودتان، کارخواه را روی اتصالی که خودتان باز کردهاید صدا بزنید.
چیزهایی که گیر میاندازند
- دو ساعت باید یکی باشند. شناسهی احراز زمان را دارد و سرور فقط شناسههایی را میپذیرد که در
پنجره زمانیثانیه، یعنی ۱۲۰، از ساعت خودش باشند. گوشی یا سروری که ساعتش اشتباه استunknown user or stale timestampمیگیرد و هیچ چیز دیگر. وقتی UUID درست رد میشود اولین چیزی که باید بررسی شود همین است. - یک فیلتر بازپخش مشترک بگذارید.
پذیرششناسههای احرازی را که دیده به خاطر میسپارد و تکراری را رد میکند. بافیلتر بازپخش جدیدیکی بسازید و همان را به همهی فراخوانیهایپذیرشیک سرور بدهید؛ از چند نخ هم امن است. وقتی بیش از ۴۰۹۶ شناسه نگه دارد، آنهایی را که از چهار دقیقه قدیمیترند دور میریزد. - به کارخواه ردشده چیزی گفته نمیشود.
شماره گیریفقط سرآیند را میفرستد. UUID اشتباه، ساعت کهنه یا شناسهی بازپخششده باعث میشود سرور اتصال را ببندد و کارخواه آن را به شکل یک خواندن ناموفق میبیند. - سرور باید نوع امنیت را پشتیبانی کند.
پذیرشی که نوعی غیر از چهار نوع بالا بخواند باunsupported security typeشکست میخورد. - پیوند vmess:// نیست. قالب اشتراک JSON کدگذاریشده با Base64 V2RayN و دیگران اینجا تجزیه نمیشود. فیلدها را خودتان از آن بردارید.
بستنکلیدها را آزاد میکند. وقتی کارتان تمام شد در هر طرف یک باربستنرا صدا بزنید.
بلوکهای سازنده
این برنامه از یک UUID کلید فرمان کاربر را میسازد، برای یک زمان معین شناسهی احراز میسازد، دوباره بازش میکند (که زمان را هم پس میدهد)، نشان میدهد کلید کاربر دیگر نمیتواند بازش کند و یک سرآیند کوچک را مهر میکند. عددهایی که درمیآیند ثابتاند، پس میتوان با پیادهسازی دیگری مقایسهشان کرد.
// زبان: فارسی
واردسازی شبکه.انتقال شبکه
واردسازی شبکه.وی مس
پایا ID := "b831381d-6324-4d53-ad4f-8cda48b30811"
تابع ریشه:
key := وی مس.کلید فرمان(انتقال شبکه.تجزیه یو یو آی دی(ID))
سرچاپ "کلید فرمان"، انتقال شبکه.به هگزا(key)
stamp := 1700000000 برگردان صحیح۶۴
salt := انتقال شبکه.از هگزا("a1b2c3d4")
authid := وی مس.ساخت شناسه احراز(key، stamp، salt)
سرچاپ "شناسهی احراز"، انتقال شبکه.به هگزا(authid)
ناپایا when := 0 برگردان صحیح۶۴
سرچاپ "با کلید درست باز میشود:"، وی مس.گشودن شناسه احراز(key، authid، when)، when برابر stamp
other := وی مس.کلید فرمان(انتقال شبکه.تجزیه یو یو آی دی("5783a3e7-e373-51cd-8642-c83782b807c5"))
سرچاپ "برای کاربر دیگر رد میشود:"، وارونه وی مس.گشودن شناسه احراز(other، authid، when)
nonce := انتقال شبکه.از هگزا("1112131415161718")
sealed := وی مس.مهر سرآیند(key، انتقال شبکه.از رشته("a small header")، stamp، salt، nonce)
سرچاپ "سرآیند مهرشده"، sealed.طول، "بایت است"
سرچاپ "پنجرهی زمانی به ثانیه:"، وی مس.پنجره زمانی
سرچاپ "گزینهی پیشفرض برای aes-gcm:"، وی مس.گزینه پیش فرض(وی مس.امنیت ای ای اس۱۲۸ جی سی ام)
سرچاپ "گزینهی پیشفرض برای none:"، وی مس.گزینه پیش فرض(وی مس.امنیت هیچ)
سرچاپ "گزینهی پیشفرض برای zero:"، وی مس.گزینه پیش فرض(وی مس.امنیت صفر)
پایانشروع سریع: کارخواه و سرور روی TCP
سرور با انتقال شبکه.شنود گوش میدهد، با انتقال شبکه.پذیرش میپذیرد و هر اتصال را با فهرست کاربرانش و فیلتر بازپخش مشترک به وی مس.پذیرش میدهد. کارخواه با وی مس.شماره گیری وصل میشود و رمزگذاری بدنه را برمیگزیند. مقصد در سرآیند همان جایی است که سرور واقعی بعداً به آن وصل میشود؛ این سرور پژواک فقط گزارشش میکند.
// زبان: فارسی
واردسازی حافظه
واردسازی رشته
واردسازی همگام سازی
واردسازی شبکه.انتقال شبکه
واردسازی شبکه.وی مس
پایا ID := "b831381d-6324-4d53-ad4f-8cda48b30811"
ناپایا port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()
ناپایا seen := ""
تابع server():
l := انتقال شبکه.شنود(0، انتقال شبکه.تنظیمات {})
port = انتقال شبکه.درگاه شنونده(l)
همگام سازی.اتمام(ready)
ناپایا users := وکتور {} برگردان وکتور<وی مس.کاربر>
users.بیفزا(وی مس.کاربر جدید(ID))
ناپایا rf := وی مس.فیلتر بازپخش جدید()
buf := حافظه.تخصیص(4096 برگردان طبیعی۶۴)
تکرار 3:
ناپایا c := وی مس.پذیرش(انتقال شبکه.پذیرش(l)، users، rf)
اگر وارونه c.معتبر:
seen += "refused(" + c.خطا + ") "
گذر
پایان
seen += c.درخواست.نشانی.میزبان + " security " + رشته.از عدد(c.درخواست.امنیت برگردان صحیح۶۴) + "; "
n := وی مس.خواندن(c، buf، 4096)
وی مس.نوشتن(c، buf، n)
وی مس.بستن(c)
پایان
حافظه.آزادسازی(buf)
انتقال شبکه.بستن شنونده(l)
پایان
تابع talk(security: صحیح):
target := انتقال شبکه.نشانی جدید("example.com"، 443)
ناپایا c := وی مس.شماره گیری("127.0.0.1"، port، انتقال شبکه.تنظیمات {}، ID، security، وی مس.فرمان تی سی پی، target)
ناپایا msg := انتقال شبکه.از رشته("hello through vmess")
وی مس.نوشتن(c، msg.نشانگر، msg.طول)
buf := حافظه.تخصیص(4096 برگردان طبیعی۶۴)
n := وی مس.خواندن(c، buf، 4096)
سرچاپ security، (buf برگردان رشته).زیررشته(0، n)
حافظه.آزادسازی(buf)
انتقال شبکه.آزادسازی بایتها(msg)
وی مس.بستن(c)
پایان
تابع ریشه:
همگام سازی.افزودن(ready، 1 برگردان صحیح۶۴)
t := نخساز(server)
همگام سازی.انتظار(ready)
talk(وی مس.امنیت ای ای اس۱۲۸ جی سی ام)
talk(وی مس.امنیت چاچا۲۰ پلی۱۳۰۵)
talk(وی مس.امنیت هیچ)
نخپیوند(t)
سرچاپ seen
پایانکاربری که سرور نمیشناسد
کارخواه خودش نمیتواند بفهمد. سرور کلید جورشدهای نمییابد، unknown user or stale timestamp میگوید و اتصال را میبندد. سرور واقعی نباید کار دیگری بکند: فرستادن خطا به یک پویشگر میگفت که پراکسی پیدا کرده.
// زبان: فارسی
واردسازی همگام سازی
واردسازی شبکه.انتقال شبکه
واردسازی شبکه.وی مس
پایا GOOD := "b831381d-6324-4d53-ad4f-8cda48b30811"
پایا OTHER := "5783a3e7-e373-51cd-8642-c83782b807c5"
ناپایا port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()
ناپایا verdict := ""
تابع server():
l := انتقال شبکه.شنود(0، انتقال شبکه.تنظیمات {})
port = انتقال شبکه.درگاه شنونده(l)
همگام سازی.اتمام(ready)
ناپایا users := وکتور {} برگردان وکتور<وی مس.کاربر>
users.بیفزا(وی مس.کاربر جدید(GOOD))
ناپایا rf := وی مس.فیلتر بازپخش جدید()
ناپایا c := وی مس.پذیرش(انتقال شبکه.پذیرش(l)، users، rf)
verdict = c.معتبر ? "accepted " + c.کاربر : "refused: " + c.خطا
وی مس.بستن(c)
انتقال شبکه.بستن شنونده(l)
پایان
تابع ریشه:
همگام سازی.افزودن(ready، 1 برگردان صحیح۶۴)
t := نخساز(server)
همگام سازی.انتظار(ready)
ناپایا c := وی مس.شماره گیری("127.0.0.1"، port، انتقال شبکه.تنظیمات {}، OTHER، وی مس.امنیت ای ای اس۱۲۸ جی سی ام، وی مس.فرمان تی سی پی، انتقال شبکه.نشانی جدید("example.com"، 80))
نخپیوند(t)
سرچاپ verdict
وی مس.بستن(c)
پایانویلس حامل ویمس
یک پوشانندهی جریان هر پروتکل را حامل پروتکل دیگری میکند. اینجا یک اتصال ویلس بیرونی روی یک لولهی درونحافظه اجرا میشود و یک اتصال ویمس درونی داخل آن، با کاربران و مقصدهای متفاوت. در شبکهی واقعی بیرونی ویلس روی وبسوکت و TLS خواهد بود و درونی ویمس، که بار را سر به سر رمزگذاری میکند حتی وقتی CDN TLS بیرونی را تمام کند.
// زبان: فارسی
واردسازی حافظه
واردسازی همگام سازی
واردسازی شبکه.انتقال شبکه
واردسازی شبکه.تونل
واردسازی شبکه.وی لس
واردسازی شبکه.وی مس
پایا OUTER := "b831381d-6324-4d53-ad4f-8cda48b30811"
پایا INNER := "5783a3e7-e373-51cd-8642-c83782b807c5"
ناپایا pipe := تونل.لوله جدید()
ناپایا done := همگام سازی.گروه انتظار جدید()
ناپایا seen := ""
تابع server():
ناپایا vl := وکتور {} برگردان وکتور<وی لس.کاربر>
vl.بیفزا(وی لس.کاربر جدید(OUTER، ""))
ناپایا vm := وکتور {} برگردان وکتور<وی مس.کاربر>
vm.بیفزا(وی مس.کاربر جدید(INNER))
ناپایا rf := وی مس.فیلتر بازپخش جدید()
outer := وی لس.پذیرش روی جریان(تونل.سر دوم لوله(pipe)، vl)
inner := وی مس.پذیرش روی جریان(وی لس.به عنوان جریان(outer)، vm، rf)
seen = outer.درخواست.نشانی.میزبان + " then " + inner.درخواست.نشانی.میزبان
s := وی مس.به عنوان جریان(inner)
buf := حافظه.تخصیص(256 برگردان طبیعی۶۴)
n := s.خواندن بایت(buf، 256)
s.نوشتن بایت(buf، n)
حافظه.آزادسازی(buf)
s.بستن()
همگام سازی.اتمام(done)
پایان
تابع ریشه:
همگام سازی.افزودن(done، 1 برگردان صحیح۶۴)
_t := نخساز(server)
outer := وی لس.اتصال روی جریان(تونل.سر اول لوله(pipe)، OUTER، ""، وی لس.فرمان تی سی پی، انتقال شبکه.نشانی جدید("hop.example"، 443))
inner := وی مس.اتصال روی جریان(وی لس.به عنوان جریان(outer)، INNER، وی مس.امنیت چاچا۲۰ پلی۱۳۰۵، وی مس.فرمان تی سی پی، انتقال شبکه.نشانی جدید("final.example"، 443))
s := وی مس.به عنوان جریان(inner)
s.نوشتن("two layers deep")
buf := حافظه.تخصیص صفرشده(256 برگردان طبیعی۶۴)
n := s.خواندن بایت(buf، 256)
سرچاپ (buf برگردان رشته).زیررشته(0، n)
حافظه.آزادسازی(buf)
s.بستن()
همگام سازی.انتظار(done)
سرچاپ "سرور دید"، seen
پایانویمس روی وبسوکت و TLS پشت CDN
گامهای CDN را از صفحهی انتقال شبکه انجام دهید: دامنهی پراکسیشده، مسیر محرمانهی وبسوکت، TLS به CDN با نام جلویی در نام سرور و دامنهی خودتان در سربرگ میزبان. رمزگذاری را ویمس انجام میدهد، پس بار را از CDN هم حفظ میکند.
// زبان: فارسی
واردسازی شبکه.انتقال شبکه
واردسازی شبکه.وی مس
تابع ریشه:
ناپایا s := انتقال شبکه.تنظیمات {}
s.شبکه = "ws"
s.تی ال اس = درست
s.نام سرور = "front.example.net"
s.سربرگ میزبان = "vpn.example.org"
s.مسیر = "/vm-31c9"
s.الپن = "http/1.1"
target := انتقال شبکه.نشانی جدید("example.com"، 80)
ناپایا c := وی مس.شماره گیری("front.example.net"، 443، s، "b831381d-6324-4d53-ad4f-8cda48b30811"، وی مس.امنیت ای ای اس۱۲۸ جی سی ام، وی مس.فرمان تی سی پی، target)
اگر وارونه c.معتبر:
سرچاپ "اتصال ممکن نشد:"، c.خطا
برگشت
پایان
ناپایا req := انتقال شبکه.از رشته("HEAD / HTTP/1.0\r\nHost: example.com\r\n\r\n")
وی مس.نوشتن(c، req.نشانگر، req.طول)
انتقال شبکه.آزادسازی بایتها(req)
وی مس.بستن(c)
پایاندر سرور با شبکه = "ws"، همان مسیر و سربرگ میزبان گوش دهید و تی ال اس را وقتی CDN یا پراکسی معکوس شما TLS را تمام میکند خاموش بگذارید. برای هر اتصال، در یک نخ کارگر، انتقال شبکه.پذیرش خام، انتقال شبکه.ارتقا و بعد وی مس.پذیرش را صدا بزنید. ساعت سرور را درست نگه دارید (پنجرهی زمانی ۱۲۰ ثانیه است) و به کاربرانتان هم بگویید همین کار را بکنند.
پیوندهای اشتراک
برنامهها یک سرور ویمس را به شکل vmess:// و پس از آن Base64 یک شیء JSON به اشتراک میگذارند (شکل v2rayN، همان که tunnel.ParseLink میخواند). تجزیه پیوند آن را به یک پیوند میخواند: معتبر را بسنجید و اگر نادرست بود خطا را بخوانید. قالب پیوند یکی را برمینویسد، تنظیمات پیوند آن را به تنظیمات net.transport تبدیل میکند (مسیر وبسوکت و دادهی زودهنگام ?ed=، نام سرویس gRPC، نام TLS) و شماره گیری پیوند به آن وصل میشود. امنیت از نام و نام امنیت میان نامهایی مثل chacha20-poly1305 و شمارهی امنیت تبدیل میکنند؛ auto یعنی AES-128-GCM. aid قدیمی خوانده و نگه داشته میشود اما فقط ۰ معنا دارد.
محدودیتها
- فقط AEAD. حالت قدیمی (
alterIdبالای ۰) نیست و با سرور یا کارخواهی که به آن نیاز دارد سازگار نیست. - گزینهی طول احراز شده از Xray پیروی میکند.
گزینه طول احراز شدهکلید و نانس طول را در هر دو جهت از کلید و بردار درخواست میگیرد، طول را با AES-128-GCM مهر میکند (برای بدنهی چاچا هم) و در اجرای همکنشپذیری با Xray و sing-box سنجیده شده است (ماتریس درdocs/VPN_INTEROP.md).شماره گیریهرگز آن را نمیگذارد؛ بیتها را باکارخواهبگذارید. - همکنشپذیری جداگانه آزموده شد. سرآیند، شناسهی احراز، اشتقاق کلید و قالب قطعهها در این مخزن با بردارهای بایتی ثابت و با دو نیمهی خود بسته (روی TCP، TLS، وبسوکت و یک لوله) سنجیده میشود. ابزار همکنشپذیری بسته را با ساختهای واقعی Xray و sing-box اجرا میکند؛ نتیجهها در
docs/VPN_INTEROP.mdاست. - چندپلکسی همان Mux.Cool است. با
فرمان مالتی پلکسوصل شوید وچندگانه ساز کارخواهرا صدا بزنید؛ در سرور وقتی درخواست پذیرفتهشدهفرمان مالتی پلکسداردچندگانه ساز کارسازرا صدا بزنید. نشستها ازnet.transportمیآیند (باز کردن نشست،پذیرش نشست). - ابزارهای رمزنگاری ضعیف، بهخاطر طراحی. ویمس برای کلید فرمان از MD5 و برای یک بلوک شناسهی احراز از AES حالت ECB استفاده میکند؛ اینها از خود پروتکلاند، نه انتخاب این بسته. رمزهای بار احرازشوندهاند (AES-GCM، ChaCha20-Poly1305).
امنیت هیچوامنیت صفربار را رمزگذاری نمیکنند. فقط داخل TLSای که به آن اعتماد دارید به کار ببریدشان.- محافظت بازپخش در هر فرایند جدا است. فیلتر در حافظه است، پس راهاندازی دوباره آن را فراموش میکند، اما پنجرهی زمانی هنوز آنچه را میشود بازپخش کرد محدود میکند.
گونهها
کاربر User
ساختار کاربر| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| شناسه | id | رشته = "" | شناسهی کاربر به صورت متن. |
| کلید فرمان | cmd_key | انتقال شبکه.بایتها | کلید فرمان برگرفته از شناسهی کاربر. کاربر جدید آن را حساب میکند. |
فیلتر بازپخش ReplayFilter
ساختار فیلتر بازپخشپذیرش مشترک بگذارید؛ قفل دارد.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| دیده شده | seen | نگاشت<رشته، صحیح۶۴> | شناسههای دیدهشده و زمانی که هر کدام دیده شد. |
| قفل | lock | همگام سازی.قفل | قفلی که از دیده شده محافظت میکند. |
اتصال Conn
ساختار اتصال| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| انتقال | t | انتقال شبکه.اتصال | اتصال انتقال شبکهی زیرین. |
| کارخواه | client | منطقی = نادرست | در سمت کارخواه درست است. |
| معتبر | ok | منطقی = نادرست | وقتی تبادل سرآیند موفق بود و اتصال قابل استفاده است درست است. |
| خطا | err | رشته = "" | دلیل شکست، و در غیر این صورت خالی. |
| درخواست | req | درخواست | سرآیند درخواست: در سرور آنچه کارخواه فرستاد، در کارخواه آنچه خودش فرستاد. |
| کاربر | user | رشته = "" | در سرور: شناسهی کاربری که جور شد. |
| رمز نوشتن | wc | Codec | درونی: رمزگذار قطعههایی که این طرف مینویسد. |
| رمز خواندن | rc | Codec | درونی: رمزگشای قطعههایی که این طرف میخواند. |
| پاسخ معلق | resp_pending | منطقی = نادرست | درونی: سرآیند پاسخ سرور هنوز خوانده نشده. |
| کلید پاسخ | resp_key | انتقال شبکه.بایتها | درونی: کلید سرآیند پاسخ. |
| بردار پاسخ | resp_iv | انتقال شبکه.بایتها | درونی: بردار آغازین پاسخ. |
| بافر خواندن | rbuf | انتقال شبکه.بایتها | درونی: بایتهای رمزگشاییشده که هنوز خوانده نشدهاند. |
| پایان جریان | eof | منطقی = نادرست | درونی: همتا جریان را تمام کرد. |
| بسته شده | closed | منطقی = نادرست | درونی: بستن صدا زده شده. |
پیوند Link
ساختار پیوندvmess:// تجزیهشده، همان شکلی که v2rayN و بیشتر برنامهها به اشتراک میگذارند.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| معتبر | ok | منطقی = نادرست | درست وقتی پیوند کامل و پشتیبانیشده است. |
| خطا | err | رشته = "" | چرا تجزیه شکست خورد. |
| برچسب | remark | رشته = "" | برچسب ps. |
| میزبان | host | رشته = "" | نشانی سرور. |
| درگاه | port | صحیح = 443 | درگاه سرور. |
| شناسه | uuid | رشته = "" | شناسهی کاربر. |
| شناسه جایگزین | alter_id | صحیح = 0 | عدد قدیمی aid که برای رفت و برگشت میماند. اینجا فقط ۰ معنا دارد. |
| امنیت | security | رشته = "auto" | نام رمز بدنه: auto، aes-128-gcm، chacha20-poly1305، none یا zero. |
| شبکه | network | رشته = "tcp" | tcp، ws، httpupgrade یا grpc. |
| نوع سرآیند | header_type | رشته = "none" | فیلد type، معمولاً none. |
| سربرگ میزبان | host_header | رشته = "" | فیلد host: سرآیند Host در وبسوکت و ارتقای HTTP. |
| مسیر | path | رشته = "" | مسیر وبسوکت یا نام سرویس gRPC. |
| تی ال اس | tls | منطقی = نادرست | درست وقتی پیوند tls میگوید. |
| نام سرور | sni | رشته = "" | نام سرور TLS. |
| الپن | alpn | رشته = "" | متن ALPN. |
| اثر انگشت | fingerprint | رشته = "" | نام مرورگر fp. |
| اجازه ناامن | allow_insecure | منطقی = نادرست | بررسی گواهی را رد میکند. |
درخواست Request
ساختار درخواست| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نگارش | version | صحیح = 1 | نگارش سرآیند. همیشه ۱. |
| بردار آغازین | iv | انتقال شبکه.بایتها | بردار آغازین ۱۶ بایتی بدنهی درخواست. کلیدهای پاسخ از آن گرفته میشوند. |
| کلید | key | انتقال شبکه.بایتها | کلید ۱۶ بایتی بدنهی درخواست. |
| بایت پاسخ | resp_v | صحیح = 0 | یک بایت که سرور باید در سرآیند پاسخش برگرداند. به کارخواه میگوید پاسخ مال این درخواست است. |
| گزینه ها | option | صحیح = 0 | بیتهای گزینه: گزینه جریان قطعه ای، گزینه نقاب طول، گزینه لایه گذاری، گزینه طول احراز شده. |
| امنیت | security | صحیح = 3 | رمزگذاری بدنه: امنیت ای ای اس۱۲۸ جی سی ام، امنیت چاچا۲۰ پلی۱۳۰۵، امنیت هیچ یا امنیت صفر. |
| فرمان | command | صحیح = 1 | فرمان تی سی پی، فرمان یو دی پی یا فرمان مالتی پلکس. |
| نشانی | addr | انتقال شبکه.نشانی | نشانی مقصد. فرمان مالتی پلکس از آن استفاده نمیکند. |
| طول لایه گذاری | padding | صحیح = 0 | سرآیند چند بایت لایهی تصادفی دارد، ۰ تا ۱۵. |
پایاها و متغیرها
فرمانها Cmd…
فرمان تی سی پی اتصال TCP به مقصد باز میکند، فرمان یو دی پی بستههای UDP میبرد، فرمان مالتی پلکس فرمان چندپلکسی است که سرآیند میتواند حمل کند اما چیزی پیادهاش نکرده.| نام | انگلیسی | مقدار |
|---|---|---|
| فرمان تی سی پی | CmdTCP | 1 |
| فرمان یو دی پی | CmdUDP | 2 |
| فرمان مالتی پلکس | CmdMux | 3 |
رمزگذاریهای بدنه Sec…
امنیت یک درخواست و برای شماره گیری: امنیت ای ای اس۱۲۸ جی سی ام (AES-128-GCM)، امنیت چاچا۲۰ پلی۱۳۰۵ (ChaCha20-Poly1305)، امنیت هیچ (قاببندیشده، رمزگذارینشده)، امنیت صفر (نه قاببندی، نه رمزگذاری).| نام | انگلیسی | مقدار |
|---|---|---|
| امنیت ای ای اس۱۲۸ جی سی ام | SecAES128GCM | 3 |
| امنیت چاچا۲۰ پلی۱۳۰۵ | SecChaCha20Poly1305 | 4 |
| امنیت هیچ | SecNone | 5 |
| امنیت صفر | SecZero | 6 |
بیتهای گزینه Opt…
گزینه ها یک درخواست، ترکیبشده با |: گزینه جریان قطعه ای بدنه را قاببندی میکند، گزینه نقاب طول طول قطعهها را نقاب میزند، گزینه لایه گذاری هر قطعه را لایهگذاری میکند، گزینه طول احراز شده طولها را احراز میکند (با همتای واقعی سنجیده نشده).| نام | انگلیسی | مقدار |
|---|---|---|
| گزینه جریان قطعه ای | OptChunkStream | 1 |
| گزینه نقاب طول | OptChunkMask | 4 |
| گزینه لایه گذاری | OptPadding | 8 |
| گزینه طول احراز شده | OptAuthLength | 16 |
پنجره زمانی TimeWindow
پایا پنجره زمانی: صحیح۳۲ = 120تابعها
به عنوان جریان AsStream
تابع به عنوان جریان(c: اتصال): dyn تونل.جریانtunnel.Stream میپیچد تا بتواند حامل پروتکل دیگری باشد یا به کد تونل داده شود.اتصال روی جریان DialOver
تابع اتصال روی جریان(s: dyn تونل.جریان، uuid: رشته، security: صحیح، command: صحیح، target: انتقال شبکه.نشانی): اتصالپذیرش روی جریان AcceptOver
تابع پذیرش روی جریان(s: dyn تونل.جریان، users: وکتور<کاربر>، rf &: فیلتر بازپخش): اتصالچندگانه ساز کارخواه MuxClient
تابع چندگانه ساز کارخواه(c: اتصال): انتقال شبکه.چندگانه سازCmdMux ساخته شده راه میاندازد.چندگانه ساز کارساز MuxServer
تابع چندگانه ساز کارساز(c: اتصال): انتقال شبکه.چندگانه سازCmdMux است راه میاندازد.کاربر جدید NewUser
تابع کاربر جدید(uuid: رشته): کاربرفیلتر بازپخش جدید NewReplayFilter
تابع فیلتر بازپخش جدید(): فیلتر بازپخشگزینه پیش فرض DefaultOption
تابع گزینه پیش فرض(security: صحیح): صحیحامنیت صفر هیچ، برای امنیت هیچ قطعهها، و در غیر این صورت قطعهها و طولهای نقابدار.کارخواه Client
تابع کارخواه(t: انتقال شبکه.اتصال، uuid: رشته، security: صحیح، option: صحیح، command: صحیح، addr: انتقال شبکه.نشانی): اتصالمعتبر نادرست است.شماره گیری Dial
تابع شماره گیری(host: رشته، port: صحیح، s: انتقال شبکه.تنظیمات، uuid: رشته، security: صحیح، command: صحیح، target: انتقال شبکه.نشانی): اتصالtransport.Dial و تنظیمات دادهشده وصل میشود، بعد درخواست را با گزینه پیش فرض و یک کلید نشست تصادفی میفرستد. پاسخ هنوز خوانده نمیشود: کاربر ردشده در اولین خواندن دیده میشود.پذیرش Accept
تابع پذیرش(t: انتقال شبکه.اتصال، users: وکتور<کاربر>، rf &: فیلتر بازپخش): اتصالمعتبر نادرست است، خطا دلیل را میگوید و انتقال بسته میشود.خواندن Read
تابع خواندن(c &: اتصال، buf: تهی*، max: صحیح): صحیحخواندن بسته ReadPacket
تابع خواندن بسته(c &: اتصال، out &: انتقال شبکه.بایتها): منطقیفرمان یو دی پی یک بسته است. وقتی اتصال تمام شود نادرست است.نوشتن Write
تابع نوشتن(c &: اتصال، p: تهی*، n: صحیح): منطقیبستن Close
تابع بستن(c &: اتصال)کدگذاری قطعه ها EncodeChunks
تابع کدگذاری قطعه ها(security: صحیح، option: صحیح، key: انتقال شبکه.بایتها، iv: انتقال شبکه.بایتها، parts: وکتور<انتقال شبکه.بایتها>، with_end: منطقی): انتقال شبکه.بایتهاwith_end درست است با یک قطعهی پایان. برای آزمون و برای پیاده کردن یک گونه.امنیت از نام SecurityByName
تابع امنیت از نام(name: رشته): صحیحaes-128-gcm؛ auto یعنی AES-128-GCM. برای نام ناشناخته -۱.نام امنیت SecurityName
تابع نام امنیت(sec: صحیح): رشتهتجزیه پیوند ParseLink
تابع تجزیه پیوند(link: رشته): پیوندvmess:// را میخواند. معتبر و خطا را بسنجید.قالب پیوند FormatLink
تابع قالب پیوند(l: پیوند): رشتهپیوند را به متن vmess:// مینویسد (Base64 JSON v2rayN).تنظیمات پیوند LinkSettings
تابع تنظیمات پیوند(l: پیوند): انتقال شبکه.تنظیماتتنظیمات انتقالی که پیوند میخواهد.شماره گیری پیوند DialLink
تابع شماره گیری پیوند(l: پیوند، command: صحیح، target: انتقال شبکه.نشانی): اتصالتابع اشتقاق کلید KDF
تابع تابع اشتقاق کلید(key: انتقال شبکه.بایتها، label: رشته، a: انتقال شبکه.بایتها، b: انتقال شبکه.بایتها): انتقال شبکه.بایتهاتابع اشتقاق کلید۱۶ KDF16
تابع تابع اشتقاق کلید۱۶(key: انتقال شبکه.بایتها، label: رشته، a: انتقال شبکه.بایتها، b: انتقال شبکه.بایتها): انتقال شبکه.بایتهاتابع اشتقاق کلید بریده به ۱۶ بایت اول.تابع اشتقاق کلید۱۲ KDF12
تابع تابع اشتقاق کلید۱۲(key: انتقال شبکه.بایتها، label: رشته، a: انتقال شبکه.بایتها، b: انتقال شبکه.بایتها): انتقال شبکه.بایتهاتابع اشتقاق کلید بریده به ۱۲ بایت اول.کلید فرمان CmdKey
تابع کلید فرمان(uuid: انتقال شبکه.بایتها): انتقال شبکه.بایتهاشا۲۵۶ Sha256
تابع شا۲۵۶(data: انتقال شبکه.بایتها): انتقال شبکه.بایتهابلوک ای ای اس۱۲۸ AES128Block
تابع بلوک ای ای اس۱۲۸(key: انتقال شبکه.بایتها، block: انتقال شبکه.بایتها، decrypt: منطقی): انتقال شبکه.بایتهاdecrypt، رمزگشایی میکند.شیک۱۲۸ Shake128
تابع شیک۱۲۸(msg: انتقال شبکه.بایتها، outlen: صحیح): انتقال شبکه.بایتهاoutlen بایت.سی آر سی۳۲ CRC32
تابع سی آر سی۳۲(data: انتقال شبکه.بایتها): صحیح۶۴اف ان وی یک ای FNV1a
تابع اف ان وی یک ای(data: انتقال شبکه.بایتها): صحیح۶۴ساخت شناسه احراز CreateAuthID
تابع ساخت شناسه احراز(cmd_key: انتقال شبکه.بایتها، ts: صحیح۶۴، rand4: انتقال شبکه.بایتها): انتقال شبکه.بایتهاگشودن شناسه احراز OpenAuthID
تابع گشودن شناسه احراز(cmd_key: انتقال شبکه.بایتها، authid: انتقال شبکه.بایتها، ts &: صحیح۶۴): منطقیمهر سرآیند SealHeader
تابع مهر سرآیند(cmd_key: انتقال شبکه.بایتها، data: انتقال شبکه.بایتها، ts: صحیح۶۴، rand4: انتقال شبکه.بایتها، nonce: انتقال شبکه.بایتها): انتقال شبکه.بایتهامهر سرآیند اکنون SealHeaderNow
تابع مهر سرآیند اکنون(cmd_key: انتقال شبکه.بایتها، data: انتقال شبکه.بایتها): انتقال شبکه.بایتهامهر سرآیند با زمان فعلی و بایتهای تصادفی تازه.گشودن طول سرآیند OpenHeaderLength
تابع گشودن طول سرآیند(cmd_key: انتقال شبکه.بایتها، authid: انتقال شبکه.بایتها، enc_len: انتقال شبکه.بایتها، nonce: انتقال شبکه.بایتها): صحیحگشودن سرآیند OpenHeader
تابع گشودن سرآیند(cmd_key: انتقال شبکه.بایتها، authid: انتقال شبکه.بایتها، enc: انتقال شبکه.بایتها، nonce: انتقال شبکه.بایتها): انتقال شبکه.بایتهاخراب در نتیجه درست است.مهر سرآیند پاسخ SealResponseHeader
تابع مهر سرآیند پاسخ(resp_key: انتقال شبکه.بایتها، resp_iv: انتقال شبکه.بایتها، header: انتقال شبکه.بایتها): انتقال شبکه.بایتهاگشودن طول پاسخ OpenResponseLength
تابع گشودن طول پاسخ(resp_key: انتقال شبکه.بایتها، resp_iv: انتقال شبکه.بایتها، enc_len: انتقال شبکه.بایتها): صحیحگشودن سرآیند پاسخ OpenResponseHeader
تابع گشودن سرآیند پاسخ(resp_key: انتقال شبکه.بایتها، resp_iv: انتقال شبکه.بایتها، enc: انتقال شبکه.بایتها): انتقال شبکه.بایتهاخراب در نتیجه درست است.کدگذاری درخواست EncodeRequest
تابع کدگذاری درخواست(r: درخواست): انتقال شبکه.بایتهاtransport.FreeBytes آزاد کنید.کدگشایی درخواست DecodeRequest
تابع کدگشایی درخواست(b: انتقال شبکه.بایتها، r &: درخواست): منطقی