شدوساکس net.shadowsocks
کارخواه و سرور شدوساکس: رمزهای AEAD و شدوساکس ۲۰۲۲، پیوندهای ss://، پوشش simple-obfs، رلهی UDP و اجرا روی هر جریان tunnel.Stream.
واردسازی شبکه.شدوساکس
نام آرگومانها شناسهی خود کد است و معادل فارسی ندارد؛ گونهها، کلیدواژهها و نام بستهها با معادل فارسی نوشته میشوند.
شدوساکس یک پروتکل پراکسی رمزشدهی کوچک است. کارخواه به سرور شدوساکس وصل میشود و میگوید به کدام میزبان و درگاه میخواهد برسد؛ سرور به آنجا وصل میشود و بایتها را در دو جهت میرساند. همهچیز پس از اولین بایت شبیه دادهی تصادفی است، پس دستدهیای برای شناسایی وجود ندارد. این بسته کارخواه و سرور آن را با خود سلام و بدون کتابخانهی بومی پیاده میکند. یکی از بستههای پراکسی است که روی تونل ساخته شده و میتوان آن را به همان مسیریابها و زنجیرههای بقیه وصل کرد.
تابعهای اصلی کماند. برقراری اتصال از راه یک سرور به مقصدی مثل example.com:443 یک اتصال باز میکند و خواندن، نوشتن و بستن مثل هر سوکت دیگری کار میکنند. گوش دادن یک سرور راه میاندازد و خدمت یا خدمت رله به کارخواهها جواب میدهد. پیکربندی نشانی سرور، روش رمز، گذرواژه و پوشش اختیاری پوشش را نگه میدارد. بقیه (بافر، رمزگذار، رمزگشا و تابعهای BLAKE3 و کلید) لایهی پایینی پروتکل است که برای آزمایش یا ساختن قاببندی خودتان عمومی گذاشته شده است.
شروع سریع
این برنامه سروری روی یک درگاه آزاد راه میاندازد، کارخواهی را از راه آن به example.com:443 وصل میکند و یک پیام میفرستد. دستگیره هرگز به example.com وصل نمیشود؛ فقط مقصدی را که کارخواه خواسته با مقصد اتصال میخواند و بایتها را پس میفرستد، پس همهچیز روی رابط محلی میماند. توقف سرور حلقهی پذیرش را بیدار میکند تا خدمت برگردد و نابودی سرور سرور را آزاد میکند.
واردسازی حافظه
واردسازی شبکه.شدوساکس
پایا PASSWORD := "correct horse"
ناپایا srv := شدوساکس.سرور {}
ناپایا seen := ""
تابع answer(c: شدوساکس.اتصال):
t := شدوساکس.مقصد اتصال(c)
seen = t.میزبان + ":" + t.درگاه
buf := حافظه.تخصیص(4096 برگردان طبیعی۶۴)
n := شدوساکس.خواندن(c، buf، 4096)
شدوساکس.نوشتن(c، buf، n)
حافظه.آزادسازی(buf)
شدوساکس.بستن(c)
پایان
تابع serve():
شدوساکس.خدمت(srv، (c: شدوساکس.اتصال): answer(c) پایان)
پایان
تابع ریشه:
srv = شدوساکس.گوش دادن(0، "chacha20-ietf-poly1305"، PASSWORD)
سرچاپ شدوساکس.سرور معتبر(srv)
t := نخساز(serve)
cfg := شدوساکس.پیکربندی { میزبان = "127.0.0.1"، درگاه = شدوساکس.درگاه سرور(srv)، روش = "chacha20-ietf-poly1305"، گذرواژه = PASSWORD }
c := شدوساکس.برقراری اتصال(cfg، "example.com"، 443)
سرچاپ شدوساکس.معتبر(c)
شدوساکس.نوشتن رشته(c، "hello through shadowsocks")
سرچاپ شدوساکس.خواندن رشته(c، 4096)
شدوساکس.بستن(c)
شدوساکس.توقف سرور(srv)
نخپیوند(t)
شدوساکس.نابودی سرور(srv)
سرچاپ "سرور دید"، seen
پایانیک سرور واقعی از خدمت رله استفاده میکند که خودش رساندن را انجام میدهد: برای هر کارخواه به مقصد خواستهشده وصل میشود و بایتها را در دو جهت کپی میکند تا یکی از دو طرف ببندد. مثال بعد جلوی یک سرور پژواک TCP کوچک یک رله میگذارد و پیامی از آن میفرستد.
واردسازی حافظه
واردسازی شبکه.تی سی پی
واردسازی شبکه.شدوساکس
ناپایا target := تی سی پی.سرور {}
ناپایا srv := شدوساکس.سرور {}
تابع echo():
c := تی سی پی.پذیرش(target)
buf := حافظه.تخصیص(4096 برگردان طبیعی۶۴)
n := تی سی پی.خواندن بایت(c، buf، 4096)
تی سی پی.نوشتن بایت(c، buf، n)
حافظه.آزادسازی(buf)
تی سی پی.بستن(c)
پایان
تابع serve():
شدوساکس.خدمت رله(srv)
پایان
تابع ریشه:
target = تی سی پی.پیوند(0)
te := نخساز(echo)
srv = شدوساکس.گوش دادن(0، "aes-256-gcm"، "relay password")
ts := نخساز(serve)
cfg := شدوساکس.پیکربندی { میزبان = "127.0.0.1"، درگاه = شدوساکس.درگاه سرور(srv)، روش = "aes-256-gcm"، گذرواژه = "relay password" }
c := شدوساکس.برقراری اتصال(cfg، "127.0.0.1"، تی سی پی.درگاه(target))
شدوساکس.نوشتن رشته(c، "through the relay")
سرچاپ شدوساکس.خواندن رشته(c، 4096)
شدوساکس.بستن(c)
نخپیوند(te)
شدوساکس.توقف سرور(srv)
نخپیوند(ts)
شدوساکس.نابودی سرور(srv)
تی سی پی.بستن سرور(target)
پایانسمت کارخواه فقط برقراری اتصال با یک پیکربندی است. برقراری اتصال بیدرنگ برمیگردد و منتظر سرور نمیماند: نشانی مقصد همراه اولین بستهی رمزشده و اولین نوشتن شما میرود. پس گذرواژهی غلط را برقراری اتصال گزارش نمیکند؛ سرور اتصال را رها میکند و اولین خواندن شما ۰ یا عددی منفی برمیگرداند. از معتبر برای اتصالی استفاده کنید که حتی شروع نشد (روش ناشناخته یا سرور دستنیافتنی).
رمزها
روش نامی از این جدول است. یافتن روش نام را به یک روش تبدیل میکند و برای نام ناشناخته مقداری با معتبر نادرست برمیگرداند. نام chacha20-poly1305 هم بهعنوان نام دیگر chacha20-ietf-poly1305 پذیرفته میشود. رمزهای جریانی قدیمی مثل rc4-md5 و aes-256-cfb پشتیبانی نمیشوند و نخواهند شد: شکستهاند.
| روش | کلید | نمک | شکل گذرواژه | توضیح |
|---|---|---|---|---|
aes-128-gcm | ۱۶ بایت | ۱۶ بایت | هر متنی | AEAD کلاسیک. اینجا کند است، پایین را ببینید. |
aes-256-gcm | ۳۲ بایت | ۳۲ بایت | هر متنی | AEAD کلاسیک. پیشفرض پیکربندی. اینجا کند است، پایین را ببینید. |
chacha20-ietf-poly1305 | ۳۲ بایت | ۳۲ بایت | هر متنی | AEAD کلاسیک. همین را انتخاب کنید. |
2022-blake3-aes-128-gcm | ۱۶ بایت | ۱۶ بایت | base64 دقیقاً ۱۶ بایت | شدوساکس ۲۰۲۲، TCP و UDP. |
2022-blake3-aes-256-gcm | ۳۲ بایت | ۳۲ بایت | base64 دقیقاً ۳۲ بایت | شدوساکس ۲۰۲۲، TCP و UDP. |
2022-blake3-chacha20-poly1305 | ۳۲ بایت | ۳۲ بایت | base64 دقیقاً ۳۲ بایت | شدوساکس ۲۰۲۲، TCP و UDP. |
واردسازی شبکه.شدوساکس
تابع show(name: رشته):
m := شدوساکس.یافتن روش(name)
سرچاپ m.نام، m.معتبر، m.طول کلید، m.طول نمک، m.نسخه۲۰۲۲
پایان
تابع ریشه:
show("aes-128-gcm")
show("aes-256-gcm")
show("chacha20-ietf-poly1305")
show("2022-blake3-aes-128-gcm")
show("2022-blake3-aes-256-gcm")
show("2022-blake3-chacha20-poly1305")
show("rc4-md5")
پایانبرای سه روش اول، گذرواژه هر متنی است و کلید از آن به شیوهی کلاسیک (بایت به کلید، مبتنی بر MD5) ساخته میشود، پس گذرواژهی بلند و تصادفی بگذارید. برای رمزهای ۲۰۲۲ گذرواژه خود کلید است: باید base64 دقیقاً به اندازهی طول کلید باشد، مثلاً خروجی openssl rand -base64 32. گذرواژهای با طول نادرست باعث میشود ساخت کلید یک بافر با خراب درست برگرداند و گوش دادن یا برقراری اتصال شکست بخورند. رمزهای ۲۰۲۲ با برچسب زمانی (درخواستی که بیش از ۳۰ ثانیه جابهجا باشد رد میشود) و حافظهی نمک جلوی بازپخش را میگیرند و سرآیند اتصال تصدیق میشود.
آنچه وجود ندارد
- UDP شدوساکس ۲۰۲۲ تابعهای خودش را دارد.
بسته بندی یو دی پیوبازکردن یو دی پیبرای روشهای کلاسیکاند و سه روش ۲۰۲۲ را رد میکنند؛ ازPackUdp2022وUnpackUdp2022یا ازگوش دادن یو دی پیواتصال یو دی پیاستفاده کنید که روش درست را خودشان برمیگزینند. - چندکاربره روی یک درگاه (سرآیندهای هویت توسعهپذیر ۲۰۲۲) فقط با دو روش AES نسخهی ۲۰۲۲ کار میکند. روش ChaCha نسخهی ۲۰۲۲ یک کلید میگیرد.
- برای آزمودن سازگاری
simple-obfsو جریان TCP نسخهی ۲۰۲۲ از سرور واقعی استفاده نشده است. آنها با خود این بسته و با بازنویسیهای جداگانهی پایتونی که از روی مشخصات نوشته شدهاند آزموده شدهاند، نه باssserver،shadowsocks-rustیاobfs-serverواقعی. رمزهای AEAD کلاسیک با بردارهای آزمون منتشرشده بررسی شدهاند. روشهای ۲۰۲۲ و پوشش را تازهکار بدانید و پیش از تکیه کردن، با سرور خودتان آزمایش کنید. - AES نرمافزاری (bitsliced، برای جلوگیری از نشت زمانی) انجام میشود و کند است: در آزمونهای اینجا حدود چهار تا پنج برابر کندتر از ChaCha20.
chacha20-ietf-poly1305را ترجیح دهید. - رله نیمبستن (half-close) ندارد: وقتی یک طرف ببندد کل اتصال بسته میشود. پروتکلی که کارخواهش درخواست را با بستن تمام میکند و باز هم پاسخ را میخواند خراب میشود.
- رفتار ضد کاوشگر وجود ندارد: سرور در برابر بستهی اول نادرست، بهجای تخلیهی آن مثل یک وبسرور واقعی، اتصال را فوراً میبندد و کاوشگر میفهمد وبسرور نیست.
- UDP روی IPv4 و IPv6 کار میکند (سوکتهای کارخواه و رله هر دو را میپذیرند؛
UdpListenOn("::"، درگاه)به هر دو خدمت میدهد) و رلهی UDP فیلتر بازپخش ندارد (TCP دارد: حافظهی نمک با ۱۰۰۰۰۰ مدخل). - فقط شکلهای HTTP و TLS در
simple-obfsهست؛v2ray-pluginو افزونههای دیگر نیستند.
پیوند ss:// و گزینههای افزونه
سرورهای شدوساکس به شکل پیوند ss:// دستبهدست میشوند. تجزیه نشانی شکل SIP002 یعنی ss://base64(method:password)@host:port/?plugin=...#tag، شکلی که اطلاعات کاربر در آن متن سادهی درصدگذاریشده است (برای رمزهای ۲۰۲۲) و شکل قدیمی را که کل method:password@host:port در آن base64 است میخواند. یک نشانی برمیگرداند که معتبر آن فقط وقتی درست است که پیوند سالم و روش شناختهشده باشد. قالب بندی نشانی پیوند را دوباره مینویسد (پیوند ۲۰۲۲ با روش و گذرواژهی متنی و بقیه با base64). تبدیل به پیکربندی یک نشانی را به پیکربندیای تبدیل میکند که برقراری اتصال میپذیرد، با گزینههای پوشش افزونه.
متن افزونه نام یک افزونه است و پس از آن گزینههای key=value که با نقطهویرگول جدا میشوند، با بکاسلش برای گریز از نقطهویرگول یا علامت مساوی. تجزیه افزونه آن را به یک افزونه میشکند و گرفتن گزینه افزونه و گزینه افزونه موجود است گزینهها را میخوانند. با آزادسازی افزونه آزادش کنید. تبدیل به پیکربندی نامهای obfs-local و simple-obfs را با گزینههای obfs (مقدار http یا tls) و obfs-host میفهمد؛ هر افزونهی دیگری نادیده گرفته میشود، پس اگر باید ردش کنید خودتان u.افزونه را بررسی کنید.
واردسازی شبکه.شدوساکس
تابع ریشه:
u := شدوساکس.تجزیه نشانی("ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTpzZWNyZXQ@203.0.113.5:8388/?plugin=obfs-local%3Bobfs%3Dtls%3Bobfs-host%3Dcdn.example.com#my%20server")
سرچاپ u.معتبر، u.روش، u.گذرواژه، u.میزبان، u.درگاه، u.برچسب
سرچاپ u.افزونه
p := شدوساکس.تجزیه افزونه(u.افزونه)
سرچاپ p.نام، شدوساکس.گرفتن گزینه افزونه(p، "obfs"، "")، شدوساکس.گزینه افزونه موجود است(p، "obfs-host")، شدوساکس.گزینه افزونه موجود است(p، "missing")
شدوساکس.آزادسازی افزونه(p)
cfg := شدوساکس.تبدیل به پیکربندی(u)
سرچاپ cfg.میزبان، cfg.درگاه، cfg.روش، cfg.پوشش، cfg.میزبان پوشش
سرچاپ شدوساکس.قالب بندی نشانی(u)
bad := شدوساکس.تجزیه نشانی("ss://not-a-link")
سرچاپ bad.معتبر
پایانsimple-obfs
simple-obfs بایتهای اول اتصال شدوساکس را در چیزی شبیه ترافیک عادی وب پنهان میکند و در برابر فیلترهایی که اتصال را از روی بستهی اولش دستهبندی میکنند کمک میکند. در پیکربندی کارخواه پوشش را "http" یا "tls" بگذارید، میزبان پوشش را نام میزبانی که باید نشان داده شود (سرآیند Host یا نام سرور TLS، پیشفرض www.bing.com) و سرور را با گوش دادن با پوشش و همان حالت شروع کنید. دو طرف باید هماهنگ باشند: سروری بدون پوشش کارخواه پوششدار را نمیفهمد و برعکس.
http: بستهی اول کارخواه به شکل یک درخواست HTTP با سرآیند ارتقا به WebSocket فرستاده میشود، سرور با101 Switching Protocolsجواب میدهد و از آن پس داده همانطور که هست رد میشود.tls: بستهی اول کارخواه یک ClientHello جعلی TLS است که داده را در افزونهی بلیت نشست و نام سروری که انتخاب کردهاید میبرد، سرور با یک ServerHello جعلی جواب میدهد و بقیه در رکوردهای دادهی برنامهی TLS پیچیده میشود.
این استتار است نه رمزگذاری: رمز شدوساکس زیر آن همچنان از داده محافظت میکند. دستدهی جعلی ساده است و سانسورچی مصمم میتواند اثر انگشتش را بگیرد؛ در برابر کاوشگر فعال هم اتصال را شبیه یک سایت واقعی نمیکند. حالت پوشش نامها را به ثابتهای بدون پوشش، پوشش اچ تی تی پی و پوشش تی ال اس تبدیل میکند و آماده سازی پوشش، پوشاندن داده، برداشتن پوشش و آزادسازی پوشش قاببندی را برای کار خودتان در دسترس میگذارند.
واردسازی حافظه
واردسازی شبکه.شدوساکس
ناپایا srv := شدوساکس.سرور {}
تابع answer(c: شدوساکس.اتصال):
buf := حافظه.تخصیص(4096 برگردان طبیعی۶۴)
n := شدوساکس.خواندن(c، buf، 4096)
شدوساکس.نوشتن(c، buf، n)
حافظه.آزادسازی(buf)
شدوساکس.بستن(c)
پایان
تابع serve():
شدوساکس.خدمت(srv، (c: شدوساکس.اتصال): answer(c) پایان)
پایان
تابع ریشه:
srv = شدوساکس.گوش دادن با پوشش(0، "chacha20-ietf-poly1305"، "pw"، "http")
t := نخساز(serve)
cfg := شدوساکس.پیکربندی { میزبان = "127.0.0.1"، درگاه = شدوساکس.درگاه سرور(srv)، روش = "chacha20-ietf-poly1305"، گذرواژه = "pw"، پوشش = "http"، میزبان پوشش = "cdn.example.com" }
c := شدوساکس.برقراری اتصال(cfg، "example.com"، 80)
شدوساکس.نوشتن رشته(c، "inside an http disguise")
سرچاپ شدوساکس.خواندن رشته(c، 4096)
شدوساکس.بستن(c)
شدوساکس.توقف سرور(srv)
نخپیوند(t)
شدوساکس.نابودی سرور(srv)
پایانرلهی UDP
شدوساکس UDP را هم میبرد، برای DNS و بازی، هر بار یک دیتاگرام رمزشده: بسته یک نمک تصادفی، نشانی مقصد و محتوا را دارد که یکجا مهر میشوند. گوش دادن یو دی پی رلهای را روی یک درگاه UDP راه میاندازد؛ خدمت یو دی پی تا صدا زدن توقف یو دی پی حلقه میزند و گام یو دی پی یک بسته را رسیدگی میکند و اگر کاری کرد ۱ برمیگرداند تا خودتان آن را براند. رله برای هر کارخواه یک سوکت خروجی نگه میدارد و کارخواه را پس از ۶۰ ثانیه سکوت فراموش میکند. در سمت کارخواه اتصال یو دی پی یک کلاینت یو دی پی میسازد، ارسال یو دی پی محتوایی را از راه رله به مقصدی میفرستد و دریافت یو دی پی پاسخ بعدی و فرستندهاش را میدهد؛ مهلت یو دی پی انتظار را محدود میکند. UDP با سه رمز ۲۰۲۲ هم کار میکند (SIP022): کارخواه یک شناسهی نشست تصادفی برمیگزیند، بستههایش را شماره میزند و ۱۶ بایت نخست هر دیتاگرام همان سرآیند است که جدا رمز میشود (AES-ECB برای روشهای AES و یک نانس XChaCha20-Poly1305 برای ChaCha). بستهها زمانمهر دارند که باید در ۳۰ ثانیه باشد و رله هر شناسهی بستهای را که در پنجرهی ۶۴ بستهای دیده باشد کنار میگذارد. روشهای کلاسیک در رله فیلتر نمک دارند، پس دیتاگرام ضبطشده یک بار پاسخ میگیرد. مقصد UDP باید IPv4 یا نام دامنه باشد.
واردسازی حافظه
واردسازی رشته
واردسازی شبکه.یو دی پی
واردسازی شبکه.شدوساکس
ناپایا echo_sock := یو دی پی.سوکت یو دی پی {}
ناپایا relay := شدوساکس.سرور یو دی پی {}
تابع echo():
buf := حافظه.تخصیص(2000 برگردان طبیعی۶۴)
ناپایا host := ""
ناپایا port := 0
n := یو دی پی.دریافت بایت(echo_sock، buf، 2000، host، port)
یو دی پی.ارسال بایت(echo_sock، host، port، buf، n)
حافظه.آزادسازی(buf)
پایان
تابع serve():
شدوساکس.خدمت یو دی پی(relay)
پایان
تابع ریشه:
echo_sock = یو دی پی.پیوند(0)
relay = شدوساکس.گوش دادن یو دی پی(0، "chacha20-ietf-poly1305"، "udp password")
te := نخساز(echo)
ts := نخساز(serve)
cfg := شدوساکس.پیکربندی { میزبان = "127.0.0.1"، درگاه = شدوساکس.درگاه سرور یو دی پی(relay)، روش = "chacha20-ietf-poly1305"، گذرواژه = "udp password" }
c := شدوساکس.اتصال یو دی پی(cfg)
شدوساکس.مهلت یو دی پی(c، 3000)
شدوساکس.ارسال یو دی پی(c، "127.0.0.1"، یو دی پی.درگاه(echo_sock)، "ping" برگردان تهی*، 4)
buf := حافظه.تخصیص صفرشده(2000 برگردان طبیعی۶۴)
ناپایا from := شدوساکس.مقصد {}
n := شدوساکس.دریافت یو دی پی(c، buf، 1999، from)
سرچاپ رشته.زیررشته(buf برگردان رشته، 0، n)، from.میزبان، from.درگاه برابر یو دی پی.درگاه(echo_sock)
حافظه.آزادسازی(buf)
نخپیوند(te)
شدوساکس.توقف یو دی پی(relay)
نخپیوند(ts)
شدوساکس.بستن یو دی پی(c)
شدوساکس.نابودی یو دی پی(relay)
یو دی پی.بستن(echo_sock)
پایانچند کاربر روی یک سرور ۲۰۲۲
یک سرور ۲۰۲۲ با AES میتواند به چند کاربر سرویس دهد و هر کدام کلید خودشان را دارند. کلید خود سرور را گذرواژه بدهید و برای هر کلید کاربر یک بار افزودن کاربر (برای UDP افزودن کاربر یو دی پی) را صدا بزنید. کارخواه با گذرواژهی کلیدسرور:کلیدکاربر وصل میشود: یک سرآیند هویت میفرستد که کاربرش را بدون فاش کردن کلید نام میبرد و سرور کلید همان کاربر را برای نشست برمیدارد. زنجیره از، مهر سرآیند هویت و گشودن سرآیند هویت قطعههای زیریناند. روش ChaCha ۲۰۲۲ سرآیند هویت ندارد و یک کلید میگیرد. گوش دادن روی نشانی و گوش دادن یو دی پی روی نشانی به جای همهی رابطها فقط به یک نشانی، مثلاً 127.0.0.1، میبندند. وقتی دستدهی شکست میخورد سرور سوکت را ۱٫۵ تا ۴٫۵ ثانیهی تصادفی باز نگه میدارد و آنچه فرستاده میشود را میخواند، پس کاوشگر نمیتواند رد شدن را از کندی سرور تشخیص دهد. رله نیمبستن (half-close) را در هر دو جهت میرساند: وقتی یک سو فرستادن را تمام کند سوی دیگر آگاه میشود و باز میتواند پاسخ دهد.
اجرا روی tunnel.Stream
کارخواه معمولاً با TCP به سرورش وصل میشود، ولی اتصال روی جریان هر tunnel.Stream را میپذیرد: یک WebSocket، یک اتصال TLS، خروجی یک گام پراکسی دیگر یا جریانی که خودتان ساختهاید. سمت سرور پذیرش روی جریان را دارد. در هر دو حالت لایهی شدوساکس جریان را همان سیم میداند، پس میتوانید شدوساکس را درون یکی از حالتهای انتقال شبکه یا پشت یک زنجیرهی پراکسی از تونل بگذارید. به عنوان جریان برعکسش است: یک اتصال را به tunnel.Stream تبدیل میکند تا اتصال شدوساکس را بتوان به هر چیزی که جریان میگیرد داد، مثل خروجی یک مسیریاب یا لایهی پروتکل دیگر.
واردسازی حافظه
واردسازی همگام سازی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی شبکه.شدوساکس
ناپایا port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()
تابع server():
carrier := تی سی پی.پیوند(0)
port = تی سی پی.درگاه(carrier)
srv := شدوساکس.گوش دادن(0، "aes-128-gcm"، "inner")
همگام سازی.اتمام(ready)
raw := تی سی پی.پذیرش(carrier)
c := شدوساکس.پذیرش روی جریان(srv، تونل.جریان تی سی پی { اتصال = raw })
اگر شدوساکس.معتبر(c):
buf := حافظه.تخصیص(4096 برگردان طبیعی۶۴)
n := شدوساکس.خواندن(c، buf، 4096)
شدوساکس.نوشتن(c، buf، n)
حافظه.آزادسازی(buf)
شدوساکس.بستن(c)
پایان
شدوساکس.نابودی سرور(srv)
تی سی پی.بستن سرور(carrier)
پایان
تابع ریشه:
همگام سازی.افزودن(ready، 1 برگردان صحیح۶۴)
t := نخساز(server)
همگام سازی.انتظار(ready)
link := تونل.جریان تی سی پی { اتصال = تی سی پی.شماره گیری("127.0.0.1"، port) }
cfg := شدوساکس.پیکربندی { روش = "aes-128-gcm"، گذرواژه = "inner" }
c := شدوساکس.اتصال روی جریان(link، cfg، "example.com"، 443)
شدوساکس.نوشتن رشته(c، "any stream will do")
سرچاپ شدوساکس.خواندن رشته(c، 4096)
s := شدوساکس.به عنوان جریان(c)
سرچاپ s.معتبر()
شدوساکس.بستن(c)
نخپیوند(t)
پایانلایهی قاببندی
لایهی پایین بسته عمومی است. یک رمزگذار جریان بایت را به تکههای AEAD با پیشوند طول مهر میکند (اول ارسال نمک، بعد رمزگذاری جریان)؛ یک رمزگشا بایتها را هر وقت رسیدند با خوراندن میگیرد و متن ساده را با تکه بعدی یا یکجا با رمزگشایی همه میدهد. رمزگذاری مقصد و تجزیه مقصد سرآیند نشانی را مینویسند و میخوانند (نوع آدرس آی پی۴، نوع آدرس دامنه، نوع آدرس آی پی۶) و بسته بندی یو دی پی و بازکردن یو دی پی همین کار را برای یک دیتاگرام میکنند. بافر بافر بایت قابلرشدی است که همه از آن استفاده میکنند: مالکش شمایید، با آزادسازی بافر آزادش کنید و مواد کلیدی را پیش از آن با پاکسازی بافر پاک کنید. پروتکل با همینها و با بردارهای شناختهشده آزموده میشود، و شما هم میتوانید با آنها بخش جلویی سفارشی خودتان را بنویسید.
مثال زیر بافر در ادامه یک رفتوبرگشت کامل را اجرا میکند: یک جریان را مهر و دوباره باز میکند، سرآیند نشانی را مینویسد و میخواند و یک دیتاگرام UDP را بستهبندی و باز میکند.
نکتههای کاربردی برای ایران
اینها توصیههایی برای کسانی است که برای شبکههای با فیلترینگ سنگین ابزار میسازند. از روی نحوهی کار پروتکل آمدهاند، نه از آزمون روی یک اپراتور مشخص، و آنچه کار میکند ماه به ماه عوض میشود.
- ChaCha20 را انتخاب کنید. مگر اینکه سر دیگر چیز دیگری بدهد،
chacha20-ietf-poly1305را به کار ببرید. با فاصلهی زیاد سریعترین رمز اینجاست و امنیتش با AES-GCM یکی است. روش ۲۰۲۲ را فقط وقتی انتخاب کنید که سرورتان هم آن را بفهمد و بتوانید سرتاسری آزمایشش کنید؛ بهترین طراحی را دارد (ضد بازپخش، سرآیند تصدیقشده) ولی کمترین آزمون سازگاری را. - گذرواژهی بلند و تصادفی بگذارید برای روشهای کلاسیک، دستکم ۲۰ نویسه از یک مولد گذرواژه. گذرواژهی کوتاه را میشود از اتصال ضبطشده بهصورت آفلاین حدس زد.
- به شدوساکس خالی تکیه نکنید. ترافیک تصادفینما روی درگاهی غیرمعمول خودش نشانه است و نبودن پاسخ ضد کاوشگر شناساییاش را آسانتر میکند. آن را روی درگاه ۴۴۳ و پشت انتقالی بگذارید که شبیه یک وبسایت است (WebSocket روی TLS با
اتصال روی جریانوپذیرش روی جریان)، یاsimple-obfsرا باtlsو نام میزبانی به کار ببرید که در آن شبکه مجاز و رایج است. - از مسیریاب تونل استفاده کنید. تونل قاعدههای مسیریابی با پیشتنظیم ایران دارد: سایتهای داخلی مستقیم میروند و بقیه از پراکسی، پس شبکهی محلی کند نمیشود و سایتهای داخلی نشانی خارجی نمیبینند. از یک
پیکربندییک خروجی شدوساکس بسازید، آن را هر جا شمارهگیر جریان میخواهد بابه عنوان جریانبپیچید و بگذارید مسیریاب انتخاب کند. برای ورودی محلی SOCKS یا HTTP به ساکس و پراکسی اچتیتیپی نگاه کنید. - نامها را از راه دور حل کنید. نام میزبان را به
برقراری اتصالبدهید و بگذارید سرور حلش کند؛ اول بهصورت محلی حلش نکنید وگرنه جستجو نشت میکند. وقتی جستجوی محلی ناگزیر است، DoH آن را روی HTTPS میفرستد. - اشتراکگذاری را امن نگه دارید. پیوند گذرواژه را جز base64 بیپوشش میبرد: از کانال خصوصی بفرستید و سرورهایی را که میخواهید زنده بمانند منتشر نکنید.
گونهها
فیلتر نمک SaltFilter
ساختار فیلتر نمک| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نسل جاری | cur | نگاشت<رشته، منطقی> | نسل جاری نمکهای دیدهشده. |
| نسل پیشین | old | نگاشت<رشته، منطقی> | نسل پیشین که با پر شدن نسل جاری دور ریخته میشود. |
| ظرفیت | cap | صحیح = 0 | هر نسل چند نمک نگه میدارد. |
| قفل | lock | همگام سازی.قفل | قفلی که از هر دو نسل نگهبانی میکند. |
// زبان: فارسی
واردسازی شبکه.شدوساکس
تابع ریشه:
ناپایا f := شدوساکس.فیلتر نمک جدید(1000)
a := "salt number one, 32 bytes long.."
b := "salt number two, 32 bytes long.."
سرچاپ f.ظرفیت، شدوساکس.نمک دیده شده(f، a برگردان تهی*، 32)
سرچاپ شدوساکس.بررسی فیلتر(f، a برگردان تهی*، 32)، شدوساکس.نمک دیده شده(f، a برگردان تهی*، 32)
سرچاپ شدوساکس.بررسی فیلتر(f، a برگردان تهی*، 32)، شدوساکس.بررسی فیلتر(f، b برگردان تهی*، 32)
سرچاپ f.نسل جاری.اندازه()، f.نسل پیشین.اندازه()
شدوساکس.آزادسازی فیلتر(f)
پایانزنجیره کلید KeyChain
ساختار زنجیره کلیدserverkey:userkey نوشته شده، جدا و رمزگشاییشده در یک بافر از کلیدهای هماندازه.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| کلیدها | keys | بافر | همهی کلیدها پشت سر هم، هر کدام key_len بایت. |
| تعداد | count | صحیح = 0 | چند کلید هست. |
| طول کلید | key_len | صحیح = 0 | طول یک کلید به بایت. |
| معتبر | ok | منطقی = نادرست | اگر روش سرآیند هویت نداشته باشد یا بخشی از گذرواژه کلید معتبر نباشد نادرست است. |
// زبان: فارسی
واردسازی حافظه
واردسازی شبکه.شدوساکس
تابع ریشه:
سرچاپ شدوساکس.طول سرآیند هویت، شدوساکس.زمینه هویت
m := شدوساکس.یافتن روش("2022-blake3-aes-128-gcm")
ناپایا chain := شدوساکس.زنجیره از(m، "AAECAwQFBgcICQoLDA0ODw==:EBESExQVFhcYGRobHB0eHw==")
سرچاپ chain.معتبر، chain.تعداد، chain.طول کلید، chain.کلیدها.طول
سرچاپ شدوساکس.بافر به هگز(شدوساکس.بافر { اشاره گر = شدوساکس.کلید زنجیره(chain، 1)، طول = 16، ظرفیت = 16 })
bad := شدوساکس.زنجیره از(m، "not a key")
سرچاپ bad.معتبر، bad.تعداد
ipsk := شدوساکس.کلید زنجیره(chain، 0)
upsk := شدوساکس.کلید زنجیره(chain، 1)
h := حافظه.تخصیص صفرشده(16 برگردان طبیعی۶۴)
شدوساکس.هش هویت(upsk، m.طول کلید، h)
سرچاپ شدوساکس.هگز از(h، 16)
salt := حافظه.تخصیص صفرشده(16 برگردان طبیعی۶۴)
ik := حافظه.تخصیص صفرشده(16 برگردان طبیعی۶۴)
شدوساکس.کلید هویت(ipsk، m.طول کلید، salt، m.طول نمک، ik)
سرچاپ شدوساکس.هگز از(ik، 16)
block := حافظه.تخصیص صفرشده(16 برگردان طبیعی۶۴)
سرچاپ شدوساکس.مهر سرآیند هویت(ipsk، m.طول کلید، salt، m.طول نمک، upsk، block)
سرچاپ شدوساکس.هگز از(block، 16)
opened := حافظه.تخصیص صفرشده(16 برگردان طبیعی۶۴)
سرچاپ شدوساکس.گشودن سرآیند هویت(ipsk، m.طول کلید، salt، m.طول نمک، block، opened)
سرچاپ شدوساکس.هگز از(opened، 16) برابر شدوساکس.هگز از(h، 16)
شدوساکس.آزادسازی زنجیره(chain)
سرچاپ chain.معتبر، chain.تعداد
حافظه.آزادسازی(h)
حافظه.آزادسازی(salt)
حافظه.آزادسازی(ik)
حافظه.آزادسازی(block)
حافظه.آزادسازی(opened)
پایانپیکربندی Config
ساختار پیکربندیبرقراری اتصال، اتصال روی جریان یا اتصال یو دی پی بدهید.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| میزبان | host | رشته = "" | نام یا نشانی میزبان سرور. اتصال روی جریان از آن استفاده نمیکند. |
| درگاه | port | صحیح = 0 | درگاه سرور. اتصال روی جریان از آن استفاده نمیکند. |
| روش | method | رشته = "aes-256-gcm" | نام روش رمز. پیشفرض aes-256-gcm است؛ chacha20-ietf-poly1305 را ترجیح دهید. |
| گذرواژه | password | رشته = "" | گذرواژه؛ برای روش ۲۰۲۲ base64 کلید. |
| پوشش | obfs | رشته = "" | http، tls یا خالی برای بدون simple-obfs. |
| میزبان پوشش | obfs_host | رشته = "www.bing.com" | نام میزبانی که استتار نشان میدهد. پیشفرض www.bing.com است. |
وضعیت اتصال ConnState
ساختار وضعیت اتصالاتصال دارید.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| سوکت | sock | تی سی پی.اتصال شبکه | سوکت TCP، وقتی اتصال روی جریان نیست. |
| روش | method | روش | روش رمز. |
| کلید | key | بافر | کلید اصلی. |
| رمزگذار | enc | رمزگذار | رمزگذار دادهی ارسالی. |
| رمزگشا | dec | رمزگشا | رمزگشای دادهی دریافتی. |
| متن ساده | plain | بافر | بایتهای رمزگشاییشده که هنوز خوانده نشدهاند. |
| موقعیت متن ساده | plain_pos | صحیح = 0 | چقدر از plain خوانده شده است. |
| خروجی | out | بافر | بافر موقت برای بایتهایی که میخواهند فرستاده شوند. |
| خواندن | rd | تهی* | بافر دریافت. |
| سرآیند معلق | pending | بافر | سرآیند نشانی که تا اولین نوشتن نگه داشته میشود. |
| مقصد | target | مقصد | مقصد اتصال: خواستهی کارخواه، یا آنچه سرور خوانده است. |
| پوشش | obfs | پوشش | لایهی استتار. |
| جریان زیرین | up | dyn تونل.جریان | جریان زیرین، وقتی use_up درست است. |
| استفاده از جریان زیرین | use_up | منطقی = نادرست | وقتی اتصال روی جریان است و نه سوکت درست است. |
| خروجی پوشش | obuf | بافر | بافر موقت برای خروجی استتارشده. |
| ورودی پوشش | oin | بافر | بایتهای خام دریافتی پیش از برداشتن استتار. |
| خواندن خام | rd2 | تهی* | بافر دریافت خام. |
| نسخه۲۰۲۲ | v2022 | منطقی = نادرست | برای روش ۲۰۲۲ درست است. |
| سمت سرور | is_server | منطقی = نادرست | در سمت سرور درست است. |
| مرحله نوشتن | wphase | صحیح = 0 | مرحلهی دستدهی سمت نوشتن. |
| مرحله خواندن | rphase | صحیح = 0 | مرحلهی دستدهی سمت خواندن. |
| طول نخستین | first_len | صحیح = 0 | طولی که سرآیند اول ۲۰۲۲ اعلام کرد. |
| مقصد دریافت شد | target_ok | منطقی = نادرست | پس از دریافت مقصد درست است. |
| موقت متغیر | vtmp | بافر | بافر موقت برای سرآیند ۲۰۲۲. |
| زنده | live | منطقی = نادرست | تا وقتی اتصال باز است درست است. |
| سرآیند هویت | eih | بافر | کلیدهای هویت یک گذرواژهی serverkey:userkey، همهی کلیدها جز آخرین، پشت سر هم. |
| تعداد سرآیند هویت | eih_n | صحیح = 0 | eih چند کلید هویت دارد. |
| سرآیند هویت خوانده شد | eih_done | منطقی = نادرست | در سرور، پس از باز شدن سرآیند هویت کارخواه و به کار افتادن کلید کاربرش درست میشود. |
| کاربر | user | رشته = "" | در سرور، نام کاربری که سرآیند هویت نام برده است؛ وگرنه خالی. |
اتصال Conn
ساختار اتصالوضعیت اتصال خودش دارد؛ با اشارهگر تهی اتصال قابل استفاده نیست.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| وضعیت | st | وضعیت اتصال* | وضعیت اتصال، یا تهی وقتی ساخته نشد. |
نشست یو دی پی UdpSession
ساختار نشست یو دی پی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| شناسه نشست | sid | صحیح۶۴ = 0 | شناسهی نشست ۶۴ بیتی و تصادفی این سو. |
| شناسه بسته | pid | صحیح۶۴ = 0 | شمارهی بستهی بعدی که این سو میفرستد. |
| شناسه نشست همتا | peer | صحیح۶۴ = 0 | شناسهی نشست سوی دیگر که از نخستین بستهی معتبرش آموخته میشود؛ تا آن زمان ۰. |
| بالاترین شناسه | top | صحیح۶۴ = 0 | بالاترین شمارهی بستهای که تا کنون پذیرفته شده است. |
| بیت های پنجره | bits | طبیعی۶۴ = 0 | پنجرهی ضدتکرار: بیت k وقتی روشن است که بستهی شمارهی top منهای k دیده شده باشد، در ۶۴ بستهی آخر. |
| بسته دریافت شد | any | منطقی = نادرست | پس از پذیرفتن نخستین بسته درست میشود تا top و bits معنا داشته باشند. |
| آخرین شناسه دریافتی | last | صحیح۶۴ = 0 | شمارهی بستهی آخرین دیتاگرامی که باز شده است. |
// زبان: فارسی
واردسازی شبکه.شدوساکس
تابع ریشه:
m := شدوساکس.یافتن روش("2022-blake3-aes-128-gcm")
سرچاپ m.معتبر، m.نسخه۲۰۲۲، m.طول کلید
ناپایا key := شدوساکس.ساخت کلید(m، "AAECAwQFBgcICQoLDA0ODw==")
سرچاپ key.طول
ناپایا client := شدوساکس.نشست یو دی پی جدید()
ناپایا server := شدوساکس.نشست یو دی پی {}
سرچاپ client.شناسه نشست نابرابر 0، server.بسته دریافت شد
ناپایا packet := شدوساکس.بافر جدید(256)
سرچاپ شدوساکس.بسته بندی یو دی پی نسخه جدید(m، key.اشاره گر، key.اشاره گر، شدوساکس.بافر {}، 0، client، درست، "10.0.0.7"، 53، "query" برگردان تهی*، 5، packet)، packet.طول بزرگتر 60
ناپایا sid := 0 برگردان صحیح۶۴
سرچاپ شدوساکس.نگاه به یو دی پی نسخه جدید(m، key.اشاره گر، packet.اشاره گر، packet.طول، sid)، sid برابر client.شناسه نشست
ناپایا target := شدوساکس.مقصد {}
ناپایا body := شدوساکس.بافر جدید(64)
سرچاپ شدوساکس.بازکردن یو دی پی نسخه جدید(m، key.اشاره گر، key.اشاره گر، 0، نادرست، packet.اشاره گر، packet.طول، server، target، body)، target.میزبان، target.درگاه، شدوساکس.بافر به رشته(body)
سرچاپ server.شناسه نشست همتا برابر client.شناسه نشست، server.آخرین شناسه دریافتی
سرچاپ شدوساکس.پذیرش شناسه بسته(server، 5)، شدوساکس.پذیرش شناسه بسته(server، 5)، شدوساکس.پذیرش شناسه بسته(server، 3)، server.بالاترین شناسه، server.بسته دریافت شد
ناپایا chain := شدوساکس.زنجیره از(m، "AAECAwQFBgcICQoLDA0ODw==:EBESExQVFhcYGRobHB0eHw==")
ipsk := شدوساکس.کلید زنجیره(chain، 0)
upsk := شدوساکس.کلید زنجیره(chain، 1)
ناپایا multi := شدوساکس.نشست یو دی پی { شناسه نشست = 7 برگردان صحیح۶۴ }
ناپایا wire := شدوساکس.بافر جدید(256)
سرچاپ شدوساکس.بسته بندی یو دی پی نسخه جدید(m، upsk، ipsk، chain.کلیدها، 1، multi، درست، "10.0.0.8"، 443، "hello" برگردان تهی*، 5، wire)
ناپایا who := شدوساکس.بافر جدید(16)
who.طول = 16
سرچاپ شدوساکس.هویت یو دی پی نسخه جدید(m، ipsk، wire.اشاره گر، wire.طول، who.اشاره گر)
ناپایا expected := شدوساکس.بافر جدید(16)
expected.طول = 16
شدوساکس.هش هویت(upsk، m.طول کلید، expected.اشاره گر)
سرچاپ شدوساکس.بافر به هگز(who) برابر شدوساکس.بافر به هگز(expected)
ناپایا seen := شدوساکس.نشست یو دی پی {}
ناپایا inner := شدوساکس.بافر جدید(64)
سرچاپ شدوساکس.بازکردن یو دی پی نسخه جدید(m، upsk، ipsk، شدوساکس.طول سرآیند هویت، نادرست، wire.اشاره گر، wire.طول، seen، target، inner)، شدوساکس.بافر به رشته(inner)
شدوساکس.آزادسازی بافر(wire)
شدوساکس.آزادسازی بافر(who)
شدوساکس.آزادسازی بافر(expected)
شدوساکس.آزادسازی بافر(inner)
شدوساکس.آزادسازی زنجیره(chain)
شدوساکس.آزادسازی بافر(packet)
شدوساکس.آزادسازی بافر(body)
شدوساکس.پاکسازی بافر(key)
شدوساکس.آزادسازی بافر(key)
پایانافزونه Plugin
ساختار افزونه| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نام | name | رشته = "" | نام افزونه، مثل obfs-local. |
| کلیدها | keys | وکتور<رشته> | نام گزینهها. |
| مقدارها | values | وکتور<رشته> | مقدار گزینهها به همان ترتیب keys؛ برای گزینهی بیمقدار خالی. |
نشانی Uri
ساختار نشانیss:// تجزیهشده.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| روش | method | رشته = "" | نام روش رمز. |
| گذرواژه | password | رشته = "" | گذرواژه، یا کلید base64 برای روش ۲۰۲۲. |
| میزبان | host | رشته = "" | نام یا نشانی میزبان سرور (IPv6 بدون کروشه). |
| درگاه | port | صحیح = 0 | درگاه سرور. |
| افزونه | plugin | رشته = "" | متن خام افزونه، خالی وقتی پیوند افزونه ندارد. |
| برچسب | tag | رشته = "" | نام پس از #، رمزگشاییشده. |
| معتبر | ok | منطقی = نادرست | درست وقتی پیوند تجزیه شد و روش را این بسته پشتیبانی میکند. |
پوشش Obfs
ساختار پوششsimple-obfs یک اتصال.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| حالت | mode | صحیح = 0 | یکی از ثابتهای OBFS_. |
| سمت سرور | server | منطقی = نادرست | در سمت سرور درست است. |
| میزبان | host | رشته = "" | نام میزبانی که در درخواست یا hello جعلی نشان داده میشود. |
| ارسال نخست انجام شد | sent_first | منطقی = نادرست | پس از فرستادن بستهی اول درست است. |
| دریافت نخست انجام شد | got_first | منطقی = نادرست | پس از دریافت و بررسی بستهی اول درست است. |
| پیام آغاز دیده شد | seen_hello | منطقی = نادرست | پس از خواندن رکورد hello جعلی TLS درست میشود تا رکورد دستدهی بعدی آغاز داده شمرده شود. |
| دریافتی | rx | بافر | بایتهای دریافتی که هنوز یک رکورد کامل نشدهاند. |
| باقیمانده قاب | frame_left | صحیح = 0 | چند بایت از رکورد جاری TLS مانده است. |
| کلید وب سوکت | ws_key | رشته = "" | کلید WebSocket در ارتقای جعلی HTTP. |
مقصد Target
ساختار مقصد| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| میزبان | host | رشته = "" | نام میزبان یا نشانی IP بهصورت متن. |
| درگاه | port | صحیح = 0 | درگاه. |
واردسازی شبکه.شدوساکس
تابع ریشه:
m := شدوساکس.یافتن روش("chacha20-ietf-poly1305")
ناپایا key := شدوساکس.ساخت کلید(m، "codec password")
ناپایا enc := شدوساکس.رمزگذار جدید تصادفی(m، key.اشاره گر)
ناپایا wire := شدوساکس.بافر جدید(256)
شدوساکس.ارسال نمک(enc، wire)
شدوساکس.رمزگذاری جریان(enc، "hello codec" برگردان تهی*، 11، wire)
سرچاپ "wire bytes"، wire.طول، "salt"، m.طول نمک، "overhead"، wire.طول - 11 - m.طول نمک
ناپایا dec := شدوساکس.رمزگشا جدید(m، key.اشاره گر)
ناپایا plain := شدوساکس.بافر جدید(64)
سرچاپ شدوساکس.رمزگشایی همه(dec، wire.اشاره گر، wire.طول، plain)، شدوساکس.بافر به رشته(plain)
ناپایا head := شدوساکس.بافر جدید(64)
سرچاپ شدوساکس.رمزگذاری مقصد("example.com"، 8443، head)، head.طول، شدوساکس.بافر به هگز(head)
ناپایا t := شدوساکس.مقصد {}
used := شدوساکس.تجزیه مقصد(head.اشاره گر، head.طول، t)
سرچاپ used، t.میزبان، t.درگاه
ناپایا packet := شدوساکس.بافر جدید(128)
سرچاپ شدوساکس.بسته بندی یو دی پی(m، key.اشاره گر، "10.0.0.7"، 53، "query" برگردان تهی*، 5، packet)، packet.طول
ناپایا got := شدوساکس.مقصد {}
ناپایا body := شدوساکس.بافر جدید(64)
سرچاپ شدوساکس.بازکردن یو دی پی(m، key.اشاره گر، packet.اشاره گر، packet.طول، got، body)، got.میزبان، got.درگاه، شدوساکس.بافر به رشته(body)
شدوساکس.آزادسازی رمزگذار(enc)
شدوساکس.آزادسازی رمزگشا(dec)
شدوساکس.آزادسازی بافر(wire)
شدوساکس.آزادسازی بافر(plain)
شدوساکس.آزادسازی بافر(head)
شدوساکس.آزادسازی بافر(packet)
شدوساکس.آزادسازی بافر(body)
شدوساکس.پاکسازی بافر(key)
شدوساکس.آزادسازی بافر(key)
پایانبافر Buf
ساختار بافرآزادسازی بافر آزادش کنید.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| اشاره گر | p | تهی* | ابتدای حافظه. |
| طول | len | صحیح = 0 | چند بایت در حال استفاده است. |
| ظرفیت | cap | صحیح = 0 | چند بایت تخصیص داده شده است. |
| خراب | bad | منطقی = نادرست | پس از شکست تخصیص یا خطای تجزیه درست است؛ دیگر نباید به بافر اعتماد کرد. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
رمزگذار Encoder
ساختار رمزگذار| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| روش | method | روش | روش رمز. |
| زمینه | ctx | تهی* | زمینهی AEAD که کلید نشست را دارد. |
| نانس | nonce | تهی* | شمارندهی ۱۲ بایتی که nonce است و با هر تکهی مهرشده بالا میرود. |
| نمک | salt | بافر | نمک تصادفی این جهت. |
| نمک فرستاده شد | salt_sent | منطقی = نادرست | پس از فرستادن نمک درست است. |
| بیشینه تکه | max_chunk | صحیح = 16383 | بزرگترین محتوای یک تکه: ۱۶۳۸۳ بایت، یا ۶۵۵۳۵ برای روشهای ۲۰۲۲. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
رمزگشا Decoder
ساختار رمزگشا| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| روش | method | روش | روش رمز. |
| کلید اصلی | master | تهی* | کلید اصلی که کلید نشست از آن مشتق میشود. |
| زمینه | ctx | تهی* | زمینهی AEAD که با رسیدن نمک ساخته میشود. |
| نانس | nonce | تهی* | شمارندهی ۱۲ بایتی که nonce است. |
| نمک | salt | بافر | نمکی که از ابتدای جریان خوانده شد. |
| نمک دریافت شد | have_salt | منطقی = نادرست | پس از خواندن نمک درست است. |
| ورودی | inb | بافر | بایتهای دریافتی که هنوز استفاده نشدهاند. |
| جابجایی | off | صحیح = 0 | جابهجایی خواندن در inb. |
| نیاز | need | صحیح = -1 | تکهی بعدی چند بایت لازم دارد، یا ۱- وقتی هنوز معلوم نیست. |
| موقت | tmp | بافر | بافر موقت برای فیلد طول. |
| خراب | bad | منطقی = نادرست | پس از شکست تصدیق درست است؛ جریان دیگر قابل استفاده نیست. |
| بیشینه تکه | max_chunk | صحیح = 16383 | بزرگترین اندازهی تکهی پذیرفتهشده. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
وضعیت سرور ServerState
ساختار وضعیت سرورسرور میگیرید و فقط دستبهدستش میکنید.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| شنونده | ls | تی سی پی.سرور | سوکت TCP شنونده. |
| میزبان شنود | host | رشته = "" | نشانیای که سرور روی آن گوش میدهد؛ خالی یعنی همهی رابطهای IPv4. توقف از آن برای بیدار کردن حلقهی پذیرش استفاده میکند. |
| روش | method | روش | رمزی که سرور به کار میبرد. |
| کلید | key | بافر | کلید اصلی، ساختهشده از گذرواژه. |
| فیلتر | filter | فیلتر نمک | حافظهی نمک که اتصال بازپخششده را رد میکند. |
| کارگرها | workers | استخر.استخر نخ | استخر نخهایی که دستگیرهی کارخواهها را اجرا میکنند. |
| توقف | stop | صحیح۶۴* | پرچمی که به خدمت میگوید بایستد؛ توقف سرور آن را میگذارد. |
| صف اتصال ها | jobs | کانال.کانال<صحیح۶۴> | صف اتصالهای پذیرفتهشده که منتظر کارگرند. |
| حالت پوشش | obfs_mode | رشته = "" | حالت پوشش: http، tls یا خالی برای هیچ. |
| کاربران | users | نگاشت<رشته، بافر> | کلید کاربرانی که با AddUser افزوده شدهاند، به هگز چکیدهای که کاربر را در سرآیند هویت نام میبرد. |
| نام کاربران | user_names | نگاشت<رشته، رشته> | نام همان کاربران، با همان هگز. |
| تعداد کاربران | user_n | صحیح = 0 | چند کاربر افزوده شده است. |
// زبان: فارسی
واردسازی شبکه.شدوساکس
تابع ریشه:
server := شدوساکس.گوش دادن روی نشانی("::1"، 0، "aes-256-gcm"، "secret"، "")
سرچاپ شدوساکس.سرور معتبر(server)، server.وضعیت.میزبان شنود
شدوساکس.توقف سرور(server)
شدوساکس.نابودی سرور(server)
پایانسرور Server
ساختار سروروضعیت سرور خودش دارد؛ مقدار صفر (st تهی) یعنی سرور راه نیفتاد.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| وضعیت | st | وضعیت سرور* | وضعیت سرور، یا تهی وقتی گوش دادن شکست خورد. |
روش Method
ساختار روش| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نام | name | رشته = "" | نام روش، با نامهای دیگر حلشده. |
| نوع | kind | صحیح = 0 | نوع AEAD، همانطور که net.tls مینامد. |
| طول کلید | key_len | صحیح = 0 | طول کلید به بایت، ۱۶ یا ۳۲. |
| طول نمک | salt_len | صحیح = 0 | طول نمک به بایت، ۱۶ یا ۳۲. |
| نسخه۲۰۲۲ | v2022 | منطقی = نادرست | برای روشهای ۲۰۲۲ درست است. |
| معتبر | ok | منطقی = نادرست | درست وقتی نام یک روش شناختهشده بود. |
کلاینت یو دی پی UdpClient
ساختار کلاینت یو دی پی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| سوکت | sock | یو دی پی.سوکت یو دی پی | سوکت UDP محلی. |
| میزبان | host | رشته = "" | میزبان رله. |
| درگاه | port | صحیح = 0 | درگاه رله. |
| روش | method | روش | روش رمز. |
| کلید | key | بافر | کلید اصلی. |
| بافر دریافت | rbuf | تهی* | بافر دریافت. |
| معتبر | ok | منطقی = نادرست | درست وقتی کارخواه برپا شد. |
| نشست | sess | نشست یو دی پی* | نشست ۲۰۲۲ این کارخواه؛ برای روش کلاسیک تهی. |
| سرآیند هویت | eih | بافر | کلیدهای هویت یک گذرواژهی serverkey:userkey، همهی کلیدها جز آخرین، پشت سر هم. |
| تعداد سرآیند هویت | eih_n | صحیح = 0 | eih چند کلید هویت دارد. |
سرور یو دی پی UdpServer
ساختار سرور یو دی پی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| سوکت | sock | یو دی پی.سوکت یو دی پی | سوکت UDP که کارخواهها به آن میفرستند. |
| روش | method | روش | روش رمز. |
| کلید | key | بافر | کلید اصلی. |
| بافر دریافت | rbuf | تهی* | بافر دریافت. |
| ارتباط ها | assoc | نگاشت<رشته، یو دی پی.سوکت یو دی پی> | سوکت خروجی هر کارخواه، با کلید نشانی کارخواه. |
| آخرین فعالیت | seen | نگاشت<رشته، صحیح۶۴> | آخرین زمانی که از هر کارخواه خبری رسید، بر حسب میلیثانیه. |
| کلاینت ها | clients | نگاشت<رشته، مقصد> | نشانیای که هر کارخواه از آن میفرستد، برای پاسخها. |
| پرچم توقف | stopc | صحیح۶۴* | پرچمی که خدمت یو دی پی را میایستاند. |
| معتبر | ok | منطقی = نادرست | درست وقتی رله راه افتاد. |
| نشست ها | sess | نگاشت<رشته، نشست یو دی پی> | نشست ۲۰۲۲ هر کارخواه، با کلید نشانی کارخواه. |
| کلید نشست ها | skeys | نگاشت<رشته، بافر> | کلید کاربری که هر کارخواه با آن وارد شده، با کلید نشانی کارخواه. |
| کاربران | users | نگاشت<رشته، بافر> | کلید کاربرانی که با UdpAddUser افزوده شدهاند، به هگز چکیدهای که کاربر را در سرآیند هویت نام میبرد. |
| تعداد کاربران | user_n | صحیح = 0 | چند کاربر افزوده شده است. |
| فیلتر | filter | فیلتر نمک | حافظهی نمک که دیتاگرام تکراری را رد میکند. |
پایاها و متغیرها
زمینه هویت IDENTITY_CONTEXT
پایا زمینه هویت: رشته = "shadowsocks 2022 identity subkey"نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Identity.salam
طول سرآیند هویت EIH_LEN
پایا طول سرآیند هویت: صحیح۳۲ = 16نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Identity.salam
حالتهای پوشش OBFS_…
simple-obfs از کدام استتار استفاده کند.| نام | انگلیسی | مقدار |
|---|---|---|
| بدون پوشش | OBFS_NONE | 0 |
| پوشش اچ تی تی پی | OBFS_HTTP | 1 |
| پوشش تی ال اس | OBFS_TLS | 2 |
نوع نشانی ATYP_…
| نام | انگلیسی | مقدار |
|---|---|---|
| نوع آدرس آی پی۴ | ATYP_IPV4 | 1 |
| نوع آدرس دامنه | ATYP_DOMAIN | 3 |
| نوع آدرس آی پی۶ | ATYP_IPV6 | 4 |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
بیشینه تکه MAX_CHUNK
پایا بیشینه تکه: صحیح۳۲ = 16383طول برچسب TAG_LEN
پایا طول برچسب: صحیح۳۲ = 16تابعها
فیلتر نمک جدید NewSaltFilter
تابع فیلتر نمک جدید(cap: صحیح): فیلتر نمکcap نمک (دستکم ۱۶) نگه میدارد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-SaltFilter.salam
نمک دیده شده FilterSeen
تابع نمک دیده شده(f &: فیلتر نمک، salt: تهی*، n: صحیح): منطقیبررسی فیلتر را فقط وقتی صدا میزند که تکه درست بود، تا بستهی جعلی نتواند فیلتر را پر کند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-SaltFilter.salam
بررسی فیلتر FilterCheck
تابع بررسی فیلتر(f &: فیلتر نمک، salt: تهی*، n: صحیح): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-SaltFilter.salam
آزادسازی فیلتر FilterFree
تابع آزادسازی فیلتر(f &: فیلتر نمک)نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-SaltFilter.salam
ساخت کلید MakeKey
تابع ساخت کلید(m: روش، password: رشته): بافرخراب در بافر برگشتی درست است.نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
زنجیره از ChainOf
تابع زنجیره از(m: روش، password: رشته): زنجیره کلیدserverkey:userkey نوشته شده (تا ۸ کلید base64) به یک KeyChain جدا میکند. برای روش کلاسیک، بیش از ۸ بخش یا بخشی که کلید با طول درست نیست ok نادرست است.نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Identity.salam
کلید زنجیره ChainKey
تابع کلید زنجیره(c: زنجیره کلید، i: صحیح): تهی*i زنجیره، از ۰ شروع میشود. آخرین کلید همان کلید کاربر است.نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Identity.salam
آزادسازی زنجیره ChainFree
تابع آزادسازی زنجیره(c &: زنجیره کلید)نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Identity.salam
هش هویت IdentityHash
تابع هش هویت(psk: تهی*، klen: صحیح، out16: تهی*)نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Identity.salam
کلید هویت IdentityKey
تابع کلید هویت(ipsk: تهی*، klen: صحیح، salt: تهی*، slen: صحیح، out: تهی*)IDENTITY_CONTEXT روی کلید هویت و پس از آن نمک. klen بایت مینویسد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Identity.salam
مهر سرآیند هویت EihSeal
تابع مهر سرآیند هویت(ipsk: تهی*، klen: صحیح، salt: تهی*، slen: صحیح، next_psk: تهی*، out16: تهی*): منطقیIdentityKey رمز شده است. ۱۶ بایت مینویسد. برای طول کلید بد نادرست برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Identity.salam
گشودن سرآیند هویت EihOpen
تابع گشودن سرآیند هویت(ipsk: تهی*، klen: صحیح، salt: تهی*، slen: صحیح، block16: تهی*، out_hash16: تهی*): منطقیEihSeal: یک بلوک را رمزگشایی میکند و چکیدهی ۱۶ بایتی کلید بعدی را مینویسد. برای طول کلید بد نادرست برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Identity.salam
معتبر Ok
تابع معتبر(c: اتصال): منطقیبرقراری اتصال فقط یعنی برپایی و اتصال TCP کار کرد، نه اینکه سرور گذرواژه را پذیرفته است.مقصد اتصال TargetOf
تابع مقصد اتصال(c: اتصال): مقصدنوشتن Write
تابع نوشتن(c: اتصال، data: تهی*، n: صحیح): صحیحنوشتن رشته WriteStr
تابع نوشتن رشته(c: اتصال، s: رشته): صحیحنوشتن با طول رشته.خواندن Read
تابع خواندن(c: اتصال، buf: تهی*، max: صحیح): صحیحmax بایت را در بافر کپی میکند. طول را برمیگرداند، ۰ وقتی طرف مقابل بست و عدد منفی در خطا یا شکست تصدیق.خواندن رشته ReadStr
تابع خواندن رشته(c: اتصال، max: صحیح): رشتهmax بایت را بهصورت رشته میخواند؛ در پایان یا خطا خالی. دادهی دودویی بایت صفر دارد که رشته را کوتاه میکند، پس برای آن خواندن را به کار ببرید.بستن Close
تابع بستن(c: اتصال)اتصال پس از آن خطاست.قطع Shutdown
تابع قطع(c: اتصال)برقراری اتصال Dial
تابع برقراری اتصال(cfg: پیکربندی، target_host: رشته، target_port: صحیح): اتصالاتصال روی جریان DialOver
تابع اتصال روی جریان(s: dyn تونل.جریان، cfg: پیکربندی، target_host: رشته، target_port: صحیح): اتصالبرقراری اتصال ولی بهجای باز کردن اتصال TCP روی جریانی که میدهید اجرا میشود. host و port پیکربندی نادیده گرفته میشوند.به عنوان جریان AsStream
تابع به عنوان جریان(c: اتصال): dyn تونل.جریانtunnel.Stream میپیچد تا هر کدی که جریان میگیرد بتواند از آن استفاده کند.نشست یو دی پی جدید NewUdpSession
تابع نشست یو دی پی جدید(): نشست یو دی پینمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Udp2022.salam
پذیرش شناسه بسته SessionAccept
تابع پذیرش شناسه بسته(s &: نشست یو دی پی، pid: صحیح۶۴): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Udp2022.salam
بسته بندی یو دی پی نسخه جدید PackUdp2022
تابع بسته بندی یو دی پی نسخه جدید(m: روش، ukey: تهی*، hdr_key: تهی*، eih: بافر، eih_n: صحیح، s &: نشست یو دی پی، client: منطقی، host: رشته، port: صحیح، data: تهی*، n: صحیح، out &: بافر): منطقیukey کلید کاربر و hdr_key کلید بلوک سرآیند است؛ برای یک کلید هر دو همان کلیدند و با کلیدهای هویت نخستین آنها. client میگوید کدام سو میفرستد. برای روش کلاسیک یا مقصد بد نادرست برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Udp2022.salam
نگاه به یو دی پی نسخه جدید Udp2022Peek
تابع نگاه به یو دی پی نسخه جدید(m: روش، hdr_key: تهی*، p: تهی*، n: صحیح، sid &: صحیح۶۴): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Udp2022.salam
بازکردن یو دی پی نسخه جدید UnpackUdp2022
تابع بازکردن یو دی پی نسخه جدید(m: روش، ukey: تهی*، hdr_key: تهی*، skip: صحیح، client: منطقی، p: تهی*، n: صحیح، s &: نشست یو دی پی، t &: مقصد، out &: بافر): منطقیskip شمار بایتهای سرآیند هویت میان سرآیند و بدنه است. در سمت کارخواه بستههای تکراری را هم با نشست رد میکند. اگر چیزی نادرست باشد نادرست برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Udp2022.salam
هویت یو دی پی نسخه جدید Udp2022Identity
تابع هویت یو دی پی نسخه جدید(m: روش، ipsk: تهی*، p: تهی*، n: صحیح، out_hash16: تهی*): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Udp2022.salam
تجزیه نشانی ParseUri
تابع تجزیه نشانی(text: رشته): نشانیss:// را در شکل SIP002، شکل اطلاعات کاربر با متن ساده یا شکل قدیمی همهچیز base64 میخواند. برای ورودی بد ok نتیجه نادرست است.قالب بندی نشانی FormatUri
تابع قالب بندی نشانی(u: نشانی): رشتهنشانی را بهصورت پیوند ss:// مینویسد، با افزونه و برچسب وقتی تنظیم شدهاند.تجزیه افزونه ParsePlugin
تابع تجزیه افزونه(text: رشته): افزونهobfs-local;obfs=tls;obfs-host=a.com را به نام و گزینه میشکند. نتیجه را با آزادسازی افزونه آزاد کنید.گرفتن گزینه افزونه PluginGet
تابع گرفتن گزینه افزونه(p: افزونه، key: رشته، fallback: رشته): رشتهگزینه افزونه موجود است PluginHas
تابع گزینه افزونه موجود است(p: افزونه، key: رشته): منطقیآزادسازی افزونه PluginFree
تابع آزادسازی افزونه(p: افزونه)افزونه را آزاد میکند.تبدیل به پیکربندی ToConfig
تابع تبدیل به پیکربندی(u: نشانی): پیکربندینشانی یک پیکربندی میسازد و گزینههای simple-obfs افزونهاش را اعمال میکند.پوشاندن داده ObfsWrap
تابع پوشاندن داده(o &: پوشش، p: تهی*، n: صحیح، out &: بافر)برداشتن پوشش ObfsUnwrap
تابع برداشتن پوشش(o &: پوشش، p: تهی*، n: صحیح، out &: بافر): صحیحآماده سازی پوشش ObfsInit
تابع آماده سازی پوشش(mode: صحیح، server: منطقی، host: رشته): پوششآزادسازی پوشش ObfsFree
تابع آزادسازی پوشش(o &: پوشش)پوشش را آزاد میکند.حالت پوشش ObfsMode
تابع حالت پوشش(name: رشته): صحیحhttp یا tls را به ثابت OBFS_ تبدیل میکند؛ هر چیز دیگر بدون پوشش میدهد.رمزگذاری مقصد EncodeTarget
تابع رمزگذاری مقصد(host: رشته، port: صحیح، out &: بافر): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
تجزیه مقصد ParseTarget
تابع تجزیه مقصد(p: تهی*، n: صحیح، t &: مقصد): صحیحمقصد میخواند. تعداد بایتهایی را که سرآیند گرفت برمیگرداند، یا ۰ وقتی بایتها کم یا نامعتبرند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
بافر در BufAt
تابع بافر در(b: بافر، off: صحیح): تهی*اشاره گر در PtrAt
تابع اشاره گر در(p: تهی*، off: صحیح): تهی*بافر جدید NewBuf
تابع بافر جدید(cap0: صحیح): بافرنمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
آزادسازی بافر BufFree
تابع آزادسازی بافر(b &: بافر)نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
پاکسازی بافر BufWipe
تابع پاکسازی بافر(b &: بافر)نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
رزرو بافر BufReserve
تابع رزرو بافر(b &: بافر، extra: صحیح)افزودن به بافر BufAppend
تابع افزودن به بافر(b &: بافر، src: تهی*، n: صحیح)افزودن بایت به بافر BufAppendByte
تابع افزودن بایت به بافر(b &: بافر، v: صحیح)افزودن رشته به بافر BufAppendStr
تابع افزودن رشته به بافر(b &: بافر، s: رشته)مصرف بافر BufConsume
تابع مصرف بافر(b &: بافر، n: صحیح)بافر به رشته BufToStr
تابع بافر به رشته(b: بافر): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
بافر به هگز BufToHex
تابع بافر به هگز(b: بافر): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
هگز از HexOf
تابع هگز از(p: تهی*، n: صحیح): رشتهبافر از هگز BufFromHex
تابع بافر از هگز(hex: رشته): بافرخراب گذاشته میشود.رمزگذار جدید NewEncoder
تابع رمزگذار جدید(m: روش، master: تهی*، salt: تهی*): رمزگذاررمزگذار جدید تصادفی NewEncoderRandom
تابع رمزگذار جدید تصادفی(m: روش، master: تهی*): رمزگذارنمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
آزادسازی رمزگذار EncoderFree
تابع آزادسازی رمزگذار(e &: رمزگذار)نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
مهر قاب SealFrame
تابع مهر قاب(e &: رمزگذار، pt: تهی*، n: صحیح، out &: بافر)ارسال نمک EmitSalt
تابع ارسال نمک(e &: رمزگذار، out &: بافر)نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
رمزگذاری جریان EncodeStream
تابع رمزگذاری جریان(e &: رمزگذار، data: تهی*، n: صحیح، out &: بافر)max_chunk میشکند. اول نمک را بفرستید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
رمزگشا جدید NewDecoder
تابع رمزگشا جدید(m: روش، master: تهی*): رمزگشانمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
آزادسازی رمزگشا DecoderFree
تابع آزادسازی رمزگشا(d &: رمزگشا)نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
خوراندن Feed
تابع خوراندن(d &: رمزگشا، data: تهی*، n: صحیح)گرفتن نمک TakeSalt
تابع گرفتن نمک(d &: رمزگشا): منطقیگرفتن قاب TakeFrame
تابع گرفتن قاب(d &: رمزگشا، n: صحیح، out &: بافر): صحیحتکه بعدی NextChunk
تابع تکه بعدی(d &: رمزگشا، out &: بافر): صحیحرمزگشایی همه DecodeAll
تابع رمزگشایی همه(d &: رمزگشا، data: تهی*، n: صحیح، out &: بافر): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
گوش دادن Listen
تابع گوش دادن(port: صحیح، method: رشته، password: رشته): سرورسروری برمیگرداند که سرور معتبر نیست.گوش دادن روی نشانی ListenOn
تابع گوش دادن روی نشانی(host: رشته، port: صحیح، method: رشته، password: رشته، obfs: رشته): سرورListenObfs است، اما فقط روی نشانی دادهشده گوش میدهد، مثلاً 127.0.0.1، نه روی همهی رابطها. آخرین آرگومان استتار است: http، tls یا خالی برای هیچ.// زبان: فارسی
واردسازی شبکه.شدوساکس
تابع ریشه:
method := "2022-blake3-aes-128-gcm"
ipsk := "AAECAwQFBgcICQoLDA0ODw=="
server := شدوساکس.گوش دادن روی نشانی("127.0.0.1"، 0، method، ipsk، "")
سرچاپ شدوساکس.سرور معتبر(server)، شدوساکس.درگاه سرور(server) بزرگتر 0
سرچاپ شدوساکس.افزودن کاربر(server، "alice"، "EBESExQVFhcYGRobHB0eHw==")
سرچاپ شدوساکس.افزودن کاربر(server، "bob"، "ICEiIyQlJicoKSorLC0uLw==")
سرچاپ شدوساکس.افزودن کاربر(server، "bad"، "short")
سرچاپ server.وضعیت.تعداد کاربران، server.وضعیت.کاربران.دارد("x")، server.وضعیت.نام کاربران.اندازه()
شدوساکس.نابودی سرور(server)
classic := شدوساکس.گوش دادن روی نشانی("127.0.0.1"، 0، "chacha20-ietf-poly1305"، "password"، "")
سرچاپ شدوساکس.افزودن کاربر(classic، "carol"، "password")
شدوساکس.نابودی سرور(classic)
ناپایا relay := شدوساکس.گوش دادن یو دی پی روی نشانی("127.0.0.1"، 0، method، ipsk)
سرچاپ relay.معتبر، شدوساکس.درگاه سرور یو دی پی(relay) بزرگتر 0
سرچاپ شدوساکس.افزودن کاربر یو دی پی(relay، "EBESExQVFhcYGRobHB0eHw==")
سرچاپ شدوساکس.افزودن کاربر یو دی پی(relay، "short")
سرچاپ relay.تعداد کاربران، relay.کاربران.اندازه()، relay.نشست ها.اندازه()
شدوساکس.نابودی یو دی پی(relay)
پایانگوش دادن با پوشش ListenObfs
تابع گوش دادن با پوشش(port: صحیح، method: رشته، password: رشته، obfs: رشته): سرورگوش دادن ولی انتظار دارد کارخواهها از حالت http یا tls در simple-obfs استفاده کنند؛ رشتهی خالی یعنی هیچ.افزودن کاربر AddUser
تابع افزودن کاربر(s: سرور، name: رشته، password: رشته): منطقیserverkey:userkey وصل میشوند. برای روش کلاسیک، ChaCha نسخهی ۲۰۲۲ یا کلید بد نادرست برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-MultiUser.salam
سرور معتبر ServerOk
تابع سرور معتبر(s: سرور): منطقیدرگاه سرور ServerPort
تابع درگاه سرور(s: سرور): صحیحListen(0, ...) به کار میآید.پذیرش Accept
تابع پذیرش(s: سرور): اتصالاتصال آن را برمیگرداند. اتصالی که دستدهی را ببازد (گذرواژهی غلط، بازپخش، زمان نادرست) بیجواب بسته میشود و انتظار ادامه مییابد. مقصد اتصال میگوید کارخواه کجا میخواهد برود.پذیرش روی جریان AcceptOver
تابع پذیرش روی جریان(s: سرور، io: dyn تونل.جریان): اتصالپذیرش ولی برای یک کارخواه که روی جریانی که از پیش دارید میرسد، مثل یک WebSocket. اگر دستدهی شکست بخورد اتصالی برمیگرداند که معتبر نیست.رله Relay
تابع رله(c: اتصال)خدمت Serve
تابع خدمت(s: سرور، handler: تابع(اتصال))توقف سرور کارخواهها را میپذیرد و دستگیره را برای هر یک روی یک نخ کارگر اجرا میکند. دستگیره مالک اتصال است و باید آن را ببندد.خدمت رله ServeRelay
تابع خدمت رله(s: سرور)رله خدمت میکند. این کل سرور یک پراکسی شدوساکس ساده است.توقف سرور Stop
تابع توقف سرور(s: سرور)خدمت میخواهد برگردد. از نخی دیگر صدایش بزنید، منتظر نخ خدمتدهنده بمانید و نابودی سرور را صدا بزنید.نابودی سرور Destroy
تابع نابودی سرور(s: سرور)خدمت.یافتن روش LookupMethod
تابع یافتن روش(name: رشته): روشok نتیجه نادرست است.بایت به کلید BytesToKey
تابع بایت به کلید(password: رشته، klen: صحیح، out: تهی*)klen بایت در out مینویسد.اچ کی دی اف شا۱ HkdfSha1
تابع اچ کی دی اف شا۱(key: تهی*، klen: صحیح، salt: تهی*، slen: صحیح، info: رشته، out: تهی*، olen: صحیح)olen بایت مشتق میکند. کلید نشست کلاسیک از آن استفاده میکند.زیرکلید نشست SessionSubkey
تابع زیرکلید نشست(m: روش، master: تهی*، salt: تهی*، out: تهی*)ss-subkey).نمک تصادفی RandomSalt
تابع نمک تصادفی(m: روش، out: تهی*)out را با نمک تصادفی به اندازهی طول روش پر میکند.کلید گذرواژه PasswordKey
تابع کلید گذرواژه(m: روش، password: رشته): بافربافر تازه.بسته بندی یو دی پی PackUdp
تابع بسته بندی یو دی پی(m: روش، key: تهی*، host: رشته، port: صحیح، data: تهی*، n: صحیح، out &: بافر): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
بازکردن یو دی پی UnpackUdp
تابع بازکردن یو دی پی(m: روش، key: تهی*، p: تهی*، n: صحیح، t &: مقصد، out &: بافر): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-Codec.salam
اتصال یو دی پی UdpDial
تابع اتصال یو دی پی(cfg: پیکربندی): کلاینت یو دی پیپیکربندی میسازد. برای روش ۲۰۲۲ گذرواژه میتواند serverkey:userkey باشد. برای روش ناشناخته یا گذرواژهی بد ok نادرست است.ارسال یو دی پی UdpSend
تابع ارسال یو دی پی(c: کلاینت یو دی پی، host: رشته، port: صحیح، data: تهی*، n: صحیح): منطقیدریافت یو دی پی UdpRecv
تابع دریافت یو دی پی(c: کلاینت یو دی پی، buf: تهی*، max: صحیح، from &: مقصد): صحیحmax بایت) و from را با فرستنده پر میکند. طول را برمیگرداند، یا عددی منفی در پایان مهلت یا بستهای که تصدیق نمیشود.مهلت یو دی پی UdpSetTimeout
تابع مهلت یو دی پی(c: کلاینت یو دی پی، millis: صحیح)دریافت یو دی پی حداکثر چند میلیثانیه منتظر بماند.بستن یو دی پی UdpClose
تابع بستن یو دی پی(c: کلاینت یو دی پی)گوش دادن یو دی پی UdpListen
تابع گوش دادن یو دی پی(port: صحیح، method: رشته، password: رشته): سرور یو دی پیok نادرست است.گوش دادن یو دی پی روی نشانی UdpListenOn
تابع گوش دادن یو دی پی روی نشانی(host: رشته، port: صحیح، method: رشته، password: رشته): سرور یو دی پیUdpListen است، اما فقط روی نشانی دادهشده گوش میدهد، مثلاً 127.0.0.1.نمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-MultiUser.salam
افزودن کاربر یو دی پی UdpAddUser
تابع افزودن کاربر یو دی پی(s &: سرور یو دی پی، password: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-shadowsocks-MultiUser.salam
درگاه سرور یو دی پی UdpServerPort
تابع درگاه سرور یو دی پی(s: سرور یو دی پی): صحیحگام یو دی پی UdpStep
تابع گام یو دی پی(s &: سرور یو دی پی): صحیحخدمت یو دی پی UdpServe
تابع خدمت یو دی پی(s &: سرور یو دی پی)گام یو دی پی را تا توقف یو دی پی در حلقه صدا میزند. روی نخ خودش اجرایش کنید.توقف یو دی پی UdpStop
تابع توقف یو دی پی(s: سرور یو دی پی)خدمت یو دی پی میخواهد برگردد.نابودی یو دی پی UdpDestroy
تابع نابودی یو دی پی(s &: سرور یو دی پی)هش بلیک۳ Blake3Hash
تابع هش بلیک۳(p: تهی*، n: صحیح، out: تهی*، outlen: صحیح)outlen بایت در out (۳۲ طول معمول است).هش کلیددار بلیک۳ Blake3KeyedHash
تابع هش کلیددار بلیک۳(key32: تهی*، p: تهی*، n: صحیح، out: تهی*، outlen: صحیح)اشتقاق کلید بلیک۳ Blake3DeriveKey
تابع اشتقاق کلید بلیک۳(context: رشته، p: تهی*، n: صحیح، out: تهی*، outlen: صحیح)کلید نشست بلیک۳ Blake3SessionKey
تابع کلید نشست بلیک۳(psk: تهی*، klen: صحیح، salt: تهی*، slen: صحیح، out: تهی*)