تونل net.tunnel
هستهی مشترک ابزارهای پراکسی و شبیه VPN: جریانها، نشانیها، شمارهگیرها و زنجیرهی پراکسی، درونسوی ترکیبی، قاعدههای مسیریابی با پیشتنظیم ایران، پیوندهای اشتراک و پیکربندی به سبک v2ray.
واردسازی شبکه.تونل
نام آرگومانها شناسهی خود کد است و معادل فارسی ندارد؛ گونهها، کلیدواژهها و نام بستهها با معادل فارسی نوشته میشوند.
این بسته هستهی مشترک ابزارهای پراکسی سلام است. خودش یک پروتکل پراکسی خاص حرف نمیزند. به بستههای دیگر یک شکل مشترک میدهد تا هر درونسو (طرفی که کارخواهها را میپذیرد) را بشود به هر خروجی (طرفی که به دنیا میرسد) وصل کرد: ساکس، پراکسی اچتیتیپی و تروجان همه به آن وصل میشوند و بستههای پروتکل بعدی هم همینطور. برای دیدن اینکه تکهها در یک برنامه چگونه کنار هم مینشینند، ساختن برنامهای به سبک v2ray یا VPN را بخوانید.
این جعبهابزاری برای پراکسی است، نه برای VPN سرتاسری سیستم: هیچ رابط شبکهی مجازی ساخته نمیشود، پس باید برنامه را به درگاه محلی (SOCKS یا HTTP) اشاره داد یا برنامه خودش پراکسی را بشناسد. هدفش حریم خصوصی و دسترسی به اطلاعات است. آن را روی شبکهها و با سرورهایی به کار ببرید که اجازهی استفادهشان را دارید و مراقب کسانی باشید که به آن تکیه میکنند.
application -> inbound -> router -> outbound -> remote server -> target
mixed rules direct, proxy chain, block
SOCKS/HTTP .ir direct
ایدههای اصلی:
جریانیک اتصال دوطرفهی بایت است. TCP، TLS، وبسوکت و لولههای درونحافظه همه یک شکل دارند، پس پروتکل یا رله هرگز نمیپرسد زیرش چیست.نشانییک مقصد است: نام میزبان یا IP و یک درگاه. هر شمارهگیر و هر درونسو با مقدارهاینشانیحرف میزند.شمارهگیریک اتصال خروجی باز میکند.شمارهگیر مستقیم،شمارهگیر مسدودکننده،زنجیره(چند گام پراکسی پشت هم)،جایگزینوشمارهگیر مسیریابهمه شمارهگیرند و تو در تو میشوند.اتصالدهندهیک گام پراکسی است که زنجیره میتواند به کار ببرد.پذیرندهدرخواست کارخواه را میخواند و پاسخ میدهد؛شنود تی سی پیاتصال میپذیرد و یکدستگیره(معمولادستگیره انتقال) سرویسشان میدهد.پروتکل ترکیبیSOCKS4، SOCKS5 و پراکسی HTTP را روی یک درگاه میگذارد.مسیریاببا قاعدههای مرتب یک مقصد را به یک برچسب (direct،proxy،block) تبدیل میکند ومسیریاب ایرانیک پیشتنظیم آماده است.تجزیه لینکوتجزیه اشتراکپیوندهای اشتراکvmess://،vless://،trojan://وss://را میخوانند وتجزیه پیکربندیJSON به سبک v2ray را.
چیزهایی که آدم را گیر میاندازد:
- شکست یک جریان بسته است، نه استثنا. شمارهگیری ناموفق جریانی برمیگرداند که
معتبرآن نادرست است. پیش از نوشتن بررسیاش کنید. - پیکربندی خودش پروتکل نمیسازد.
ساخت شمارهگیرفقطfreedom(مستقیم) وblackhole(مسدود) را میشناسد. هر پروتکل خروجی دیگر به سازندهای نیاز دارد که باثبت خروجیثبت شود؛ تا آن موقع آن خروجی ترافیک را به جای نشت دادن رد میکند. بستههای این خانواده شمارهگیر و اتصالدهندههایی میدهند که در کد میسازید، همانطور که راهنمای زیر میکند. - این TCP است. جریانها TCP میبرند. رلهی UDP کار خود بستههای پروتکل است.
- نمونهها از IPv4 loopback استفاده میکنند؛ آزمونها IPv6 را هم پوشش میدهند. شنوندهها
::1و::(هر دو خانواده) را میپذیرند،DirectDialerبه هدفهای IPv6 میرسد و نشانیهای IPv6 و IPv4 یک نام را رقابتی امتحان میکند، و سقف هر مبدأ کارخواههای نگاشتشده از IPv4 را IPv4 حساب میکند و کارخواههای IPv6 را با پیشوند /64 گروه میکند. - پیوندهای اشتراک ورودی نامطمئناند.
تجزیه لینکآنچه نخواند را رد میکند، ولی اشتراک از سرور دیگران میآید. پیش از اعتماد به یک گرهاجازه ناامنرا ببینید. آماروزمانسنج بیکاریشمارندههای بومی نگه میدارند. پایان کار باآزادسازی آماروآزادسازیآزادشان کنید.
ساختن برنامهای به سبک v2ray یا VPN
برنامهای به سبک v2ray یک خط لولهی کوچک است: چیزی اتصال برنامه را میپذیرد (درونسو)، چیزی تصمیم میگیرد کجا برود (مسیریاب) و چیزی آن را به آنجا میرساند (خروجی). در سلام هر تکه یک مقدار است و این بسته آنها را به هم وصل میکند.
+--------------------------- your process ----------------------------+
application | inbound router outbound | remote server
(browser, | MixedProtocol Router Dialer | (trojan, ...)
curl, app) -> | SOCKS4/5 + HTTP rules decide a tag direct | -> |
127.0.0.1:1080| -> Session .ir, private: direct Via(hop), Chain | -> target
| target Addr everything else: proxy BlockDialer |
+----------------------------------------------------------------------+
ForwardHandler relays bytes both ways (Relay)
نمونه همهی این خط لوله را روی loopback اجرا میکند. دو سرور پژواک جای اینترنتاند: local مستقیم و abroad فقط از راه یک سرور تروجان در دسترس است که مسیریاب آن را با درگاه برمیگزیند. درونسوی ترکیبی یک کارخواه SOCKS5 و یک کارخواه HTTP CONNECT را روی همان درگاه میپذیرد.
// زبان: فارسی
واردسازی شبکه.تی سی پی
واردسازی شبکه.ساکس
واردسازی شبکه.پراکسی اچتیتیپی
واردسازی شبکه.تروجان
واردسازی شبکه.تونل
واردسازی همگام سازی
ناپایا local_port := 0
ناپایا abroad_port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()
تابع serve_echo(name: رشته، port: صحیح):
srv := تی سی پی.پیوند(port)
اگر name برابر "local":
local_port = تی سی پی.درگاه(srv)
وگرنه:
abroad_port = تی سی پی.درگاه(srv)
پایان
همگام سازی.اتمام(ready)
تا درست:
c := تی سی پی.پذیرش(srv)
data := تی سی پی.خواندن(c، 100)
تی سی پی.نوشتن(c، name + " saw " + data)
تی سی پی.بستن(c)
پایان
پایان
تابع local_echo():
serve_echo("local"، 0)
پایان
تابع abroad_echo():
serve_echo("abroad"، 0)
پایان
تابع ask(proxy_port: صحیح، port: صحیح، text: رشته): رشته:
r := ساکس.اتصال(ساکس.کلاینت جدید("127.0.0.1"، proxy_port)، "127.0.0.1"، port)
r.جریان.نوشتن(text)
answer := r.جریان.خواندن(100)
r.جریان.بستن()
برگشت answer
پایان
تابع ریشه:
همگام سازی.افزودن(ready، 2 برگردان صحیح۶۴)
_a := نخساز(local_echo)
_b := نخساز(abroad_echo)
همگام سازی.انتظار(ready)
ناپایا remote_cfg := تروجان.پیکربندی کارساز جدید(""، "")
تروجان.افزودن گذرواژه(remote_cfg، "secret")
remote := تروجان.سرویسدهی بدون رمز(remote_cfg، 0)
rules := تونل.تجزیه قاعدهها("DST-PORT," + abroad_port + ",proxy\nDOMAIN-SUFFIX,ir,direct\nFINAL,direct\n"، "direct")
سرچاپ "خطاهای قاعده:"، rules.خطاها.طول()
ناپایا dialer := تونل.شمارهگیر مسیریاب جدید(rules.مسیریاب)
تونل.افزودن به شمارهگیر مسیریاب(dialer، "direct"، تونل.مستقیم())
hop := تروجان.اتصالدهنده جدید("127.0.0.1"، remote.درگاه، "secret")
تونل.افزودن به شمارهگیر مسیریاب(dialer، "proxy"، تونل.از طریق(تونل.مستقیم()، hop))
ناپایا mixed := تونل.ترکیبی جدید()
تونل.تنظیم ساکس۵ ترکیبی(mixed، ساکس.ورودی جدید(ساکس.پیکربندی سرور جدید(0)))
تونل.تنظیم اچ تی تی پی ترکیبی(mixed، پراکسی اچتیتیپی.ورودی جدید(پراکسی اچتیتیپی.پیکربندی سرور جدید(0)))
forward := تونل.انتقالدهنده جدید(dialer، mixed)
inbound := تونل.شنود تی سی پی(0)
تونل.سرویسدهی پسزمینه(inbound، mixed، forward)
سرچاپ ask(inbound.درگاه، local_port، "hello")
سرچاپ ask(inbound.درگاه، abroad_port، "hello")
web := پراکسی اچتیتیپی.اتصال(پراکسی اچتیتیپی.کلاینت جدید("127.0.0.1"، inbound.درگاه)، "127.0.0.1"، abroad_port)
سرچاپ "HTTP CONNECT:"، web.وضعیت
web.جریان.نوشتن("via http")
سرچاپ web.جریان.خواندن(100)
web.جریان.بستن()
همگام سازی.خواب میلی ثانیه(100)
سرچاپ "اتصالها:"، forward.آمار.شمار کل()
inbound.توقف()
تروجان.توقف(remote)
پایانتکهها به ترتیب: تجزیه قاعدهها مسیریاب را میسازد؛ یک شمارهگیر مسیریاب هر برچسب را به یک شمارهگیر مینگارد (مستقیم برای direct، از طریق با یک اتصالدهنده تروجان برای proxy)؛ ترکیبی جدید با تنظیم ساکس۵ ترکیبی و تنظیم اچ تی تی پی ترکیبی پروتکل درونسو است؛ انتقالدهنده جدید شمارهگیر و پروتکل را در یک دستگیره به هم میبندد؛ شنود تی سی پی و سرویسدهی پسزمینه سرویسدهی را شروع میکنند. برای گامهای بیشتر از زنجیره و برای امتحان چند خروجی پشت هم از جایگزین استفاده کنید.
توصیههای عملی برای ایران
- ترافیک داخلی را مستقیم بفرستید.
مسیریاب ایراندامنههای.ir(و شکلهای فارسی.ایران)، نشانیهای خصوصی و چند سرویس بزرگ داخلی را مستقیم بیرون میفرستد و بقیه را به برچسب پراکسی شما. این کار بانک، پیک و سایتهای دولتی را با سرعت عادی و IP عادیشان کار نگه میدارد و بار سرورتان را کم میکند. سطرهای خودتان را باقاعده پسوندیا یک پروندهی قاعده برایتجزیه قاعدههااضافه کنید. - از TLS استفاده کنید و به سرور یک چهرهی واقعی بدهید. سرور تروجانی که گواهی واقعی دارد و پشتش یک وبسایت واقعی است (
تروجان.تعیین جایگزین) برای یک کاوشگر مثل هر سایت HTTPS دیگر دیده میشود: هر چه کارخواه احرازشده نباشد به همان سایت داده میشود. دامنهای که مال خودتان است، گواهی معتبر و جایگزینی که محتوای واقعی بدهد به کار ببرید. - پیام آغازین TLS را تکهتکه کنید. بعضی فیلترها نام سرور را در نخستین رکورد TLS میخوانند. سانسورشکن میتواند آن رکورد را پیش از ارسال تکهتکه کند (
سانسورشکن.تکهتکه کردن پیام آغازین،سانسورشکن.اندازه تکهها از روی نام سرور). آن را یک ابزار بدانید که روی بعضی شبکهها کار میکند و روی بعضی نه، و همانجایی که هستید آزمایشش کنید. - نامها را روی کانال رمزشده حل کنید. DNS ساده روی UDP درگاه ۵۳ خواناست و دستکاریاش آسان. دیاوهاچ با DNS روی HTTPS یا TLS حل میکند، پاسخها را نگه میدارد و میتواند یک حلکنندهی محلی برای برنامههای دیگر راه بیندازد. هر جا میشود از سمت پراکسی حل کنید تا جستجوی نام نشان ندهد کجا میروید.
- قاعدهها را درست نگه دارید. پراکسیای که همه چیز را بیرون میفرستد وبگردی روزمره را خراب میکند و آنکه زیادی مستقیم میفرستد نشت میدهد. فهرست قاعدهها را مثل دیوار آتش بازبینی کنید.
- از آدمهای آن سوی خط مراقبت کنید. مقصدها را ثبت نکنید، گذرواژهها را بچرخانید و سرورِ با گذرواژهی مشترک را میان کسانی که نمیتوانید ضامنشان شوید پخش نکنید.
این بسته ابزاری برای حریم خصوصی و دسترسی به اطلاعات است. شما را ناشناس نمیکند، پنهان نمیکند که از پراکسی استفاده میکنید و برای سوءاستفاده از سرویس یا شبکهی دیگران ساخته نشده است.
از پیکربندی یا پیوند اشتراک
اگر برنامهتان اشتراک میگیرد، تجزیه اشتراک فهرستی از گره میدهد و پیکربندی از گرهها آنها را به یک پیکربندی آماده تبدیل میکند (درونسوی ترکیبی، یک خروجی برای هر گره، مستقیم و مسدود، و قاعدهی .ir). سپس ساخت شمارهگیر شمارهگیر را میسازد، ولی فقط برای پروتکلهای خروجی که سازندهی ثبتشده دارند. نوشتن یک سازنده چند سطر است، خروجیساز را ببینید.
راهنمای سریع ساخت برنامهی پراکسی/VPN با سلام
این مسیر کوتاه از یک پیوند اشتراک تا یک پراکسی محلی است که مرورگر یا هر برنامهی دیگر میتواند به آن وصل شود. هر گام یک فراخوانی است و برنامهی زیر همهشان را کنار هم میگذارد.
- پیوند یا اشتراک را بخوانید.
تجزیه لینکیک پیوندvless://،vmess://،trojan://یاss://را میخواند وتجزیه اشتراکمتنی با چند پیوند را (Base64 یا یک پیوند در هر سطر). سطر نامعتبر دور ریخته و درردشدهشمرده میشود و برنامه متوقف نمیشود. پیوندی که از دیگران میرسد ورودی نامطمئن است: پیش از اعتماد به یک گره،اجازه ناامنرا ببینید. - پیکربندی بسازید.
پیکربندی از گرههایک درونسوی ترکیبی (SOCKS4، SOCKS5 و HTTP روی یک درگاه محلی)، یک خروجی برای هر گره، خروجیهایdirectوblockو قاعدهی.irرا میسازد. پس بدون کار اضافه، دامنههای.irو نشانیهای خصوصی مستقیم میروند و بقیه از گرهی شما. - DoH و تکهتکه کردن را روشن کنید. با
ثبت با گزینهها، گزینهیتکهتکه کردنClientHello را در چند بسته میفرستد واستفاده از دی او اچنامها را با DNS روی HTTPS حل میکند. هر دو فقط گزینهاند: روی بعضی شبکهها اثر دارند و روی بعضی نه. - شروع کنید.
شروع همهدرونسوها را بالا میآورد وتوقفهر کدام را میبندد. اگر پیکربندی در یک پروندهی JSON به سبک V2Ray است،اجرای پیکربندیآن را بارگذاری و بررسی میکند و تا Ctrl-C اجرایش میکند. - برنامههایتان را وصل کنید. درونسو فقط روی
127.0.0.1شنود میکند. در مرورگر یا برنامه، پراکسی SOCKS5 یا HTTP را روی همان درگاه بگذارید. برای آزمایش از خط فرمان،curl --socks5-hostname 127.0.0.1:1080 https://example.comنام را هم از راه پراکسی حل میکند.
// زبان: فارسی
واردسازی شبکه.دیاوهاچ
واردسازی شبکه.تونل
واردسازی شبکه.ویپیان
تابع ریشه:
links := "vless://b831381d-6324-4d53-ad4f-8cda48b30811@vpn.example.org:443?security=tls&type=ws&host=vpn.example.org&path=%2Fws&sni=front.example.net#My Server\ntrojan://s3cret@vpn.example.org:443?sni=vpn.example.org#Backup\nnot a link"
sub := تونل.تجزیه اشتراک(links)
سرچاپ "سرورها:"، sub.گرهها.طول()، "ردشده:"، sub.ردشده
ناپایا options := ویپیان.گزینهها {}
options.تکهتکه کردن = درست
options.استفاده از دی او اچ = درست
options.حلکننده = دیاوهاچ.حلکننده جدید(دیاوهاچ.کارگزارهای پیشفرض())
ویپیان.ثبت با گزینهها(options)
cfg := تونل.پیکربندی از گرهها(sub.گرهها، 18080)
errors := تونل.اعتبارسنجی پیکربندی(cfg)
سرچاپ "مشکلهای پیکربندی:"، errors.طول()
stats := تونل.آمار جدید()
listeners := ویپیان.شروع همه(cfg، stats)
سرچاپ "در حال شنود:"، ویپیان.معتبر(listeners[0])
ویپیان.توقف(listeners[0])
پایاننمونه سرورهای ساختگی (example.org) دارد و فقط ساختن و شنود را نشان میدهد؛ پیوند واقعی خودتان را جایگزین کنید، آن را در یک پرونده بگذارید و اجرا کنید:
salam run proxy.salam
چند نکتهی صادقانه پیش از استفاده:
- این ابزار برای حریم خصوصی و دسترسی به اطلاعات است. شما را ناشناس نمیکند و تضمین نمیدهد دیده نشود: شبکهای که پراکسی را از اثر انگشت TLS، الگوی ترافیک یا کاوش فعال تشخیص بدهد میتواند آن را مسدود کند.
- تکهتکه کردن و DoH تدبیرهای جزئیاند. هر دو را روی شبکهای که واقعا در آن هستید امتحان کنید و به یک راه تنها تکیه نکنید.
- فقط با سرورها و پیوندهایی کار کنید که میشناسید. گردانندهی هر پراکسی میتواند ببیند به کجا وصل میشوید و پیوند اشتراک خودش گذرواژه یا کلید است؛ آن را عمومی منتشر نکنید.
- پیش از راه انداختن سرویس برای دیگران یا استفاده از آن، قوانین و مقررات کشور و شبکهای را که در آن هستید بشناسید. مسئولیت استفاده با خود شماست.
- محدودیتهای هر پروتکل (آزمون نشدن با سرور واقعی، نبود ML-KEM، ساعت سرور در ویمس و مانند آن) در صفحهی همان بسته آمده است.
جریانها و رله
همهی آنچه بالا آمد روی جریان نشسته است. یک اتصال TCP، TLS یا وبسوکت را با پوشاندن تی سی پی، پوشاندن تی ال اس یا پوشاندن وبسوکت بپوشانید، یا با لوله جدید دو سر درونحافظه بسازید، و بقیهی کد همان است. رله تا پایان یک سمت در دو جهت کپی میکند؛ رله با آمار شمارنده و حد بیکاری اضافه میکند و همان است که دستگیره انتقال به کار میبرد. کمککنندههایی مثل خواندن کامل، خواندن با جداکننده و نوشتن همه با خواندن و نوشتن ناقص سروکار دارند.
لولههای درونحافظه آزمودن کد پروتکل را بدون سوکت آسان میکنند: بایتهای کارخواه را در یک سر بنویسید، دستدهی را روی سر دیگر اجرا کنید و پاسخ را مقایسه کنید.
قاعدههای مسیریابی
مسیریاب چند قاعده مرتب نگه میدارد. یک قاعده شرطهای مقصد (میزبان دقیق، پسوند، کلیدواژه، عبارت باقاعده، CIDR) و شرطهای درگاه دارد؛ مقصد وقتی میخورد که یک شرط مقصد و یک شرط درگاه را بگذراند (هر کدام فقط اگر قاعده داشته باشد). نخستین قاعدهی منطبق برچسبش را میدهد؛ اگر هیچکدام نخورد برچسب پیشفرض به کار میرود. تطبیق بزرگی و کوچکی حروف و نقطهی پایانی را نادیده میگیرد و پسوندی مثل ir با a.b.ir میخورد ولی با evilir نه.
قاعدهها از کد میآیند، از تجزیه قاعدهها یا بارگذاری قاعدهها (قالب سطری شبیه Clash که همانجا آمده) یا از بخش routing پیکربندی v2ray با ساخت مسیریاب. قاعدهای که هیچ شرطی نداشته باشد هرگز نمیخورد. تجزیه قاعدهها سطرهای درست را نگه میدارد و سطرهای بد را با شمارهی سطر در خطاها فهرست میکند، پس غلط تایپی بیصدا یک قاعده را نمیاندازد.
# یک قاعده در هر سطر: KIND,value,tag
DOMAIN-SUFFIX,ir,direct
DOMAIN-KEYWORD,tracker,block
IP-CIDR,203.0.113.0/24,direct
GEOIP,PRIVATE,direct
DST-PORT,25,block
FINAL,proxy
GEOIP فقط PRIVATE را میفهمد. در بسته پایگاهدادهی کشور نیست و برای همین مقصدهای ایرانی با پسوند دامنه و فهرست کوتاهی از دامنههای شناختهشده تشخیص داده میشوند، نه با بازهی IP.
چه باید دانست
- این جعبهابزار پراکسی است، نه VPN با رابط مجازی.
- جریانها TCPاند. IPv6 تجزیه، مسیریابی، شمارهگیری و پذیرش میشود.
- شمارهگیری ناموفق جریان بسته برمیگرداند.
معتبررا بررسی کنید. - پروتکلهای خروجی در پیکربندی به سازندهی ثبتشده نیاز دارند، وگرنه آن خروجی ترافیک را رد میکند.
آماروزمانسنج بیکاریباید آزاد شوند.درونسو تی سی پیباتوقفمیایستد؛ اتصالهایی که رله میشوند تا پایانشان ادامه میدهند.درونسو تی سی پیهر اتصال را روی یک نخ استخر سرویس میدهد. حد دستدهی پیشفرض ۱۵ ثانیه است، پس کارخواهی که وصل شود و چیزی نگوید رها میشود.- هیچ گزارشی خودکار نوشته نمیشود. خودتان هر جا امن است اضافه کنید.
گونهها
اتصال در انتظار Pending
میانجی اتصال در انتظار// زبان: فارسی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی همگام سازی
ناپایا echo_port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()
ساختار LineProtocol:
همگانی unused: صحیح = 0
همگانی تابع Name(): رشته:
برگشت "line"
پایان
همگانی تابع Handshake(s: پویا تونل.جریان): تونل.نشست:
line := تونل.خواندن با جداکننده(s، "\n"، 200)
اگر وارونه line.شروع با("CONNECT "):
برگشت تونل.نشست { خطا = "bad request" }
پایان
target := تونل.تجزیه نشانی(line.زیررشته(8، line.طول() - 9))
اگر وارونه target.معتبر:
برگشت تونل.نشست { خطا = "bad address" }
پایان
برگشت تونل.نشست { موفق = درست، مقصد = target، پروتکل = "line" }
پایان
همگانی تابع Reply(s: پویا تونل.جریان، _sess: تونل.نشست، ok: منطقی):
اگر ok:
s.نوشتن("OK\n")
وگرنه:
s.نوشتن("ERR\n")
پایان
پایان
پایان
تابع echo_server():
srv := تی سی پی.پیوند(0)
echo_port = تی سی پی.درگاه(srv)
همگام سازی.اتمام(ready)
تا درست:
c := تی سی پی.پذیرش(srv)
تی سی پی.نوشتن(c، "echo:" + تی سی پی.خواندن(c، 100))
تی سی پی.بستن(c)
پایان
پایان
تابع ask(port: صحیح، request: رشته): رشته:
c := تی سی پی.شماره گیری("127.0.0.1"، port)
تی سی پی.نوشتن(c، request)
answer := تی سی پی.خواندن(c، 100)
rest := تی سی پی.خواندن(c، 100)
تی سی پی.بستن(c)
برگشت answer + rest
پایان
تابع ریشه:
همگام سازی.افزودن(ready، 1 برگردان صحیح۶۴)
_t := نخساز(echo_server)
همگام سازی.انتظار(ready)
proto := LineProtocol {}
forward := تونل.انتقالدهنده جدید(تونل.مستقیم()، proto)
inbound := تونل.شنود تی سی پی(0)
سرچاپ inbound.معتبر()
تونل.سرویسدهی پسزمینه(inbound، proto، forward)
c := تی سی پی.شماره گیری("127.0.0.1"، inbound.درگاه)
تی سی پی.نوشتن(c، "CONNECT 127.0.0.1:" + echo_port + "\n")
سرچاپ تی سی پی.خواندن(c، 100)
تی سی پی.نوشتن(c، "hello")
سرچاپ تی سی پی.خواندن(c، 100)
تی سی پی.بستن(c)
سرچاپ ask(inbound.درگاه، "CONNECT 127.0.0.1:" + تی سی پی.درگاه آزاد() + "\n")
سرچاپ ask(inbound.درگاه، "GET / HTTP/1.1\r\n\r\n").طول()
inbound.توقف()
سرچاپ forward.آمار.شمار کل()، forward.آمار.شمار ناموفق()
پایانجدول مبداها SourceTable
ساختار جدول مبداها| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| هسته | core | تهی* | وضعیت مشترک. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
پذیرنده اتصال Acceptor
میانجی پذیرنده اتصالنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
اتصال آماده ReadyConn
ساختار اتصال آماده| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| جریان | stream | dyn جریان | جریان. |
| موفق | ok | منطقی = نادرست | درست وقتی پذیرش موفق بوده. |
| مبدا | remote | رشته = "" | نشانی مشتری. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
معتبر Valid
تابع معتبر(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
گشودن Open
تابع گشودن(): dyn جریاننمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
رها کردن Abort
تابع رها کردن()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
مبدا Remote
تابع مبدا(): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
پذیرنده تی سی پی TcpAcceptor
ساختار پذیرنده تی سی پی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| کارساز | server | تی سی پی.سرور | سوکت شنونده. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
پذیرش Accept
تابع پذیرش(): dyn اتصال در انتظارنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
درگاه Port
تابع درگاه(): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
معتبر Ok
تابع معتبر(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
بستن Close
تابع بستن()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
کارساز پذیرش AcceptServer
ساختار کارساز پذیرش| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| پذیرنده | acceptor | dyn پذیرنده اتصال | پذیرنده. |
| میزبان | host | رشته = "127.0.0.1" | نشانیای که روی آن شنود میکند. |
| فعال | running | اتمی.پرچم | با توقف پاک میشود. |
| کارگرها | workers | استخر.استخر نخ | استخری که اتصالها را سرویس میدهد. |
| مهلت دستدهی | handshake_ms | صحیح = 8000 | مهلت دستدهی کارخواه. پیشفرض ۸۰۰۰. |
| سقف مبدا | per_source | صحیح = 0 | چند اتصال از یک نشانی میتوانند همزمان در دستدهی باشند. ۰ یعنی بدون سقف. |
| مبداها | sources | جدول مبداها | دستدهیهای در جریان برای هر نشانی. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
معتبر Ok
تابع معتبر(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
درگاه Port
تابع درگاه(): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
توقف Stop
تابع توقف()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
سیاست مقصد DestPolicy
ساختار سیاست مقصد| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| اجازه خصوصی | allow_private | منطقی = نادرست | هدفهای خصوصی و حلقه محلی را مجاز میکند، ولی فقط وقتی loopback_only درست باشد (با PolicyForBind تعیین میشود). |
| فقط حلقه محلی | loopback_only | منطقی = نادرست | درست وقتی شنونده فقط روی حلقه محلی بسته شده است. |
| بازههای مجاز | allow_cidrs | وکتور<تطبیقدهنده> | بازههایی که حتی اگر ویژه باشند در دسترس میمانند. |
| بازههای ممنوع | deny_cidrs | وکتور<تطبیقدهنده> | بازههایی که همیشه رد میشوند؛ بر همهی ورودیهای مجاز برتری دارند. |
| پسوندهای مجاز | allow_suffixes | وکتور<رشته> | پسوندهای دامنه که در دسترس میمانند. |
| پسوندهای ممنوع | deny_suffixes | وکتور<رشته> | پسوندهای دامنه که همیشه رد میشوند. |
| حلکننده | resolver | dyn حلکننده میزبان | حلکنندهای که پیش از بررسی برای نامها به کار میرود. بدون تعیین، حلکنندهی سامانه. |
| حلکننده دارد | has_resolver | منطقی = نادرست | درست وقتی resolver تعیین شده است. |
طرح اتصال Plan
ساختار طرح اتصال| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| مجاز | allowed | منطقی = نادرست | درست وقتی مقصد قابل دسترسی است. |
| دلیل | reason | رشته = "" | دلیل ردشدن مقصد. |
| آیپیها | ips | وکتور<رشته> | نشانیهای سنجیدهشده؛ به همینها وصل شوید، نه دوباره به نام. |
| تفکیکشده | resolved | منطقی = نادرست | درست وقتی نام تفکیک شده است. |
نتیجه نگهبان GuardResult
ساختار نتیجه نگهبان| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| جریان | stream | dyn جریان | جریان وصلشده یا یک جریان بسته. |
| ردشده | denied | منطقی = نادرست | درست وقتی سیاست مقصد را رد کرده است. |
| دلیل | reason | رشته = "" | دلیل رد. |
شمارهگیر نگهبان GuardDialer
ساختار شمارهگیر نگهبان| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| درونی | inner | dyn شمارهگیر | شمارهگیری که برای اتصال به کار میرود. |
| سیاست | policy | سیاست مقصد | سیاست مقصد. |
| مسیریاب | router | شمارهگیر مسیریاب | یک شمارهگیر مسیریاب که به جای inner به کار میرود. |
| مسیریاب دارد | has_router | منطقی = نادرست | درست وقتی router در کار است. |
اتصال بررسیشده DialChecked
تابع اتصال بررسیشده(target: نشانی): نتیجه نگهباناتصال Dial
تابع اتصال(target: نشانی): dyn جریاننام Name
تابع نام(): رشتهجریان لوله PipeStream
ساختار جریان لولهلوله جدید میسازد. آنچه یک سر مینویسد سر دیگر میخواند. برای آزمون و وصل کردن دو تکه کد بدون سوکت.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| دریافت | rx | _Ring | بافری که این سر از آن میخواند. |
| ارسال | tx | _Ring | بافری که این سر در آن مینویسد. |
| مهلت | deadline | صحیح = 0 | مهلت به میلیثانیه. |
| زنده | live | منطقی = نادرست | پس از بستن جریان نادرست است. |
// زبان: فارسی
واردسازی شبکه.تونل
واردسازی حافظه
تابع ریشه:
pair := تونل.لوله جدید()
a := تونل.سر اول لوله(pair)
b := تونل.سر دوم لوله(pair)
سرچاپ تونل.نوشتن همه(a، "HELLO world\nsecond line\n")
سرچاپ تونل.خواندن یک بایت(b)
سرچاپ تونل.خواندن با جداکننده(b، "\n"، 100).طول()
سرچاپ تونل.خواندن با جداکننده(b، "\n"، 100)
a.نوشتن("12345678")
buf := حافظه.تخصیص(8 برگردان طبیعی۶۴)
سرچاپ تونل.خواندن کامل(b، buf، 8)، (buf برگردان طبیعی۸*)[0]، (buf برگردان طبیعی۸*)[7]
حافظه.آزادسازی(buf)
a.نوشتن بایت("abc" برگردان تهی*، 3)
w := تونل.با پیشوند(b، "<")
سرچاپ w.خواندن(4)
سرچاپ w.خواندن(10)
b.تنظیم مهلت(50)
سرچاپ "nothing to read: [" + b.خواندن(10) + "]"
سرچاپ a.معتبر()، b.معتبر()
a.بستن()
سرچاپ a.معتبر()، b.خواندن(10).طول()
dead := تونل.جریان مسدود {}
سرچاپ dead.معتبر()، dead.نوشتن("x") بزرگتر 0، dead.خواندن(10).طول()
پایانخواندن Read
تابع خواندن(max: صحیح): رشتهخواندن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
خواندن بایت ReadBytes
تابع خواندن بایت(buf: تهی*، max: صحیح): صحیحخواندن بایت را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
نوشتن Write
تابع نوشتن(data: رشته): صحیحنوشتن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
نوشتن بایت WriteBytes
تابع نوشتن بایت(ptr: تهی*، n: صحیح): صحیحنوشتن بایت را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
تنظیم مهلت SetDeadline
تابع تنظیم مهلت(millis: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
خاموش کردن Shutdown
تابع خاموش کردن()خاموش کردن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
بستن نوشتن CloseWrite
تابع بستن نوشتن()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
بستن Close
تابع بستن()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
معتبر Ok
تابع معتبر(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
جفت لوله PipePair
ساختار جفت لولهسر اول لوله و سر دوم لوله بگیرید.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| سر اول | a | جریان لوله | سر اول. |
| سر دوم | b | جریان لوله | سر دوم. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
جریان پیشوندی PrefixStream
ساختار جریان پیشوندیپروتکل ترکیبی با آن بایتی را که نگاه کرده پس میگذارد.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| درونی | inner | dyn جریان | جریان پوشاندهشده. |
| پیشوند | prefix | رشته = "" | بایتهایی که باید نخست داده شوند. |
| آغاز | off | صحیح = 0 | تاکنون چه مقدار از پیشوند داده شده است. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
خواندن Read
تابع خواندن(max: صحیح): رشتهخواندن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
خواندن بایت ReadBytes
تابع خواندن بایت(buf: تهی*، max: صحیح): صحیحخواندن بایت را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
نوشتن Write
تابع نوشتن(data: رشته): صحیحنوشتن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
نوشتن بایت WriteBytes
تابع نوشتن بایت(ptr: تهی*، n: صحیح): صحیحنوشتن بایت را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
تنظیم مهلت SetDeadline
تابع تنظیم مهلت(millis: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
خاموش کردن Shutdown
تابع خاموش کردن()خاموش کردن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
بستن نوشتن CloseWrite
تابع بستن نوشتن()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
بستن Close
تابع بستن()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
معتبر Ok
تابع معتبر(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
شمارهگیر مسیریاب RouterDialer
ساختار شمارهگیر مسیریابدستگیره انتقال بگذارید.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| مسیریاب | router | مسیریاب | مسیریابی که برچسبها را برمیگزیند. |
| برچسبها | tags | وکتور<رشته> | برچسبهای ثبتشده، به ترتیب. |
| شمارهگیرها | dialers | وکتور | شمارهگیرها، یکی برای هر برچسب. |
| آخرین برچسب | last_tag | رشته = "" | برچسبی که برای آخرین شمارهگیری برگزیده شد؛ برای گزارش و آزمون به کار میآید. |
// زبان: فارسی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی همگام سازی
ناپایا port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()
تابع echo_once():
srv := تی سی پی.پیوند(0)
port = تی سی پی.درگاه(srv)
همگام سازی.اتمام(ready)
c := تی سی پی.پذیرش(srv)
تی سی پی.نوشتن(c، "echo:" + تی سی پی.خواندن(c، 64))
تی سی پی.بستن(c)
پایان
تابع ریشه:
همگام سازی.افزودن(ready، 1 برگردان صحیح۶۴)
t := نخساز(echo_once)
همگام سازی.انتظار(ready)
ناپایا router := تونل.مسیریاب جدید("direct")
ناپایا blocked := تونل.قاعده جدید("block")
تونل.قاعده پسوند(blocked، "blocked.test")
تونل.افزودن قاعده(router، blocked)
ناپایا rd := تونل.شمارهگیر مسیریاب جدید(router)
تونل.افزودن به شمارهگیر مسیریاب(rd، "direct"، تونل.مستقیم())
تونل.افزودن به شمارهگیر مسیریاب(rd، "block"، تونل.مسدود())
سرچاپ rd.نام()، rd.برچسبها.طول()، rd.شمارهگیرها.طول()
s := rd.اتصال(تونل.نشانی جدید("127.0.0.1"، port))
سرچاپ rd.آخرین برچسب، s.معتبر()
s.نوشتن("hi")
سرچاپ s.خواندن(100)
s.بستن()
نخپیوند(t)
سرچاپ rd.اتصال(تونل.نشانی جدید("ads.blocked.test"، 80)).معتبر()، rd.آخرین برچسب
سرچاپ rd.گزینش("direct").نام()، rd.گزینش("nothing").نام()
پایانگزینش Pick
تابع گزینش(tag: رشته): dyn شمارهگیرنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-RouterDialer.salam
اتصال Dial
تابع اتصال(target: نشانی): dyn جریاننمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-RouterDialer.salam
نام Name
تابع نام(): رشتهrouter را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-RouterDialer.salam
نشست Session
ساختار نشست| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| موفق | ok | منطقی = نادرست | درست وقتی دستدهی موفق بود و مقصد معلوم است. |
| مقصد | target | نشانی | نشانیای که کارخواه میخواهد به آن برسد. |
| پروتکل | protocol | رشته = "" | کارخواه با کدام پروتکل حرف زد، مثل socks5 یا http. |
| کاربر | user | رشته = "" | نام کاربریِ احرازشده، اگر نبوده خالی. |
| فرمان | command | صحیح = 1 | فرمان اتصال یا فرمان یو دی پی. |
| داده آغازین | initial | رشته = "" | بایتهایی که کارخواه پس از درخواست فرستاده و باید پیش از هر چیز به مقصد برسند، مثل بدنهی یک درخواست HTTP ساده. |
| بایت های آغازین | initial_data | تهی* | مثل initial برای بایتهایی که ممکن است صفر داشته باشند، مثل نخستین بار پس از درخواست تروجان: بلوکی به اندازهی initial_size بایت که ارسالکننده اول به مقصد مینویسد و آزاد میکند. |
| اندازه بایت های آغازین | initial_size | صحیح = 0 | شمار بایتهای initial_data؛ صفر وقتی نشست از initial استفاده میکند یا چیزی ندارد. |
| خطا | error | رشته = "" | دلیل شکست دستدهی، برای گزارشها. |
| پوشانده | wrapped | منطقی = نادرست | درست وقتی پروتکل جریان کارخواه را با جریان خودش (مثلا رمزشده) جایگزین کرده باشد. در این حالت دستگیره باید به جای جریانی که گرفته از جریان استفاده کند. |
| جریان | stream | dyn جریان | جریان جایگزین، فقط وقتی پوشانده درست است معتبر است. |
| ممنوع | refused | منطقی = نادرست | درست وقتی سیاست مقصد را رد کرده است، تا درونسو بتواند «مجاز نیست» یا ۴۰۳ بدهد. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
پذیرنده InboundProtocol
میانجی پذیرندهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
دستگیره Handler
میانجی دستگیرهنشست آن را میگیرد و سرویس میدهد. دستگیره انتقال همان همیشگی است.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
پروتکل خالی NullProtocol
ساختار پروتکل خالی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| بیکاربرد | unused | صحیح = 0 | استفاده نمیشود. |
// زبان: فارسی
واردسازی شبکه.تونل
تابع ریشه:
سرچاپ تونل.تشخیص ترکیبی(5) برابر تونل.ساکس۵، تونل.تشخیص ترکیبی(4) برابر تونل.ساکس۴
سرچاپ تونل.تشخیص ترکیبی(71) برابر تونل.اچ تی تی پی، تونل.تشخیص ترکیبی(22) برابر تونل.ناشناخته
سرچاپ تونل.متن بایت(65)، تونل.متن بایت(65).طول()
ناپایا mixed := تونل.ترکیبی جدید()
سرچاپ mixed.نام()، mixed.ساکس۵ دارد، mixed.اچ تی تی پی دارد
تونل.تنظیم ساکس۵ ترکیبی(mixed، تونل.پروتکل خالی {})
تونل.تنظیم ساکس۴ ترکیبی(mixed، تونل.پروتکل خالی {})
تونل.تنظیم اچ تی تی پی ترکیبی(mixed، تونل.پروتکل خالی {})
سرچاپ mixed.ساکس۵ دارد، mixed.ساکس۴ دارد، mixed.اچ تی تی پی دارد
pair := تونل.لوله جدید()
pair.سر اول.نوشتن("\x05\x01\x00")
sess := mixed.دستدهی(تونل.سر دوم لوله(pair))
سرچاپ sess.موفق، sess.پروتکل، sess.خطا
سرچاپ تونل.فرمان اتصال، تونل.فرمان یو دی پی
پایاننام Name
تابع نام(): رشتهnull را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam
دستدهی Handshake
تابع دستدهی(_s: dyn جریان): نشستنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam
پاسخ Reply
تابع پاسخ(_s: dyn جریان، _sess: نشست، _ok: منطقی)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam
پروتکل ترکیبی MixedProtocol
ساختار پروتکل ترکیبیترکیبی جدید ساخته میشود.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| ساکس۴ | socks4 | dyn پذیرنده | درونسوی SOCKS4، اگر تعیین شده باشد. |
| ساکس۵ | socks5 | dyn پذیرنده | درونسوی SOCKS5، اگر تعیین شده باشد. |
| اچ تی تی پی | http | dyn پذیرنده | درونسوی پراکسی HTTP، اگر تعیین شده باشد. |
| ساکس۴ دارد | has_socks4 | منطقی = نادرست | پس از تنظیم ساکس۴ ترکیبی درست است. |
| ساکس۵ دارد | has_socks5 | منطقی = نادرست | پس از تنظیم ساکس۵ ترکیبی درست است. |
| اچ تی تی پی دارد | has_http | منطقی = نادرست | پس از تنظیم اچ تی تی پی ترکیبی درست است. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam
نام Name
تابع نام(): رشتهmixed را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam
دستدهی Handshake
تابع دستدهی(s: dyn جریان): نشستتشخیص ترکیبی پروتکل را برمیگزیند، بایت را به آن پس میدهد و میگذارد دستدهی کند. پروتکلِ تعییننشده رد میشود.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam
پاسخ Reply
تابع پاسخ(s: dyn جریان، sess: نشست، ok: منطقی)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam
دستگیره انتقال ForwardHandler
ساختار دستگیره انتقالدستگیره استاندارد: با شمارهگیرش به مقصد وصل میشود، به کارخواه پاسخ میدهد، بایتهای آغازین را میفرستد و سپس هر دو جهت را تا پایان اتصال رله میکند.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| شمارهگیر | dialer | dyn شمارهگیر | شمارهگیری که به مقصد میرسد. برای مسیریابی با قاعده یک شمارهگیر مسیریاب بگذارید. |
| پروتکل | proto | dyn پذیرنده | پروتکل درونسو که برای پاسخ به کارخواه به کار میرود. |
| آمار | stats | آمار | شمارندههای اتصال و بایت. |
| مهلت بیکاری | idle_ms | صحیح = 300000 | اتصال رلهشده را پس از این همه میلیثانیه بیترافیکی ببند. پیشفرض ۳۰۰۰۰۰؛ ۰ یعنی هرگز. |
| نگهبان | guard | شمارهگیر نگهبان | شمارهگیر نگهبانیشدهای که وقتی has_guard درست است به کار میرود. |
| نگهبان دارد | has_guard | منطقی = نادرست | درست وقتی انتقالدهنده از راه guard وصل میشود. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
رسیدگی Handle
تابع رسیدگی(s: dyn جریان، sess: نشست)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
درونسو تی سی پی TcpInbound
ساختار درونسو تی سی پیسرویسدهی پسزمینه یا سرویسدهی پیوسته شروع میشود.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| درگاه | port | صحیح = 0 | درگاهی که روی آن گوش میدهد. اگر درگاه ۰ خواسته باشید، درگاه آزادی است که سیستم برگزید. |
| میزبان | host | رشته = "" | نشانیای که روی آن گوش میدهد؛ هنگام توقف برای بیدار کردن حلقهی پذیرش به کار میرود. |
| شنونده | listener | تی سی پی.سرور | شنوندهی TCP زیرین. |
| فعال | running | اتمی.پرچم | پرچمی که توقف پاکش میکند. |
| کارگرها | workers | استخر.استخر نخ | استخری که اتصالها را سرویس میدهد. هر کارخواه یک وظیفه میگیرد. |
| مهلت دستدهی | handshake_ms | صحیح = 8000 | کارخواه چند میلیثانیه وقت دارد دستدهی را تمام کند. پیشفرض ۸۰۰۰. |
| سقف مبدا | per_source | صحیح = 0 | چند اتصال از یک نشانی میتوانند همزمان در دستدهی باشند. ۰ یعنی بدون سقف. |
| مبداها | sources | جدول مبداها | دستدهیهای در جریان برای هر نشانی. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
معتبر Ok
تابع معتبر(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
سرویسدهی Serve
تابع سرویسدهی(proto: dyn پذیرنده، h: dyn دستگیره)توقف مسدود میماند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
توقف Stop
تابع توقف()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
شمارهگیر Dialer
میانجی شمارهگیرجریان برمیگرداند. شمارهگیرهای مستقیم، مسدودکننده، پراکسیدار و مسیریابیشده همه آن را پیاده میکنند.// زبان: فارسی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی همگام سازی
ناپایا port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()
تابع echo_once():
srv := تی سی پی.پیوند(0)
port = تی سی پی.درگاه(srv)
همگام سازی.اتمام(ready)
c := تی سی پی.پذیرش(srv)
data := تی سی پی.خواندن(c، 64)
تی سی پی.نوشتن(c، "echo:" + data)
تی سی پی.بستن(c)
پایان
تابع ریشه:
همگام سازی.افزودن(ready، 1 برگردان صحیح۶۴)
t := نخساز(echo_once)
همگام سازی.انتظار(ready)
target := تونل.نشانی جدید("127.0.0.1"، port)
blocked := تونل.مسدود()
سرچاپ blocked.نام()، blocked.اتصال(target).معتبر()
ناپایا backup := تونل.جایگزین جدید()
تونل.افزودن جایگزین(backup، تونل.مسدود())
تونل.افزودن جایگزین(backup، تونل.مستقیم())
سرچاپ backup.نام()
s := backup.اتصال(target)
سرچاپ s.معتبر()
s.نوشتن("hello")
سرچاپ s.خواندن(100)
s.بستن()
نخپیوند(t)
direct := تونل.شمارهگیر مستقیم { مهلت اتصال = 500 }
سرچاپ direct.نام()، direct.اتصال(تونل.نشانی جدید("127.0.0.1"، تی سی پی.درگاه آزاد())).معتبر()
stream := تونل.اتصال تی سی پی("127.0.0.1"، تی سی پی.درگاه آزاد()، 500)
سرچاپ stream.معتبر()
پایاناتصالدهنده Connector
میانجی اتصالدهنده// زبان: فارسی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی همگام سازی
ناپایا hop_port := 0
ناپایا hop_log := ""
ناپایا ready := همگام سازی.گروه انتظار جدید()
ساختار LineHop:
همگانی host: رشته = ""
همگانی port: صحیح = 0
همگانی تابع Server(): تونل.نشانی:
برگشت تونل.نشانی جدید(این.host، این.port)
پایان
همگانی تابع Handshake(s: پویا تونل.جریان، target: تونل.نشانی): منطقی:
s.نوشتن("HOP " + target.متن() + "\n")
برگشت تونل.خواندن با جداکننده(s، "\n"، 50) برابر "OK\n"
پایان
همگانی تابع Name(): رشته:
برگشت "linehop"
پایان
پایان
تابع hop_server():
srv := تی سی پی.پیوند(0)
hop_port = تی سی پی.درگاه(srv)
همگام سازی.اتمام(ready)
c := تی سی پی.پذیرش(srv)
s := تونل.پوشاندن تی سی پی(c)
hop_log = تونل.خواندن با جداکننده(s، "\n"، 200)
s.نوشتن("OK\n")
s.نوشتن("end:" + s.خواندن(100))
s.بستن()
پایان
تابع ریشه:
همگام سازی.افزودن(ready، 1 برگردان صحیح۶۴)
t := نخساز(hop_server)
همگام سازی.انتظار(ready)
hop := LineHop { host = "127.0.0.1"، port = hop_port }
ناپایا chain := تونل.زنجیره جدید(تونل.مستقیم())
تونل.افزودن گام(chain، hop)
سرچاپ chain.نام()
s := chain.اتصال(تونل.نشانی جدید("service.internal"، 8080))
سرچاپ s.معتبر()
s.نوشتن("payload")
سرچاپ s.خواندن(100)
s.بستن()
نخپیوند(t)
چاپ hop_log
via := تونل.از طریق(تونل.مستقیم()، hop)
سرچاپ via.نام()
پایانشمارهگیر مستقیم DirectDialer
ساختار شمارهگیر مستقیم| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| مهلت اتصال | timeout_ms | صحیح = 10000 | اتصال چند میلیثانیه میتواند طول بکشد. پیشفرض ۱۰۰۰۰. |
| حلکننده | resolver | dyn حلکننده میزبان | حلکنندهی اختیاری برای مقصدهای دامنهای، مثلا مبتنی بر دیاناس روی HTTPS. |
| حلکننده دارد | has_resolver | منطقی = نادرست | درست یعنی از حلکننده استفاده شود. هر نشانی به نوبت در همان مهلت امتحان میشود. |
| ترجیح نسخه شش | prefer_v6 | منطقی = نادرست | نشانیهای نسخه شش پیش از نسخه چهار امتحان شوند. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Dialers.salam
اتصال Dial
تابع اتصال(target: نشانی): dyn جریاننمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Dialers.salam
نام Name
تابع نام(): رشتهdirect را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Dialers.salam
شمارهگیر مسدودکننده BlockDialer
ساختار شمارهگیر مسدودکنندهblackhole همین میشود.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| ردشده | refused | صحیح = 0 | تاکنون چند اتصال را رد کرده است. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Dialers.salam
اتصال Dial
تابع اتصال(_target: نشانی): dyn جریاننمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Dialers.salam
نام Name
تابع نام(): رشتهblock را برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Dialers.salam
شمارهگیر پراکسی ProxyDialer
ساختار شمارهگیر پراکسی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| بالادست | upstream | dyn شمارهگیر | شمارهگیری که برای رسیدن به کارساز گام به کار میرود. |
| گام | hop | dyn اتصالدهنده | گام پراکسیای که باید از آن گذشت. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Chain.salam
اتصال Dial
تابع اتصال(target: نشانی): dyn جریاننمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Chain.salam
نام Name
تابع نام(): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Chain.salam
رابط خالی NullConnector
ساختار رابط خالی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| بیکاربرد | unused | صحیح = 0 | استفاده نمیشود. ساختار دستکم یک فیلد لازم دارد. |
کارساز Server
تابع کارساز(): نشانیدستدهی Handshake
تابع دستدهی(_s: dyn جریان، _target: نشانی): منطقینام Name
تابع نام(): رشتهnull را برمیگرداند.زنجیره Chain
ساختار زنجیرهزنجیره جدید و افزودن گام ساخته میشود.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| پایه | base | dyn شمارهگیر | شمارهگیری که به نخستین گام میرسد. |
| گامها | hops | وکتور | گامها به ترتیب استفاده. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Chain.salam
اتصال Dial
تابع اتصال(target: نشانی): dyn جریاننمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Chain.salam
نام Name
تابع نام(): رشتهchain>http>socks5.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Chain.salam
جایگزین Fallback
ساختار جایگزین| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| موارد | items | وکتور | شمارهگیرهایی که باید امتحان شوند، به ترتیب. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Dialers.salam
اتصال Dial
تابع اتصال(target: نشانی): dyn جریاننمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Dialers.salam
نام Name
تابع نام(): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Dialers.salam
نشانی Addr
ساختار نشانیتجزیه نشانی و نشانی جدید آن را پر میکنند.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| میزبان | host | رشته = "" | نام میزبان یا متن IP، برای IPv6 بدون کروشه. |
| درگاه | port | صحیح = 0 | درگاه، از ۰ تا ۶۵۵۳۵. |
| نوع | kind | صحیح = 3 | نشانی آیپی۴، نشانی دامنه یا نشانی آیپی۶. عددها همانهایی هستند که نوع نشانی SOCKS5 به کار میبرد. |
| معتبر | valid | منطقی = نادرست | وقتی تجزیه شکست بخورد نادرست است. پیش از استفاده از نشانی همیشه آن را بررسی کنید. |
| حجم | size | صحیح = 0 | رمزگشاها آن را پر میکنند: نشانی کدشده چند بایت از سیم را گرفته است. |
// زبان: فارسی
واردسازی شبکه.تونل
تابع ریشه:
a := تونل.تجزیه نشانی("example.com:443")
سرچاپ a.معتبر، a.نوع برابر تونل.نشانی دامنه، a.میزبان، a.درگاه، a.متن()
b := تونل.تجزیه نشانی("[2001:db8::5]:8080")
سرچاپ b.معتبر، b.نوع برابر تونل.نشانی آیپی۶، b.متن()
سرچاپ تونل.تجزیه نشانی("example.com").معتبر، تونل.تجزیه نشانی("a:99999").معتبر
سرچاپ تونل.آیپی است("10.1.1.1")، تونل.آیپی است("example.com")
ip := تونل.تجزیه آیپی۴("192.168.1.20")
سرچاپ ip.طول()، تونل.قالببندی آیپی(ip)
سرچاپ تونل.قالببندی آیپی(تونل.تجزیه آیپی۶("2001:0db8:0000:0000:0000:0000:0000:0001"))
سرچاپ تونل.قالببندی آیپی(تونل.تجزیه آیپی("::ffff:1.2.3.4"))
n := تونل.نشانی جدید("1.2.3.4"، 80)
سرچاپ n.نوع برابر تونل.نشانی آیپی۴، n.متن()
پایانمتن String
تابع متن(): رشتهhost:port برمیگرداند، با کروشه دور میزبان IPv6.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Addr.salam
مجموعه دامنه DomainSet
ساختار مجموعه دامنه| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| کامل | full | نگاشت<رشته، منطقی> | نامهای دقیق. |
| پسوندها | suffix | نگاشت<رشته، منطقی> | پسوندها؛ نام با خودش و همهی زیردامنههایش میخورد. |
| کلیدواژهها | keywords | وکتور<رشته> | واژههایی که میتوانند هرجای نام باشند. |
| عبارتهای باقاعده | regexes | وکتور<رشته> | عبارتهای باقاعده. |
| شمار | count | صحیح = 0 | شمار مدخلهای افزودهشده. |
// زبان: فارسی
واردسازی شبکه.تونل
تابع ریشه:
rt := تونل.مسیریاب ایران("direct"، "proxy")
هر host در ["divar.ir"، "WWW.Digikala.com"، "ایران.ir"، "notaparat.com"، "evilir"، "google.com"، "192.168.1.9"، "localhost"]:
سرچاپ host، rt.تطبیق میزبان(host، 443)
پایان
ناپایا custom := تونل.مسیریاب جدید("proxy")
ناپایا mail := تونل.قاعده جدید("block")
تونل.قاعده درگاه(mail، "25,465,587")
تونل.افزودن قاعده(custom، mail)
ناپایا ads := تونل.قاعده جدید("block")
تونل.قاعده کلیدواژه(ads، "tracker")
تونل.قاعده عبارت باقاعده(ads، "^ads[0-9]+\\.example\\.com$")
تونل.افزودن قاعده(custom، ads)
ناپایا home := تونل.قاعده جدید("direct")
تونل.قاعده پسوند(home، "example.org")
تونل.قاعده دامنه(home، "printer.lan")
تونل.قاعده سیآیدیآر(home، "203.0.113.0/24")
تونل.افزودن قاعده(custom، home)
ناپایا lan := تونل.قاعده جدید("direct")
تونل.قاعده آدرسهای خصوصی(lan)
تونل.افزودن قاعده(custom، lan)
سرچاپ custom.تطبیق میزبان("smtp.example.com"، 25)
سرچاپ custom.تطبیق میزبان("my-tracker.net"، 443)، custom.تطبیق میزبان("ads42.example.com"، 443)
سرچاپ custom.تطبیق میزبان("a.b.example.org"، 443)، custom.تطبیق میزبان("printer.lan"، 80)
سرچاپ custom.تطبیق میزبان("203.0.113.77"، 80)، custom.تطبیق میزبان("10.0.0.5"، 22)، custom.تطبیق میزبان("8.8.8.8"، 53)
سرچاپ custom.تطبیق(تونل.تجزیه نشانی("203.0.113.1:8080"))
سرچاپ تونل.تجزیه سیآیدیآر("10.0.0.0/8").پیشوند، تونل.تجزیه سیآیدیآر("nonsense").نوع
ناپایا r := تونل.قاعده جدید("x")
سرچاپ تونل.قاعده دامنه با پیشوند(r، "full:a.example.com")، تونل.قاعده آیپی با پیشوند(r، "geoip:private")، تونل.قاعده سیآیدیآر(r، "1.2.3.4/40")
سرچاپ تونل.قاعده مطابقت دارد(r، تونل.تجزیه نشانی("a.example.com:80"))، تونل.قاعده مطابقت دارد(r، تونل.تجزیه نشانی("b.example.com:80"))
پایانمجموعه آیپی IpSet
ساختار مجموعه آیپی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نسخه چهار | v4 | نگاشت<صحیح۶۴، منطقی> | شبکههای نسخه چهار به تفکیک پیشوند و نشانی. |
| طولهای نسخه چهار | v4_lens | صحیح۶۴ = 0 | ماسک بیتی طولهای پیشوند نسخه چهار. |
| نسخه شش | v6 | نگاشت<رشته، منطقی> | شبکههای نسخه شش. |
| طولهای نسخه شش | v6_lens | وکتور<صحیح> | طولهای پیشوند نسخه شش. |
| شمار | count | صحیح = 0 | شمار شبکههای افزودهشده. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
آمار Stats
ساختار آمارآمار جدید ساخته میشود.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| بارگذاری | up | اتمی.صحیح۶۴ | بایتهایی که از سمت کارخواه به سوی مقصد فرستاده شد. |
| دریافت | down | اتمی.صحیح۶۴ | بایتهایی که از مقصد به کارخواه برگشت. |
| کل اتصالها | total | اتمی.صحیح۶۴ | کل اتصالهای ادارهشده. |
| اتصالهای فعال | active | اتمی.صحیح۶۴ | اتصالهایی که همین حالا رله میشوند. |
| اتصالهای ناموفق | failed | اتمی.صحیح۶۴ | اتصالهایی که به مقصدشان نرسید. |
// زبان: فارسی
واردسازی شبکه.تونل
واردسازی استخر
تابع relay_job(a: پویا تونل.جریان، b: پویا تونل.جریان، st: تونل.آمار):
r := تونل.رله با آمار(a، b، st، 5000)
سرچاپ "relayed"، r.بارگذاری، r.دریافت
پایان
تابع ریشه:
near := تونل.لوله جدید()
far := تونل.لوله جدید()
client := تونل.سر اول لوله(near)
left := تونل.سر دوم لوله(near)
right := تونل.سر اول لوله(far)
server := تونل.سر دوم لوله(far)
stats := تونل.آمار جدید()
workers := استخر.جدید کشسان(1 برگردان صحیح۶۴، 2 برگردان صحیح۶۴، 2 برگردان صحیح۶۴)
استخر.ارسال(workers، (): relay_job(left، right، stats) پایان)
client.نوشتن("ping from the client")
سرچاپ server.خواندن(100)
server.نوشتن("pong from the server")
سرچاپ client.خواندن(100)
client.بستن()
استخر.انتظار(workers)
استخر.توقف(workers)
سرچاپ stats.خلاصه()
سرچاپ stats.بایت بارگذاری()، stats.بایت دریافت()
تونل.آزادسازی آمار(stats)
پایانبایت بارگذاری Up
تابع بایت بارگذاری(): صحیح۶۴نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Relay.salam
بایت دریافت Down
تابع بایت دریافت(): صحیح۶۴نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Relay.salam
شمار کل Total
تابع شمار کل(): صحیح۶۴نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Relay.salam
شمار فعال Active
تابع شمار فعال(): صحیح۶۴نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Relay.salam
شمار ناموفق Failed
تابع شمار ناموفق(): صحیح۶۴نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Relay.salam
خلاصه Summary
تابع خلاصه(): رشتهup=... down=... total=... active=... failed=....نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Relay.salam
نتیجه رله RelayResult
ساختار نتیجه رلهرله در هر جهت چند بایت جابهجا کرد.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| بارگذاری | up | صحیح۶۴ = 0 | بایتها از جریان اول به دوم. |
| دریافت | down | صحیح۶۴ = 0 | بایتها از جریان دوم به اول. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Relay.salam
زمانسنج بیکاری IdleTimer
ساختار زمانسنج بیکاری| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| آخرین فعالیت | last | اتمی.صحیح۶۴ | زمان آخرین فعالیت، به میلیثانیه. |
| حد بیکاری | limit | صحیح۶۴ = 0 | چقدر میتواند ساکت باشد، به میلیثانیه. ۰ یعنی بیحد. |
// زبان: فارسی
واردسازی شبکه.تونل
واردسازی همگام سازی
تابع ریشه:
timer := تونل.زمانسنج بیکاری جدید(100 برگردان صحیح۶۴)
سرچاپ timer.منقضی شده()
همگام سازی.خواب میلی ثانیه(160)
سرچاپ timer.منقضی شده()، timer.میلیثانیه بیکاری() بزرگتربرابر 150
timer.ثبت فعالیت()
سرچاپ timer.منقضی شده()
timer.آزادسازی()
plain := تونل.زمانسنج بیکاری جدید(0 برگردان صحیح۶۴)
همگام سازی.خواب میلی ثانیه(30)
سرچاپ "no limit:"، plain.منقضی شده()
plain.آزادسازی()
پایانثبت فعالیت Touch
تابع ثبت فعالیت()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Idle.salam
میلیثانیه بیکاری IdleMs
تابع میلیثانیه بیکاری(): صحیح۶۴نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Idle.salam
منقضی شده Expired
تابع منقضی شده(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Idle.salam
آزادسازی Free
تابع آزادسازی()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Idle.salam
گره Node
ساختار گرهتجزیه لینک آن را پر میکند و گره به لینک دوباره مینویسدش.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| معتبر | valid | منطقی = نادرست | وقتی تجزیه شکست بخورد نادرست است؛ خطا را ببینید. |
| خطا | error | رشته = "" | دلیل شکست تجزیه. |
| پروتکل | protocol | رشته = "" | vmess، vless، trojan یا ss. |
| توضیح | remark | رشته = "" | نام انسانی پس از # در پیوند. |
| میزبان | host | رشته = "" | نام میزبان یا IP سرور. |
| درگاه | port | صحیح = 0 | درگاه سرور. |
| شناسه | uuid | رشته = "" | شناسهی کاربر در VMess و VLESS. |
| گذرواژه | password | رشته = "" | گذرواژهی Trojan و Shadowsocks. |
| روش | method | رشته = "" | رمز: روش Shadowsocks یا امنیت VMess. |
| شناسه جایگزین | alter_id | صحیح = 0 | شناسهی جایگزین VMess، معمولا ۰. |
| جریان | flow | رشته = "" | جریان VLESS، مثل xtls-rprx-vision. |
| رمزگذاری | encryption | رشته = "" | فیلد رمزگذاری VLESS، معمولا none. |
| شبکه | network | رشته = "tcp" | شبکهی انتقال: tcp، ws، grpc و مانند آن. پیشفرض tcp. |
| نوع سرآیند | header_type | رشته = "" | نوع پنهانسازی سرآیند در انتقال. |
| تی ال اس | tls | منطقی = نادرست | درست وقتی پیوند TLS بخواهد. |
| امنیت | security | رشته = "" | none، tls یا reality. |
| نام سرور | sni | رشته = "" | نام سروری که در دستدهی TLS فرستاده میشود. |
| پروتکل برنامه | alpn | رشته = "" | فهرست ALPN، با ویرگول جدا شده. |
| اثر انگشت | fingerprint | رشته = "" | نام اثر انگشت کارخواه، مثل chrome. |
| مسیر | path | رشته = "" | مسیر وبسوکت یا HTTP. |
| سرآیند میزبان | host_header | رشته = "" | سرآیند Host برای انتقالهای وبسوکت و HTTP. |
| نام سرویس | service_name | رشته = "" | نام سرویس gRPC. |
| حالت جی آر پی سی | grpc_mode | رشته = "" | برای پیوند gRPC با mode=multi (یا پیوند vmess با نوع multi) مقدار multi است، برای gun تهی. |
| کلید عمومی | public_key | رشته = "" | کلید عمومی REALITY. |
| شناسه کوتاه | short_id | رشته = "" | شناسهی کوتاه REALITY. |
| مسیر عنکبوتی | spider_x | رشته = "" | مسیر عنکبوتی REALITY. |
| افزونه | plugin | رشته = "" | رشتهی افزونهی Shadowsocks، اگر باشد. |
| اجازه ناامن | allow_insecure | منطقی = نادرست | درست وقتی پیوند بگوید بررسی گواهی را نادیده بگیر. آن را نشانهی هشدار بدانید. |
// زبان: فارسی
واردسازی شبکه.تونل
تابع ریشه:
link := "vless://b831381d-6324-4d53-ad4f-8cda48b30811@203.0.113.9:443?encryption=none&security=tls&sni=cdn.example.com&type=ws&host=cdn.example.com&path=%2Fws#Berlin%201"
n := تونل.تجزیه لینک(link)
سرچاپ n.معتبر، n.پروتکل، تونل.نشانی گره(n).متن()، n.شبکه، n.امنیت، n.نام سرور، n.مسیر
سرچاپ تونل.برچسب گره(n)
سرچاپ تونل.گره به لینک(n) برابر link
سرچاپ تونل.تجزیه لینک("vless://@host:1").معتبر، تونل.تجزیه لینک("http://x").معتبر
سرچاپ تونل.تجزیه لینک("ss://aes-128-gcm:secret@10.0.0.1:8388#ss").روش
text := link + "\n# a comment\ntrojan://pw@t.example.org:443#T\nnot a link\n"
sub := تونل.تجزیه اشتراک(text)
سرچاپ sub.گرهها.طول()، sub.ردشده، تونل.برچسب گره(sub.گرهها[1])
سرچاپ تونل.رمزگذاری درصدی("a b/c")، تونل.رمزگشایی درصدی("%D8%B3%D9%84%D8%A7%D9%85")
سرچاپ تونل.رمزگذاری پایه۶۴ نشانی("subjects?_d>>")، تونل.رمزگشایی پایه۶۴("c2FsYW0")
پایاناشتراک Subscription
ساختار اشتراک| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| گرهها | nodes | وکتور<گره> | گرههای معتبر به ترتیب. |
| ردشده | skipped | صحیح = 0 | چند سطر ناتهی و غیرتوضیح پیوند معتبر نبودند. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam
جریان Stream
میانجی جریاننمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
جریان تی سی پی TcpStream
ساختار جریان تی سی پیجریان روی اتصال TCP ساده. پوشاندن تی سی پی یکی میسازد.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| اتصال | conn | تی سی پی.اتصال شبکه | اتصال TCP. |
// زبان: فارسی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی شبکه.وبسوکت
واردسازی همگام سازی
ناپایا tcp_port := 0
ناپایا ws_port := 0
ناپایا ready := همگام سازی.گروه انتظار جدید()
تابع tcp_server():
srv := تی سی پی.پیوند(0)
tcp_port = تی سی پی.درگاه(srv)
همگام سازی.اتمام(ready)
c := تی سی پی.پذیرش(srv)
s := تونل.پوشاندن تی سی پی(c)
s.نوشتن("tcp:" + s.خواندن(100))
s.بستن()
پایان
تابع ws_server():
srv := وبسوکت.شنود(0)
ws_port = وبسوکت.درگاه(srv)
همگام سازی.اتمام(ready)
c := وبسوکت.پذیرش(srv)
s := تونل.پوشاندن وبسوکت(c)
first := s.خواندن(5)
rest := s.خواندن(100)
s.نوشتن("ws:" + first + rest)
s.بستن()
پایان
تابع ریشه:
همگام سازی.افزودن(ready، 2 برگردان صحیح۶۴)
t1 := نخساز(tcp_server)
t2 := نخساز(ws_server)
همگام سازی.انتظار(ready)
plain := تونل.اتصال تی سی پی("127.0.0.1"، tcp_port، 2000)
plain.نوشتن("hello")
سرچاپ plain.خواندن(100)
plain.بستن()
conn := وبسوکت.شماره گیری("127.0.0.1"، ws_port، "/")
stream := تونل.پوشاندن وبسوکت(conn)
تونل.نوشتن همه(stream، "hello world")
سرچاپ تونل.خواندن یک بایت(stream)
سرچاپ stream.خواندن(100)
stream.بستن()
نخپیوند(t1)
نخپیوند(t2)
پایانخواندن Read
تابع خواندن(max: صحیح): رشتهخواندن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
خواندن بایت ReadBytes
تابع خواندن بایت(buf: تهی*، max: صحیح): صحیحخواندن بایت را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
نوشتن Write
تابع نوشتن(data: رشته): صحیحنوشتن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
نوشتن بایت WriteBytes
تابع نوشتن بایت(ptr: تهی*، n: صحیح): صحیحنوشتن بایت را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
تنظیم مهلت SetDeadline
تابع تنظیم مهلت(millis: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
خاموش کردن Shutdown
تابع خاموش کردن()خاموش کردن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
بستن نوشتن CloseWrite
تابع بستن نوشتن()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
بستن Close
تابع بستن()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
معتبر Ok
تابع معتبر(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
جریان تی ال اس TlsStream
ساختار جریان تی ال اسجریان روی اتصال TLS. پوشاندن تی ال اس یکی میسازد.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| اتصال | conn | تی ال اس.اتصال | اتصال TLS. |
خواندن Read
تابع خواندن(max: صحیح): رشتهخواندن را ببینید.خواندن بایت ReadBytes
تابع خواندن بایت(buf: تهی*، max: صحیح): صحیحخواندن بایت را ببینید.نوشتن Write
تابع نوشتن(data: رشته): صحیحنوشتن را ببینید.نوشتن بایت WriteBytes
تابع نوشتن بایت(ptr: تهی*، n: صحیح): صحیحنوشتن بایت را ببینید.تنظیم مهلت SetDeadline
تابع تنظیم مهلت(millis: صحیح)خاموش کردن Shutdown
تابع خاموش کردن()خاموش کردن را ببینید.بستن نوشتن CloseWrite
تابع بستن نوشتن()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
بستن Close
تابع بستن()معتبر Ok
تابع معتبر(): منطقیجریان وبسوکت WsStream
ساختار جریان وبسوکتجریان روی اتصال وبسوکت. پوشاندن وبسوکت یکی میسازد.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| اتصال | conn | وبسوکت.اتصال وب | اتصال وبسوکت. |
| داده معلق | pending | تهی* | پیامی که فقط تا نیمه خوانده شده. |
| حجم داده معلق | pending_len | صحیح = 0 | اندازهی پیام نیمهخوانده. |
| آغاز داده معلق | pending_off | صحیح = 0 | چه مقدار از آن خوانده شده. |
| مهلت | timeout | صحیح = -1 | مهلت به میلیثانیه، یا -1 برای بیمهلت. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
خواندن Read
تابع خواندن(max: صحیح): رشتهخواندن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
خواندن بایت ReadBytes
تابع خواندن بایت(buf: تهی*، max: صحیح): صحیحخواندن بایت را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
نوشتن Write
تابع نوشتن(data: رشته): صحیحنوشتن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
نوشتن بایت WriteBytes
تابع نوشتن بایت(ptr: تهی*، n: صحیح): صحیحنوشتن بایت را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
تنظیم مهلت SetDeadline
تابع تنظیم مهلت(millis: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
خاموش کردن Shutdown
تابع خاموش کردن()خاموش کردن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
بستن نوشتن CloseWrite
تابع بستن نوشتن()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
بستن Close
تابع بستن()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
معتبر Ok
تابع معتبر(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
جریان مسدود ClosedStream
ساختار جریان مسدود| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| بیکاربرد | unused | صحیح = 0 | استفاده نمیشود. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
خواندن Read
تابع خواندن(_max: صحیح): رشتهخواندن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
خواندن بایت ReadBytes
تابع خواندن بایت(_buf: تهی*، _max: صحیح): صحیحخواندن بایت را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
نوشتن Write
تابع نوشتن(_data: رشته): صحیحنوشتن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
نوشتن بایت WriteBytes
تابع نوشتن بایت(_ptr: تهی*، _n: صحیح): صحیحنوشتن بایت را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
تنظیم مهلت SetDeadline
تابع تنظیم مهلت(millis: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
خاموش کردن Shutdown
تابع خاموش کردن()خاموش کردن را ببینید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
بستن نوشتن CloseWrite
تابع بستن نوشتن()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
بستن Close
تابع بستن()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
معتبر Ok
تابع معتبر(): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
پیکربندی درونسو InboundConfig
ساختار پیکربندی درونسو| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| برچسب | tag | رشته = "" | نامی که بقیهی پیکربندی برای این درونسو به کار میبرند. |
| پروتکل | protocol | رشته = "" | نام پروتکل، مثل mixed، socks یا http. درونسوساز ثبتشده را برمیگزیند. |
| نشانی شنود | listen | رشته = "127.0.0.1" | نشانیای که روی آن گوش داده میشود. پیشفرض 127.0.0.1 است. |
| درگاه | port | صحیح = 0 | درگاهی که روی آن گوش داده میشود. درگاهِ متنی در JSON هم پذیرفته میشود. |
| تنظیمات | settings | رشته = "" | JSON خام شیء settings، به صورت متن نگه داشته میشود تا پروتکل بخواند. |
| تنظیمات جریان | stream_settings | رشته = "" | JSON خام streamSettings یک درونسو، به صورت متن نگه داشته میشود تا پروتکل بخواند. |
// زبان: فارسی
واردسازی شبکه.تونل
تابع ریشه:
text := `{
"inbounds": [{"tag": "in", "listen": "127.0.0.1", "port": 10808, "protocol": "mixed"}],
"outbounds": [
{"tag": "proxy", "protocol": "trojan", "settings": {"servers": [{"address": "t.example.org", "port": 443, "password": "pw"}]}},
{"tag": "direct", "protocol": "freedom"},
{"tag": "block", "protocol": "blackhole"}
],
"routing": {"defaultOutbound": "proxy", "rules": [
{"type": "field", "domain": ["domain:ir"], "outboundTag": "direct"},
{"type": "field", "ip": ["geoip:private"], "outboundTag": "direct"},
{"type": "field", "port": "25", "outboundTag": "block"}
]}
}`
c := تونل.تجزیه پیکربندی(text)
سرچاپ c.خطاها.طول()، c.درونسوها.طول()، c.خروجیها.طول()، c.قاعدهها.طول()، c.خروجی پیشفرض
سرچاپ c.درونسوها[0].درگاه، c.خروجیها[0].پروتکل، c.قاعدهها[2].درگاه
سرچاپ "problems:"، تونل.اعتبارسنجی پیکربندی(c).طول()
rt := تونل.ساخت مسیریاب(c)
سرچاپ rt.تطبیق میزبان("divar.ir"، 443)، rt.تطبیق میزبان("192.168.1.1"، 80)، rt.تطبیق میزبان("mail.example.com"، 25)، rt.تطبیق میزبان("example.com"، 443)
سرچاپ تونل.تجزیه پیکربندی(تونل.پیکربندی به جیسون(c)).خروجیها.طول()
bad := تونل.تجزیه پیکربندی(`{"outbounds":[{"tag":"a","protocol":"freedom"},{"tag":"a","protocol":"freedom"}],"routing":{"rules":[{"outboundTag":"zzz","domain":["domain:x"]}]}}`)
هر e در تونل.اعتبارسنجی پیکربندی(bad):
سرچاپ e
پایان
سرچاپ تونل.بارگذاری پیکربندی("/nonexistent/config.json").خطاها.طول()
node := تونل.تجزیه لینک("trojan://pw@t.example.org:443?security=tls&sni=t.example.org#T")
out := تونل.خروجی از گره(node، "proxy")
سرچاپ out.برچسب، out.پروتکل، تونل.گره به لینک(تونل.گره از خروجی(out)) برابر تونل.گره به لینک(node)
ناپایا nodes := وکتور {} برگردان وکتور<تونل.گره>
nodes.بیفزا(node)
gen := تونل.پیکربندی از گرهها(nodes، 7890)
سرچاپ gen.درونسوها[0].درگاه، gen.خروجیها.طول()، gen.خروجی پیشفرض، gen.قاعدهها.طول()
پایانپیکربندی خروجی OutboundConfig
ساختار پیکربندی خروجی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| برچسب | tag | رشته = "" | نامی که قاعدهها برای فرستادن ترافیک به اینجا به کار میبرند. |
| پروتکل | protocol | رشته = "" | نام پروتکل. freedom و blackhole درونیاند؛ بقیه به یک خروجیساز ثبتشده نیاز دارند. |
| تنظیمات | settings | رشته = "" | JSON خام شیء settings. |
| تنظیمات جریان | stream_settings | رشته = "" | JSON خام streamSettings: شبکه، امنیت و گزینههایشان. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam
پیکربندی قاعده RuleConfig
ساختار پیکربندی قاعده| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| دامنهها | domain | وکتور<رشته> | شرطهای دامنه مثل domain:ir، full:a.com، keyword:bank یا regexp:.... |
| آیپیها | ip | وکتور<رشته> | شرطهای IP: بازههای CIDR، نشانیهای تک یا geoip:private. |
| درگاه | port | رشته = "" | شرط درگاه مثل 25,465 یا 8000-8100. |
| برچسب خروجی | outbound_tag | رشته = "" | برچسب خروجیای که ترافیک را میگیرد. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam
پیکربندی Config
ساختار پیکربندیتجزیه پیکربندی و بارگذاری پیکربندی آن را میسازند.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| سطح گزارش | log_level | رشته = "warning" | سطح گزارش از پیکربندی. پیشفرض warning است. |
| درونسوها | inbounds | وکتور<پیکربندی درونسو> | درونسوها به ترتیب پرونده. |
| خروجیها | outbounds | وکتور<پیکربندی خروجی> | خروجیها به ترتیب پرونده. |
| قاعدهها | rules | وکتور<پیکربندی قاعده> | قاعدههای مسیریابی به ترتیب پرونده. نخستین تطبیق برنده است. |
| خروجی پیشفرض | default_outbound | رشته = "" | برچسبی که وقتی هیچ قاعدهای نخورد به کار میرود. اگر نباشد، نخستین خروجی. |
| خطاها | errors | وکتور<رشته> | مشکلهای پیداشده هنگام تجزیه، به صورت سطرهای خوانا. برای پیکربندی درست خالی است. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam
خروجیساز OutboundMaker
میانجی خروجیسازشمارهگیر بسازد. با ثبت خروجی ثبتش کنید تا پیکربندیها نام پروتکل را به کار ببرند.// زبان: فارسی
واردسازی شبکه.تونل
ساختار LoopbackMaker:
همگانی unused: صحیح = 0
همگانی تابع Protocol(): رشته:
برگشت "loopback"
پایان
همگانی تابع Make(_cfg: تونل.پیکربندی خروجی): پویا تونل.شمارهگیر:
برگشت تونل.مستقیم()
پایان
پایان
ساختار SilentInbound:
همگانی unused: صحیح = 0
همگانی تابع Protocol(): رشته:
برگشت "silent"
پایان
همگانی تابع Make(_cfg: تونل.پیکربندی درونسو): پویا تونل.پذیرنده:
برگشت تونل.پروتکل خالی {}
پایان
پایان
تابع ریشه:
سرچاپ تونل.خروجی ثبت شده("freedom")، تونل.خروجی ثبت شده("loopback")
تونل.ثبت خروجی(LoopbackMaker {})
تونل.ثبت درونسو(SilentInbound {})
سرچاپ تونل.خروجی ثبت شده("loopback")، تونل.درونسو ثبت شده("silent")
سرچاپ تونل.ساخت خروجی(تونل.پیکربندی خروجی { پروتکل = "loopback" }).نام()
سرچاپ تونل.ساخت خروجی(تونل.پیکربندی خروجی { پروتکل = "freedom" }).نام()
سرچاپ تونل.ساخت خروجی(تونل.پیکربندی خروجی { پروتکل = "nobody-registered-this" }).نام()
سرچاپ تونل.ساخت درونسو(تونل.پیکربندی درونسو { پروتکل = "silent" }).نام()
c := تونل.تجزیه پیکربندی(`{"outbounds":[{"tag":"lo","protocol":"loopback"},{"tag":"deny","protocol":"blackhole"}],"routing":{"defaultOutbound":"lo","rules":[{"domain":["full:blocked.test"],"outboundTag":"deny"}]}}`)
rd := تونل.ساخت شمارهگیر(c)
سرچاپ rd.گزینش("lo").نام()، rd.گزینش("deny").نام()، rd.گزینش("missing").نام()
سرچاپ rd.اتصال(تونل.نشانی جدید("blocked.test"، 80)).معتبر()، rd.آخرین برچسب
پایاندرونسوساز InboundMaker
میانجی درونسوسازپذیرنده بسازد. با ثبت درونسو ثبتش کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Registry.salam
سقف اتصالها ConnLimits
ساختار سقف اتصالها| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| فعال | active | صحیح۶۴* | شمار مشترک اتصالهای پذیرفتهشده. |
| بیشینه اتصال همزمان | max_connections | صحیح = 1024 | سقف اتصالها؛ ۰ یعنی بدون سقف. |
| بیشینه دست دادن مبدا | max_per_source | صحیح = 32 | دستدهیهای مجاز در جریان برای هر مبدا؛ ۰ یعنی بدون حد. |
| مهلت کل دستدهی | deadline_ms | صحیح = 10000 | کل زمان دستدهی به میلیثانیه؛ ۰ یعنی بدون حد. |
| مبداها | sources | جدول مبداها | شمارش هر مبدا. |
پذیرش Admit
ساختار پذیرش| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| موفق | ok | منطقی = نادرست | درست وقتی اتصال پذیرفته شده است. |
| مبدا | host | رشته = "" | نشانی مبدا. |
| برگه پایش | ticket | صحیح۶۴ = 0 | برگهی مهلت. |
| شمرده شده | counted | منطقی = نادرست | درست وقتی در حد هر مبدا شمرده شده است. |
| نگه داشته | held | منطقی = نادرست | درست تا وقتی جایگاهی نگه داشته شده است. |
| تمام شده | done | منطقی = نادرست | درست وقتی مرحلهی دستدهی پایان یافته است. |
نتیجه جستجو LookupResult
ساختار نتیجه جستجو| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| آیپیها | ips | وکتور<رشته> | متن نشانیهای IP نسخه چهار و شش. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
حلکننده میزبان HostResolver
میانجی حلکننده میزباننمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
حلکننده خالی NullResolver
ساختار حلکننده خالی| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| بیکاربرد | unused | صحیح = 0 | بیکاربرد. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
جستجو Lookup
تابع جستجو(_host: رشته): نتیجه جستجونمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
حافظه نهان حل نام ResolveCache
ساختار حافظه نهان حل نام| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| قفل | mu | همگام سازی.قفل | قفل حافظه. |
| آیپیها | ips | نگاشت<رشته، وکتور<رشته>> | نشانیها به تفکیک نام. |
| انقضا | expires | نگاشت<رشته، صحیح۶۴> | زمان انقضای هر پاسخ به میلیثانیه. |
| ماندگاری | ttl_ms | صحیح۶۴ = 300000 | مدت نگهداری پاسخ. پیشفرض ۳۰۰۰۰۰. |
| بیشینه | max | صحیح = 4096 | تعداد نامها پیش از خالی شدن حافظه. |
| جستجوها | lookups | صحیح = 0 | شمار جستجوهای واقعی. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
تطبیقدهنده Matcher
ساختار تطبیقدهندهRule... پر کنید، نه دستی.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| نوع | kind | صحیح = 0 | یکی از ثابتهای M_. |
| مقدار | value | رشته = "" | متن شرط. |
| شبکه | net | وکتور<صحیح> | برای CIDR: نشانی شبکه به صورت عدد. |
| پیشوند | prefix | صحیح = 0 | برای CIDR: طول پیشوند به بیت. |
| کمینه | lo | صحیح = 0 | برای بازهی درگاه: کمترین درگاه. |
| بیشینه | hi | صحیح = 0 | برای بازهی درگاه: بیشترین درگاه. |
| مجموعه دامنه | dset | مجموعه دامنه | برای تطبیق GeoSite: مجموعه دامنه. |
| مجموعه آیپی | iset | مجموعه آیپی | برای تطبیق GeoIP: مجموعه نشانی. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
قاعده Rule
ساختار قاعده| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| برچسب | tag | رشته = "" | برچسب خروجیای که قاعده برمیگزیند. |
| مقصدها | dest | وکتور<تطبیقدهنده> | تطبیقدهندههای مقصد: هر یک کافی است. |
| درگاهها | ports | وکتور<تطبیقدهنده> | تطبیقدهندههای درگاه: هر یک کافی است. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
مسیریاب Router
ساختار مسیریاب| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| قاعدهها | rules | وکتور<قاعده> | قاعدهها به ترتیبی که امتحان میشوند. |
| برچسب پیشفرض | default_tag | رشته = "direct" | برچسبی که وقتی هیچ قاعدهای نخورد برگردانده میشود. |
| حلکننده | resolver | dyn حلکننده میزبان | برای تبدیل مقصد دامنهای به نشانی تا قاعدههای CIDR و GeoIP بخورند. |
| حلکننده دارد | has_resolver | منطقی = نادرست | پس از تنظیم حلکننده درست است. |
| حافظه نهان | cache | حافظه نهان حل نام | پاسخهای بهیادماندهی حلکننده. |
نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
حل نام Resolve
تابع حل نام(host: رشته): وکتور<وکتور<صحیح>>نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
تطبیق Match
تابع تطبیق(target: نشانی): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
تطبیق میزبان MatchHost
تابع تطبیق میزبان(host: رشته، port: صحیح): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
مجموعه قاعده RuleSet
ساختار مجموعه قاعدهتجزیه قاعدهها برمیگرداند: مسیریاب و فهرست سطرهایی که نتوانست به کار ببرد.| نام | انگلیسی | گونه | توضیح |
|---|---|---|---|
| مسیریاب | router | مسیریاب | مسیریابی که از سطرهای درست ساخته شد. |
| خطاها | errors | وکتور<رشته> | برای هر سطر بد یک پیام، با شمارهی سطر. |
// زبان: فارسی
واردسازی شبکه.تونل
تابع ریشه:
text := "# send Iranian sites direct\nDOMAIN-SUFFIX,ir,direct\nDOMAIN-KEYWORD,tracker,block\nIP-CIDR,203.0.113.0/24,direct\nGEOIP,PRIVATE,direct\nDST-PORT,25,block\nthis line is broken\nFINAL,proxy\n"
set := تونل.تجزیه قاعدهها(text، "proxy")
سرچاپ "errors:"، set.خطاها.طول()
هر e در set.خطاها:
سرچاپ e
پایان
هر host در ["shop.ir"، "my-tracker.net"، "203.0.113.5"، "127.0.0.1"، "example.com"]:
سرچاپ host، set.مسیریاب.تطبیق میزبان(host، 443)
پایان
سرچاپ set.مسیریاب.تطبیق میزبان("example.com"، 25)
missing := تونل.بارگذاری قاعدهها("/nonexistent/rules.txt"، "direct")
سرچاپ missing.خطاها.بگیر(0)
پایانپایاها و متغیرها
فرمانها CMD_…
فرمان.| نام | انگلیسی | مقدار |
|---|---|---|
| فرمان اتصال | CMD_CONNECT | 1 |
| فرمان یو دی پی | CMD_UDP | 3 |
نوع پروتکل ترکیبی MIXED_…
تشخیص ترکیبی برمیگرداند.| نام | انگلیسی | مقدار |
|---|---|---|
| ناشناخته | MIXED_UNKNOWN | 0 |
| اچ تی تی پی | MIXED_HTTP | 1 |
| ساکس۴ | MIXED_SOCKS4 | 4 |
| ساکس۵ | MIXED_SOCKS5 | 5 |
نوعهای نشانی ADDR_…
نوع.| نام | انگلیسی | مقدار |
|---|---|---|
| نشانی آیپی۴ | ADDR_IPV4 | 1 |
| نشانی دامنه | ADDR_DOMAIN | 3 |
| نشانی آیپی۶ | ADDR_IPV6 | 4 |
دامنههای ایران IRAN_DOMAINS
پایا دامنههای ایران: رشته = "# bundled Iran direct list
domain:ir
domain:xn--mgba3a4f16a
domain:xn--mgba3a4fra1a
digikala.com
aparat.com
snapp.taxi
tapsi.cab
bale.ai
eitaa.com
telewebion.com
filimo.com
namava.ir
rubika.ir
soroush-app.ir
"نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
مهلت مستقیم DeadlineDirect
پایا مهلت مستقیم: صحیح۳۲ = -2نوع تطبیقدهندهها M_…
نوع.| نام | انگلیسی | مقدار |
|---|---|---|
| تطبیق دامنه | M_DOMAIN | 1 |
| تطبیق پسوند | M_SUFFIX | 2 |
| تطبیق کلیدواژه | M_KEYWORD | 3 |
| تطبیق عبارت باقاعده | M_REGEX | 4 |
| تطبیق سیآیدیآر | M_CIDR | 5 |
| تطبیق درگاه | M_PORT | 6 |
| تطبیق جیاوسایت | M_GEOSITE | 7 |
| تطبیق جیاوآیپی | M_GEOIP | 8 |
تابعها
جدول مبداها جدید NewSourceTable
تابع جدول مبداها جدید(): جدول مبداهانمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
کلید مبدا SourceKey
تابع کلید مبدا(remote: رشته): رشته// زبان: فارسی
واردسازی شبکه.تونل
تابع ریشه:
سرچاپ تونل.کلید مبدا("::ffff:203.0.113.9")، تونل.کلید مبدا("2001:db8:1:2::7")
local := تونل.شنود محلی آیپی۶(0)
سرچاپ local.معتبر()
local.توقف()
dual := تونل.شنود تی سی پی دوگانه(0)
سرچاپ dual.معتبر()
dual.توقف()
at := تونل.شنود تی سی پی در نشانی("::1"، 0)
سرچاپ at.معتبر()، at.میزبان
at.توقف()
inbound := تونل.شنود تی سی پی دوگانه درونسو(0)
سرچاپ inbound.معتبر()
inbound.توقف()
پایانورود مبدا SourceEnter
تابع ورود مبدا(t: جدول مبداها، remote: رشته، limit: صحیح): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
خروج مبدا SourceLeave
تابع خروج مبدا(t: جدول مبداها، remote: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
کارساز پذیرش جدید NewAcceptServer
تابع کارساز پذیرش جدید(a: dyn پذیرنده اتصال، host: رشته): کارساز پذیرشنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
شنود تی سی پی روی نشانی ListenTcpOn
تابع شنود تی سی پی روی نشانی(host: رشته، port: صحیح): کارساز پذیرشنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
شنود تی سی پی دوگانه ListenTcpDual
تابع شنود تی سی پی دوگانه(port: صحیح): کارساز پذیرش:: گوش میدهد، پس کارخواههای IPv4 و IPv6 هر دو پذیرفته میشوند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-IPv6.salam
شنود محلی آیپی۶ ListenLocal6
تابع شنود محلی آیپی۶(port: صحیح): کارساز پذیرش::1 گوش میدهد. درگاه ۰ یک درگاه آزاد برمیگزیند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-IPv6.salam
شنود محلی ListenLocal
تابع شنود محلی(port: صحیح): کارساز پذیرشنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
شروع پذیرش StartAccepting
تابع شروع پذیرش(srv: کارساز پذیرش، proto: dyn پذیرنده، h: dyn دستگیره)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
سیاست مقصد جدید NewDestPolicy
تابع سیاست مقصد جدید(): سیاست مقصداجازه آدرسهای خصوصی در سیاست PolicyAllowPrivate
تابع اجازه آدرسهای خصوصی در سیاست(p &: سیاست مقصد، enabled: منطقی)allow_private را روشن یا خاموش میکند.افزودن بازه مجاز PolicyAllowCidr
تابع افزودن بازه مجاز(p &: سیاست مقصد، text: رشته): منطقیافزودن بازه ممنوع PolicyDenyCidr
تابع افزودن بازه ممنوع(p &: سیاست مقصد، text: رشته): منطقیافزودن پسوند مجاز PolicyAllowSuffix
تابع افزودن پسوند مجاز(p &: سیاست مقصد، suffix: رشته)افزودن پسوند ممنوع PolicyDenySuffix
تابع افزودن پسوند ممنوع(p &: سیاست مقصد، suffix: رشته)تعیین حلکننده سیاست PolicySetResolver
تابع تعیین حلکننده سیاست(p &: سیاست مقصد، r: dyn حلکننده میزبان)میزبان حلقه محلی است IsLoopbackHost
تابع میزبان حلقه محلی است(host: رشته): منطقیسیاست برای نشانی شنود PolicyForBind
تابع سیاست برای نشانی شنود(p: سیاست مقصد، bind_host: رشته): سیاست مقصدallow_private فقط وقتی میزبان حلقه محلی است اثر دارد.آیپی ویژه است IsSpecialIP
تابع آیپی ویژه است(b: وکتور<صحیح>): منطقینشانی خصوصی است IsPrivateAddress
تابع نشانی خصوصی است(ip: رشته): منطقیبررسی بایتهای آیپی PolicyCheckBytes
تابع بررسی بایتهای آیپی(p: سیاست مقصد، ip: وکتور<صحیح>): منطقیبررسی آیپی در سیاست PolicyCheckIP
تابع بررسی آیپی در سیاست(p: سیاست مقصد، ip: رشته): منطقیبررسی نام در سیاست PolicyCheckName
تابع بررسی نام در سیاست(p: سیاست مقصد، host: رشته): منطقیطرح سیاست PolicyPlan
تابع طرح سیاست(p: سیاست مقصد، a: نشانی، resolve: منطقی): طرح اتصالips نتیجه وصل شوید.نگهبان Guard
تابع نگهبان(inner: dyn شمارهگیر، p: سیاست مقصد): شمارهگیر نگهباننگهبان مسیریاب GuardRouter
تابع نگهبان مسیریاب(rd: شمارهگیر مسیریاب، p: سیاست مقصد): شمارهگیر نگهبانلوله جدید NewPipe
تابع لوله جدید(): جفت لولهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
سر اول لوله PipeA
تابع سر اول لوله(p: جفت لوله): dyn جریانجریان برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
سر دوم لوله PipeB
تابع سر دوم لوله(p: جفت لوله): dyn جریانجریان برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
پوشاندن تی سی پی WrapTcp
تابع پوشاندن تی سی پی(c: تی سی پی.اتصال شبکه): dyn جریانجریان میپوشاند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
پوشاندن تی ال اس WrapTls
تابع پوشاندن تی ال اس(c: تی ال اس.اتصال): dyn جریانجریان میپوشاند.پوشاندن وبسوکت WrapWebSocket
تابع پوشاندن وبسوکت(c: وبسوکت.اتصال وب): dyn جریانجریان میپوشاند: بایتهای نوشتهشده به پیام دودویی تبدیل میشوند و پیامهای ورودی به شکل جریان پیوستهی بایت خوانده میشوند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
اتصال تی سی پی DialTcp
تابع اتصال تی سی پی(host: رشته، port: صحیح، timeout_ms: صحیح): dyn جریانمعتبر را بررسی کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam
با پیشوند WithPrefix
تابع با پیشوند(s: dyn جریان، prefix: رشته): dyn جریاننمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
خواندن کامل ReadFull
تابع خواندن کامل(s: dyn جریان، buf: تهی*، n: صحیح): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
نوشتن همه WriteAll
تابع نوشتن همه(s: dyn جریان، data: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
نوشتن همه بایتها WriteAllBytes
تابع نوشتن همه بایتها(s: dyn جریان، ptr: تهی*، n: صحیح): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
خواندن یک بایت ReadByte
تابع خواندن یک بایت(s: dyn جریان): صحیح-1.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
خواندن با جداکننده ReadUntil
تابع خواندن با جداکننده(s: dyn جریان، delim: رشته، max: صحیح): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam
شمارهگیر مسیریاب جدید NewRouterDialer
تابع شمارهگیر مسیریاب جدید(router: مسیریاب): شمارهگیر مسیریابنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-RouterDialer.salam
افزودن به شمارهگیر مسیریاب RouterDialerAdd
تابع افزودن به شمارهگیر مسیریاب(rd &: شمارهگیر مسیریاب، tag: رشته، d: dyn شمارهگیر)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-RouterDialer.salam
ساخت شمارهگیر BuildDialer
تابع ساخت شمارهگیر(c: پیکربندی): شمارهگیر مسیریابپیکربندی کامل یک شمارهگیر مسیریاب میسازد: مسیریابش از قاعدهها و برای هر خروجی یک شمارهگیر.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Registry.salam
تشخیص ترکیبی DetectMixed
تابع تشخیص ترکیبی(first: صحیح): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam
متن بایت ByteString
تابع متن بایت(b: صحیح): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam
ترکیبی جدید NewMixed
تابع ترکیبی جدید(): پروتکل ترکیبیپروتکل ترکیبی خالی برمیگرداند. پروتکلها را با تابعهای MixedSet اضافه کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam
تنظیم ساکس۵ ترکیبی MixedSetSocks5
تابع تنظیم ساکس۵ ترکیبی(m &: پروتکل ترکیبی، p: dyn پذیرنده)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam
تنظیم ساکس۴ ترکیبی MixedSetSocks4
تابع تنظیم ساکس۴ ترکیبی(m &: پروتکل ترکیبی، p: dyn پذیرنده)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam
تنظیم اچ تی تی پی ترکیبی MixedSetHttp
تابع تنظیم اچ تی تی پی ترکیبی(m &: پروتکل ترکیبی، p: dyn پذیرنده)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam
شنود تی سی پی ListenTcp
تابع شنود تی سی پی(port: صحیح): درونسو تی سی پیمعتبر را بررسی کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
شنود تی سی پی در نشانی ListenTcpAt
تابع شنود تی سی پی در نشانی(host: رشته، port: صحیح): درونسو تی سی پیشنود تی سی پی برای یک نشانی مانند ::1 یا ::.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-IPv6.salam
شنود تی سی پی دوگانه درونسو ListenTcpDualInbound
تابع شنود تی سی پی دوگانه درونسو(port: صحیح): درونسو تی سی پیTcpInbound که روی :: برای هر دو خانواده گوش میدهد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-IPv6.salam
سرویسدهی پسزمینه ServeBackground
تابع سرویسدهی پسزمینه(inb: درونسو تی سی پی، proto: dyn پذیرنده، h: dyn دستگیره)سرویسدهی را روی نخ خودش شروع میکند و بیدرنگ برمیگردد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
سرویسدهی پیوسته ServeForever
تابع سرویسدهی پیوسته(inb: درونسو تی سی پی، proto: dyn پذیرنده، h: dyn دستگیره)سرویسدهی را روی نخ فراخواننده اجرا میکند. فقط پس از توقف برمیگردد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
انتقالدهنده جدید NewForwarder
تابع انتقالدهنده جدید(dialer: dyn شمارهگیر، proto: dyn پذیرنده): دستگیره انتقالدستگیره انتقال با شمارندههای تازه میسازد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam
انتقالدهنده نگهباندار جدید NewGuardedForwarder
تابع انتقالدهنده نگهباندار جدید(guard: شمارهگیر نگهبان، proto: dyn پذیرنده): دستگیره انتقالGuardDialer وصل میشود و به درونسو میگوید سیاست مقصد را رد کرده است.زنجیره جدید NewChain
تابع زنجیره جدید(base: dyn شمارهگیر): زنجیرهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Chain.salam
افزودن گام ChainAdd
تابع افزودن گام(c &: زنجیره، hop: dyn اتصالدهنده)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Chain.salam
جایگزین جدید NewFallback
تابع جایگزین جدید(): جایگزیننمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Dialers.salam
افزودن جایگزین FallbackAdd
تابع افزودن جایگزین(f &: جایگزین، d: dyn شمارهگیر)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Dialers.salam
مستقیم Direct
تابع مستقیم(): dyn شمارهگیرشمارهگیر مستقیم را به شکل شمارهگیر برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Dialers.salam
مسدود Block
تابع مسدود(): dyn شمارهگیرشمارهگیر مسدودکننده را به شکل شمارهگیر برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Dialers.salam
از طریق Via
تابع از طریق(upstream: dyn شمارهگیر، hop: dyn اتصالدهنده): dyn شمارهگیرشمارهگیر پراکسی.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Chain.salam
تجزیه آیپی۴ ParseIPv4
تابع تجزیه آیپی۴(s: رشته): وکتور<صحیح>نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Addr.salam
تجزیه آیپی۶ ParseIPv6
تابع تجزیه آیپی۶(text: رشته): وکتور<صحیح>:: و دنبالهی IPv4، را به شانزده عدد تجزیه میکند. در خطا بردار خالی برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Addr.salam
تجزیه آیپی ParseIP
تابع تجزیه آیپی(s: رشته): وکتور<صحیح>نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Addr.salam
قالببندی آیپی FormatIP
تابع قالببندی آیپی(b: وکتور<صحیح>): رشته:: درمیآید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Addr.salam
آیپی است IsIP
تابع آیپی است(s: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Addr.salam
نشانی جدید NewAddr
تابع نشانی جدید(host: رشته، port: صحیح): نشانینشانی میسازد و نوعش را از روی میزبان تعیین میکند. کروشه دور میزبان IPv6 پذیرفته میشود.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Addr.salam
تجزیه نشانی ParseAddr
تابع تجزیه نشانی(s: رشته): نشانیhost:port، 1.2.3.4:80 یا [::1]:80 را تجزیه میکند. درگاهِ نبوده یا خارج از بازه معتبر را نادرست میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Addr.salam
کدگذاری ساکس EncodeSocks
تابع کدگذاری ساکس(a: نشانی): وکتور<طبیعی۸>// زبان: فارسی
واردسازی شبکه.تونل
واردسازی حافظه
تابع hex(v: وکتور<طبیعی۸>): رشته:
digits := "0123456789abcdef"
ناپایا out := ""
تکرار v.طول() در i:
b := v[i] برگردان صحیح
out += digits.زیررشته(b / 16، 1) + digits.زیررشته(b % 16، 1)
پایان
برگشت out
پایان
تابع ریشه:
target := تونل.نشانی جدید("example.com"، 443)
socks := تونل.کدگذاری ساکس(target)
vless := تونل.کدگذاری ویلس(target)
سرچاپ "socks5"، hex(socks)
سرچاپ "vless "، hex(vless)
p := تونل.بایتهای بردار(socks)
back := تونل.کدگشایی ساکس(p، socks.طول())
سرچاپ back.معتبر، back.متن()، back.حجم برابر socks.طول()
q := تونل.بایتهای بردار(vless)
again := تونل.کدگشایی ویلس(q، vless.طول())
سرچاپ again.معتبر، again.متن()
short := تونل.کدگشایی ساکس(p، 3)
سرچاپ "short"، short.معتبر
حافظه.آزادسازی(p)
حافظه.آزادسازی(q)
pair := تونل.لوله جدید()
a := تونل.سر اول لوله(pair)
b := تونل.سر دوم لوله(pair)
تونل.نوشتن همه بایتها(a، تونل.بایتهای بردار(socks)، socks.طول())
سرچاپ تونل.خواندن نشانی ساکس(b).متن()
تونل.نوشتن همه بایتها(a، تونل.بایتهای بردار(vless)، vless.طول())
سرچاپ تونل.خواندن نشانی ویلس(b).متن()
پایانکدگذاری ویلس EncodeVless
تابع کدگذاری ویلس(a: نشانی): وکتور<طبیعی۸>نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wire.salam
کدگشایی ساکس DecodeSocks
تابع کدگشایی ساکس(ptr: تهی*، n: صحیح): نشانیمعتبر نادرست است؛ حجم میگوید چند بایت مصرف شد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wire.salam
کدگشایی ویلس DecodeVless
تابع کدگشایی ویلس(ptr: تهی*، n: صحیح): نشانیکدگشایی ساکس برای SOCKS5 میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wire.salam
بایتهای بردار VectorBytes
تابع بایتهای بردار(v: وکتور<طبیعی۸>): تهی*mem.Free آزادش کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wire.salam
خواندن نشانی ساکس ReadSocksAddr
تابع خواندن نشانی ساکس(s: dyn جریان): نشانینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wire.salam
خواندن نشانی ویلس ReadVlessAddr
تابع خواندن نشانی ویلس(s: dyn جریان): نشانینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wire.salam
پایش دستدهی WatchHandshake
تابع پایش دستدهی(fd: صحیح۶۴، total_ms: صحیح): صحیح۶۴پایان پایش دستدهی WatchDone
تابع پایان پایش دستدهی(ticket: صحیح۶۴): منطقیتعداد پایشهای منقضی WatchExpired
تابع تعداد پایشهای منقضی(): صحیح۶۴مجموعه دامنه جدید NewDomainSet
تابع مجموعه دامنه جدید(): مجموعه دامنهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
مجموعه آیپی جدید NewIpSet
تابع مجموعه آیپی جدید(): مجموعه آیپینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
افزودن دامنه کامل DomainSetFull
تابع افزودن دامنه کامل(s &: مجموعه دامنه، host: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
افزودن پسوند دامنه DomainSetSuffix
تابع افزودن پسوند دامنه(s &: مجموعه دامنه، host: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
افزودن کلیدواژه دامنه DomainSetKeyword
تابع افزودن کلیدواژه دامنه(s &: مجموعه دامنه، word: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
افزودن عبارت باقاعده دامنه DomainSetRegex
تابع افزودن عبارت باقاعده دامنه(s &: مجموعه دامنه، pattern: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
مجموعه دامنه شامل DomainSetContains
تابع مجموعه دامنه شامل(s: مجموعه دامنه، host: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
افزودن شبکه به مجموعه آیپی IpSetAddNet
تابع افزودن شبکه به مجموعه آیپی(s &: مجموعه آیپی، net: وکتور<صحیح>، prefix: صحیح)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
افزودن به مجموعه آیپی IpSetAdd
تابع افزودن به مجموعه آیپی(s &: مجموعه آیپی، cidr: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
مجموعه آیپی شامل IpSetContains
تابع مجموعه آیپی شامل(s: مجموعه آیپی، ip: وکتور<صحیح>): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
تجزیه فهرست دامنه ParseDomainList
تابع تجزیه فهرست دامنه(text: رشته، attr: رشته): مجموعه دامنهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
تجزیه فهرست آیپی ParseIpList
تابع تجزیه فهرست آیپی(text: رشته): مجموعه آیپینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
تنظیم پوشه داده جغرافیایی SetGeoDir
تابع تنظیم پوشه داده جغرافیایی(dir: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
ثبت جیاوسایت RegisterGeoSite
تابع ثبت جیاوسایت(name: رشته، set: مجموعه دامنه)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
ثبت جیاوآیپی RegisterGeoIp
تابع ثبت جیاوآیپی(name: رشته، set: مجموعه آیپی)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
پاک کردن داده جغرافیایی ClearGeo
تابع پاک کردن داده جغرافیایی()نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
جستجوی جیاوسایت LookupGeoSite
تابع جستجوی جیاوسایت(spec: رشته): مجموعه دامنهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
جیاوسایت وجود دارد HasGeoSite
تابع جیاوسایت وجود دارد(spec: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
جستجوی جیاوآیپی LookupGeoIp
تابع جستجوی جیاوآیپی(name: رشته): مجموعه آیپینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
جیاوآیپی وجود دارد HasGeoIp
تابع جیاوآیپی وجود دارد(name: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
بارگذاری جیاوسایت دیایتی LoadGeoSiteDat
تابع بارگذاری جیاوسایت دیایتی(ptr: تهی*، n: صحیح، names: وکتور<رشته>): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
بارگذاری جیاوآیپی دیایتی LoadGeoIpDat
تابع بارگذاری جیاوآیپی دیایتی(ptr: تهی*، n: صحیح، names: وکتور<رشته>): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
بارگذاری پرونده جیاوسایت LoadGeoSiteFile
تابع بارگذاری پرونده جیاوسایت(path: رشته، names: وکتور<رشته>): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
بارگذاری پرونده جیاوآیپی LoadGeoIpFile
تابع بارگذاری پرونده جیاوآیپی(path: رشته، names: وکتور<رشته>): صحیحنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
آمار جدید NewStats
تابع آمار جدید(): آمارنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Relay.salam
آزادسازی آمار FreeStats
تابع آزادسازی آمار(s: آمار)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Relay.salam
زمانسنج بیکاری جدید NewIdleTimer
تابع زمانسنج بیکاری جدید(limit_ms: صحیح۶۴): زمانسنج بیکارینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Idle.salam
رله با آمار RelayWith
تابع رله با آمار(a: dyn جریان، b: dyn جریان، st: آمار، idle_ms: صحیح): نتیجه رلهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Relay.salam
رله Relay
تابع رله(a: dyn جریان، b: dyn جریان): نتیجه رلهرله با آمار بدون شمارنده و حد بیکاری. برمیگرداند در هر جهت چند بایت جابهجا شد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Relay.salam
رمزگشایی درصدی PctDecode
تابع رمزگشایی درصدی(s: رشته): رشته%XX را رمزگشایی میکند. دنبالهی خراب همانطور میماند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam
رمزگذاری درصدی PctEncode
تابع رمزگذاری درصدی(s: رشته): رشته-_.~.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam
رمزگشایی پایه۶۴ B64Decode
تابع رمزگشایی پایه۶۴(s: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam
رمزگذاری پایه۶۴ نشانی B64EncodeUrl
تابع رمزگذاری پایه۶۴ نشانی(s: رشته): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam
تجزیه لینک ParseLink
تابع تجزیه لینک(link: رشته): گرهvmess://، vless://، trojan:// یا ss:// را به یک گره تجزیه میکند. معتبر را بررسی کنید.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam
گره به لینک NodeToLink
تابع گره به لینک(n: گره): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam
تجزیه اشتراک ParseSubscription
تابع تجزیه اشتراک(text: رشته): اشتراک# رد میشوند و سطرهای بد شمرده میشوند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam
نشانی گره NodeAddr
تابع نشانی گره(n: گره): نشانینشانی برمیگرداند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam
برچسب گره NodeLabel
تابع برچسب گره(n: گره): رشتهprotocol://host:port.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam
ثبت خروجی RegisterOutbound
تابع ثبت خروجی(m: dyn خروجیساز)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Registry.salam
ثبت درونسو RegisterInbound
تابع ثبت درونسو(m: dyn درونسوساز)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Registry.salam
خروجی ثبت شده HasOutbound
تابع خروجی ثبت شده(name: رشته): منطقیfreedom و blackhole همیشه هستند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Registry.salam
درونسو ثبت شده HasInbound
تابع درونسو ثبت شده(name: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Registry.salam
ساخت خروجی CreateOutbound
تابع ساخت خروجی(cfg: پیکربندی خروجی): dyn شمارهگیرشمارهگیر مسدودکننده میدهد، پس ترافیک نشت نمیکند و رد میشود.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Registry.salam
ساخت درونسو CreateInbound
تابع ساخت درونسو(cfg: پیکربندی درونسو): dyn پذیرندهپروتکل خالی میدهد.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Registry.salam
تجزیه پیکربندی ParseConfig
تابع تجزیه پیکربندی(text: رشته): پیکربندیپیکربندی تجزیه میکند. مشکلها به جای توقف در خطاها جمع میشوند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam
بارگذاری پیکربندی LoadConfig
تابع بارگذاری پیکربندی(path: رشته): پیکربندینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam
اعتبارسنجی پیکربندی ValidateConfig
تابع اعتبارسنجی پیکربندی(c: پیکربندی): وکتور<رشته>نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam
پیکربندی به جیسون ConfigToJson
تابع پیکربندی به جیسون(c: پیکربندی): رشتهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam
ساخت مسیریاب BuildRouter
تابع ساخت مسیریاب(c: پیکربندی): مسیریابمسیریاب تبدیل میکند که پیشفرضش خروجی پیشفرض پیکربندی است.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam
خروجی از گره OutboundFromNode
تابع خروجی از گره(n: گره، tag: رشته): پیکربندی خروجیگره) را با برچسب دادهشده به یک پیکربندی خروجی تبدیل میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam
گره از خروجی NodeFromOutbound
تابع گره از خروجی(o: پیکربندی خروجی): گرهخروجی از گره: یک پیکربندی خروجی را دوباره به یک گره میخواند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam
پیکربندی از گرهها ConfigFromNodes
تابع پیکربندی از گرهها(nodes: وکتور<گره>، listen_port: صحیح): پیکربندیdirect و block و یک قاعده که دامنههای .ir و نشانیهای خصوصی را مستقیم میفرستد. نخستین گره پیشفرض است.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam
سقف اتصالهای جدید NewConnLimits
تابع سقف اتصالهای جدید(max_connections: صحیح، max_per_source: صحیح، deadline_ms: صحیح): سقف اتصالهاورود به سقفها LimitsEnter
تابع ورود به سقفها(l: سقف اتصالها، fd: صحیح۶۴): پذیرشok نادرست بود توصیفگر را ببندید.پایان دستدهی در سقفها LimitsHandshakeDone
تابع پایان دستدهی در سقفها(l: سقف اتصالها، a &: پذیرش)رها کردن سقفها LimitsRelease
تابع رها کردن سقفها(l: سقف اتصالها، a &: پذیرش)اتصالهای فعال LimitsActive
تابع اتصالهای فعال(l: سقف اتصالها): صحیح۶۴برو Go
تابع برو(fn: صحیح۶۴، arg: تهی*): منطقیقاعده جدید NewRule
تابع قاعده جدید(tag: رشته): قاعدهنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
قاعده دامنه RuleDomain
تابع قاعده دامنه(r &: قاعده، host: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
قاعده پسوند RuleSuffix
تابع قاعده پسوند(r &: قاعده، suffix: رشته)ir با ir و a.b.ir میخورد ولی با evilir نه.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
قاعده کلیدواژه RuleKeyword
تابع قاعده کلیدواژه(r &: قاعده، word: رشته)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
قاعده عبارت باقاعده RuleRegex
تابع قاعده عبارت باقاعده(r &: قاعده، pattern: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
تجزیه سیآیدیآر ParseCidr
تابع تجزیه سیآیدیآر(text: رشته): تطبیقدهنده10.0.0.0/8 یا یک نشانی تک را به یک تطبیقدهنده تجزیه میکند. در خطا نوعـش ۰ است.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
قاعده سیآیدیآر RuleCidr
تابع قاعده سیآیدیآر(r &: قاعده، text: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
قاعده آدرسهای خصوصی RulePrivate
تابع قاعده آدرسهای خصوصی(r &: قاعده)localhost.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
قاعده درگاه RulePort
تابع قاعده درگاه(r &: قاعده، spec: رشته): منطقی80,443,8000-8100 اضافه میکند. اگر بخشی بد باشد نادرست.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
قاعده دامنه با پیشوند RuleDomainSpec
تابع قاعده دامنه با پیشوند(r &: قاعده، spec: رشته): منطقیdomain:، suffix:، full:، keyword:، regexp: یا یک واژهی تنها به عنوان کلیدواژه.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
قاعده آیپی با پیشوند RuleIpSpec
تابع قاعده آیپی با پیشوند(r &: قاعده، spec: رشته): منطقیgeoip:private.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
قاعده مطابقت دارد RuleMatches
تابع قاعده مطابقت دارد(r: قاعده، target: نشانی): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
قاعده با آیپیهای حلشده مطابقت دارد RuleMatchesResolved
تابع قاعده با آیپیهای حلشده مطابقت دارد(r: قاعده، target: نشانی، ips: وکتور<وکتور<صحیح>>): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
تنظیم حلکننده SetResolver
تابع تنظیم حلکننده(rt &: مسیریاب، r: dyn حلکننده میزبان، ttl_ms: صحیح۶۴)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
قاعده جیاوسایت RuleGeoSite
تابع قاعده جیاوسایت(r &: قاعده، name: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
قاعده جیاوآیپی RuleGeoIp
تابع قاعده جیاوآیپی(r &: قاعده، name: رشته): منطقینمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
مسیریاب جدید NewRouter
تابع مسیریاب جدید(default_tag: رشته): مسیریابنمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
افزودن قاعده RouterAdd
تابع افزودن قاعده(rt &: مسیریاب، r: قاعده)نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam
تجزیه قاعدهها ParseRules
تابع تجزیه قاعدهها(text: رشته، default_tag: رشته): مجموعه قاعدهDOMAIN، DOMAIN-SUFFIX، DOMAIN-KEYWORD، DOMAIN-REGEX، IP-CIDR، IP-CIDR6، GEOIP,PRIVATE، DST-PORT و FINAL، هر یک با یک مقدار و یک برچسب. توضیحها با # شروع میشوند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Rules.salam
بارگذاری قاعدهها LoadRules
تابع بارگذاری قاعدهها(path: رشته، default_tag: رشته): مجموعه قاعدهتجزیه قاعدهها تجزیه میکند.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Rules.salam
مسیریاب ایران IranRouter
تابع مسیریاب ایران(direct_tag: رشته، proxy_tag: رشته): مسیریاب.ir (و شکل فارسی .ایران)، نشانیهای خصوصی و محلی و چند سرویس داخلی شناختهشده به برچسب مستقیم میروند و بقیه به برچسب پراکسی.نمونهی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam