کتابخانه‌ی استاندارد · شبکه

تونل 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 را روی همان درگاه می‌پذیرد.

net-tunnel-guide-app.salam
// زبان: فارسی
واردسازی شبکه.تی سی پی
واردسازی شبکه.ساکس
واردسازی شبکه.پراکسی اچ‌تی‌تی‌پی
واردسازی شبکه.تروجان
واردسازی شبکه.تونل
واردسازی همگام سازی

ناپایا 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)
پایان
خروجیخطاهای قاعده: 0 local saw hello abroad saw hello HTTP CONNECT: 200 abroad saw via http اتصال‌ها: 3

تکه‌ها به ترتیب: تجزیه قاعده‌ها مسیریاب را می‌سازد؛ یک شماره‌گیر مسیریاب هر برچسب را به یک شماره‌گیر می‌نگارد (مستقیم برای direct، از طریق با یک اتصال‌دهنده تروجان برای proxy)؛ ترکیبی جدید با تنظیم ساکس۵ ترکیبی و تنظیم اچ تی تی پی ترکیبی پروتکل درون‌سو است؛ انتقال‌دهنده جدید شماره‌گیر و پروتکل را در یک دستگیره به هم می‌بندد؛ شنود تی سی پی و سرویس‌دهی پس‌زمینه سرویس‌دهی را شروع می‌کنند. برای گام‌های بیشتر از زنجیره و برای امتحان چند خروجی پشت هم از جایگزین استفاده کنید.

توصیه‌های عملی برای ایران

  • ترافیک داخلی را مستقیم بفرستید. مسیریاب ایران دامنه‌های .ir (و شکل‌های فارسی .ایران)، نشانی‌های خصوصی و چند سرویس بزرگ داخلی را مستقیم بیرون می‌فرستد و بقیه را به برچسب پراکسی شما. این کار بانک، پیک و سایت‌های دولتی را با سرعت عادی و IP عادی‌شان کار نگه می‌دارد و بار سرورتان را کم می‌کند. سطرهای خودتان را با قاعده پسوند یا یک پرونده‌ی قاعده برای تجزیه قاعده‌ها اضافه کنید.
  • از TLS استفاده کنید و به سرور یک چهره‌ی واقعی بدهید. سرور تروجانی که گواهی واقعی دارد و پشتش یک وب‌سایت واقعی است (تروجان.تعیین جایگزین) برای یک کاوشگر مثل هر سایت HTTPS دیگر دیده می‌شود: هر چه کارخواه احرازشده نباشد به همان سایت داده می‌شود. دامنه‌ای که مال خودتان است، گواهی معتبر و جایگزینی که محتوای واقعی بدهد به کار ببرید.
  • پیام آغازین TLS را تکه‌تکه کنید. بعضی فیلترها نام سرور را در نخستین رکورد TLS می‌خوانند. سانسورشکن می‌تواند آن رکورد را پیش از ارسال تکه‌تکه کند (سانسورشکن.تکه‌تکه کردن پیام آغازین، سانسورشکن.اندازه تکه‌ها از روی نام سرور). آن را یک ابزار بدانید که روی بعضی شبکه‌ها کار می‌کند و روی بعضی نه، و همان‌جایی که هستید آزمایشش کنید.
  • نام‌ها را روی کانال رمزشده حل کنید. DNS ساده روی UDP درگاه ۵۳ خواناست و دست‌کاری‌اش آسان. دی‌اوه‌اچ با DNS روی HTTPS یا TLS حل می‌کند، پاسخ‌ها را نگه می‌دارد و می‌تواند یک حل‌کننده‌ی محلی برای برنامه‌های دیگر راه بیندازد. هر جا می‌شود از سمت پراکسی حل کنید تا جستجوی نام نشان ندهد کجا می‌روید.
  • قاعده‌ها را درست نگه دارید. پراکسی‌ای که همه چیز را بیرون می‌فرستد وبگردی روزمره را خراب می‌کند و آنکه زیادی مستقیم می‌فرستد نشت می‌دهد. فهرست قاعده‌ها را مثل دیوار آتش بازبینی کنید.
  • از آدم‌های آن سوی خط مراقبت کنید. مقصدها را ثبت نکنید، گذرواژه‌ها را بچرخانید و سرورِ با گذرواژه‌ی مشترک را میان کسانی که نمی‌توانید ضامنشان شوید پخش نکنید.

این بسته ابزاری برای حریم خصوصی و دسترسی به اطلاعات است. شما را ناشناس نمی‌کند، پنهان نمی‌کند که از پراکسی استفاده می‌کنید و برای سوءاستفاده از سرویس یا شبکه‌ی دیگران ساخته نشده است.

از پیکربندی یا پیوند اشتراک

اگر برنامه‌تان اشتراک می‌گیرد، تجزیه اشتراک فهرستی از گره می‌دهد و پیکربندی از گره‌ها آن‌ها را به یک پیکربندی آماده تبدیل می‌کند (درون‌سوی ترکیبی، یک خروجی برای هر گره، مستقیم و مسدود، و قاعده‌ی .ir). سپس ساخت شماره‌گیر شماره‌گیر را می‌سازد، ولی فقط برای پروتکل‌های خروجی که سازنده‌ی ثبت‌شده دارند. نوشتن یک سازنده چند سطر است، خروجی‌ساز را ببینید.

راهنمای سریع ساخت برنامه‌ی پراکسی/VPN با سلام

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

  1. پیوند یا اشتراک را بخوانید. تجزیه لینک یک پیوند vless://، vmess://، trojan:// یا ss:// را می‌خواند و تجزیه اشتراک متنی با چند پیوند را (Base64 یا یک پیوند در هر سطر). سطر نامعتبر دور ریخته و در ردشده شمرده می‌شود و برنامه متوقف نمی‌شود. پیوندی که از دیگران می‌رسد ورودی نامطمئن است: پیش از اعتماد به یک گره، اجازه ناامن را ببینید.
  2. پیکربندی بسازید. پیکربندی از گره‌ها یک درون‌سوی ترکیبی (SOCKS4، SOCKS5 و HTTP روی یک درگاه محلی)، یک خروجی برای هر گره، خروجی‌های direct و block و قاعده‌ی .ir را می‌سازد. پس بدون کار اضافه، دامنه‌های .ir و نشانی‌های خصوصی مستقیم می‌روند و بقیه از گره‌ی شما.
  3. DoH و تکه‌تکه کردن را روشن کنید. با ثبت با گزینه‌ها، گزینه‌ی تکه‌تکه کردن ClientHello را در چند بسته می‌فرستد و استفاده از دی او اچ نام‌ها را با DNS روی HTTPS حل می‌کند. هر دو فقط گزینه‌اند: روی بعضی شبکه‌ها اثر دارند و روی بعضی نه.
  4. شروع کنید. شروع همه درون‌سوها را بالا می‌آورد و توقف هر کدام را می‌بندد. اگر پیکربندی در یک پرونده‌ی JSON به سبک V2Ray است، اجرای پیکربندی آن را بارگذاری و بررسی می‌کند و تا Ctrl-C اجرایش می‌کند.
  5. برنامه‌هایتان را وصل کنید. درون‌سو فقط روی 127.0.0.1 شنود می‌کند. در مرورگر یا برنامه، پراکسی SOCKS5 یا HTTP را روی همان درگاه بگذارید. برای آزمایش از خط فرمان، curl --socks5-hostname 127.0.0.1:1080 https://example.com نام را هم از راه پراکسی حل می‌کند.
net-tunnel-guide-quickstart.salam
// زبان: فارسی
واردسازی شبکه.دی‌اوه‌اچ
واردسازی شبکه.تونل
واردسازی شبکه.وی‌پی‌ان

تابع ریشه:
    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])
پایان
خروجیسرورها: 2 ردشده: 1 مشکل‌های پیکربندی: 0 در حال شنود: true

نمونه سرورهای ساختگی (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

میانجی اتصال در انتظار
اتصالی که پذیرفته شده ولی هنوز گشوده نشده. گشودن ارتقای TLS یا وب‌سوکت را روی نخ کارگر انجام می‌دهد.
net-tunnel-Inbound.salam
// زبان: فارسی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی همگام سازی

ناپایا 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.آمار.شمار ناموفق()
پایان
خروجیtrue OK echo:hello ERR 0 2 1

جدول مبداها SourceTable

ساختار جدول مبداها
دست‌دهی‌های در جریان را برای هر نشانی مبدا می‌شمارد، تا آنچه یک نشانی می‌تواند نگه دارد محدود شود.
نامانگلیسیگونهتوضیح
هستهcoreتهی*وضعیت مشترک.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam

پذیرنده اتصال Acceptor

میانجی پذیرنده اتصال
چیزی که اتصال می‌پذیرد. پذیرنده TCP ساده است؛ net.vpn برای TLS و وب‌سوکت دارد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam

اتصال آماده ReadyConn

ساختار اتصال آماده
اتصال در انتظاری که ارتقا نمی‌خواهد.
نامانگلیسیگونهتوضیح
جریانstreamdyn جریانجریان.
موفق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

ساختار پذیرنده تی سی پی
اتصال‌های TCP ساده می‌پذیرد.
نامانگلیسیگونهتوضیح
کارسازserverتی سی پی.سرورسوکت شنونده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam

پذیرش Accept

تابع پذیرش(): dyn اتصال در انتظار
منتظر اتصال TCP بعدی می‌ماند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam

درگاه Port

تابع درگاه(): صحیح
درگاه در حال استفاده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam

معتبر Ok

تابع معتبر(): منطقی
اگر شنود شکست خورده باشد نادرست است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam

بستن Close

تابع بستن()
شنود را می‌بندد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam

کارساز پذیرش AcceptServer

ساختار کارساز پذیرش
حلقه‌ی پذیرش با استخر کارگر. هر پذیرنده‌ای را اجرا می‌کند و هر اتصال را به پروتکل و سپس دستگیره می‌دهد.
نامانگلیسیگونهتوضیح
پذیرندهacceptordyn پذیرنده اتصالپذیرنده.
میزبان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

ساختار سیاست مقصد
کدام مقصدها را یک کارساز می‌تواند برسد. پیش‌فرض نشانی‌های حلقه محلی، خصوصی، پشت NAT اپراتور، پیوند محلی و فراداده، نشانی‌های محلی یکتای آی‌پی۶، چندپخشی، همه‌پخشی، نامشخص و شکل‌های نگاشت‌شده‌ی آن‌ها را رد می‌کند.
نامانگلیسیگونهتوضیح
اجازه خصوصیallow_privateمنطقی = نادرستهدف‌های خصوصی و حلقه محلی را مجاز می‌کند، ولی فقط وقتی loopback_only درست باشد (با PolicyForBind تعیین می‌شود).
فقط حلقه محلیloopback_onlyمنطقی = نادرستدرست وقتی شنونده فقط روی حلقه محلی بسته شده است.
بازه‌های مجازallow_cidrsوکتور<تطبیق‌دهنده>بازه‌هایی که حتی اگر ویژه باشند در دسترس می‌مانند.
بازه‌های ممنوعdeny_cidrsوکتور<تطبیق‌دهنده>بازه‌هایی که همیشه رد می‌شوند؛ بر همه‌ی ورودی‌های مجاز برتری دارند.
پسوندهای مجازallow_suffixesوکتور<رشته>پسوندهای دامنه که در دسترس می‌مانند.
پسوندهای ممنوعdeny_suffixesوکتور<رشته>پسوندهای دامنه که همیشه رد می‌شوند.
حل‌کنندهresolverdyn حل‌کننده میزبانحل‌کننده‌ای که پیش از بررسی برای نام‌ها به کار می‌رود. بدون تعیین، حل‌کننده‌ی سامانه.
حل‌کننده داردhas_resolverمنطقی = نادرستدرست وقتی resolver تعیین شده است.

طرح اتصال Plan

ساختار طرح اتصال
حکم یک سیاست برای یک مقصد: مجاز یا نه، و نشانی‌های سنجیده‌شده برای اتصال.
نامانگلیسیگونهتوضیح
مجازallowedمنطقی = نادرستدرست وقتی مقصد قابل دسترسی است.
دلیلreasonرشته = ""دلیل ردشدن مقصد.
آی‌پی‌هاipsوکتور<رشته>نشانی‌های سنجیده‌شده؛ به همین‌ها وصل شوید، نه دوباره به نام.
تفکیک‌شدهresolvedمنطقی = نادرستدرست وقتی نام تفکیک شده است.

نتیجه نگهبان GuardResult

ساختار نتیجه نگهبان
نتیجه‌ی یک اتصال نگهبانی‌شده.
نامانگلیسیگونهتوضیح
جریانstreamdyn جریانجریان وصل‌شده یا یک جریان بسته.
ردشدهdeniedمنطقی = نادرستدرست وقتی سیاست مقصد را رد کرده است.
دلیلreasonرشته = ""دلیل رد.

شماره‌گیر نگهبان GuardDialer

ساختار شماره‌گیر نگهبان
شماره‌گیری که سیاست مقصد را اعمال می‌کند: نام‌ها را یک بار تفکیک می‌کند، همه‌ی پاسخ‌ها را می‌سنجد و به نشانی سنجیده‌شده وصل می‌شود، پس نام بین بررسی و اتصال عوض نمی‌شود.
نامانگلیسیگونهتوضیح
درونیinnerdyn شماره‌گیرشماره‌گیری که برای اتصال به کار می‌رود.
سیاستpolicyسیاست مقصدسیاست مقصد.
مسیریابrouterشماره‌گیر مسیریابیک شماره‌گیر مسیریاب که به جای inner به کار می‌رود.
مسیریاب داردhas_routerمنطقی = نادرستدرست وقتی router در کار است.

اتصال بررسی‌شده DialChecked

تابع اتصال بررسی‌شده(target: نشانی): نتیجه نگهبان
وصل می‌شود و می‌گوید سیاست مقصد را رد کرده یا نه.

اتصال Dial

تابع اتصال(target: نشانی): dyn جریان
تحت سیاست وصل می‌شود؛ مقصد ردشده جریان بسته می‌دهد.

نام Name

تابع نام(): رشته
نام شماره‌گیر.

جریان لوله PipeStream

ساختار جریان لوله
یک سر از لوله‌ی درون‌حافظه که لوله جدید می‌سازد. آنچه یک سر می‌نویسد سر دیگر می‌خواند. برای آزمون و وصل کردن دو تکه کد بدون سوکت.
نامانگلیسیگونهتوضیح
دریافتrx_Ringبافری که این سر از آن می‌خواند.
ارسالtx_Ringبافری که این سر در آن می‌نویسد.
مهلتdeadlineصحیح = 0مهلت به میلی‌ثانیه.
زندهliveمنطقی = نادرستپس از بستن جریان نادرست است.
net-tunnel-Stream.salam
// زبان: فارسی
واردسازی شبکه.تونل
واردسازی حافظه

تابع ریشه:
    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).طول()
پایان
خروجیtrue 72 11 second line true 49 56 < abc nothing to read: [] true true true 0 false false 0

خواندن 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

ساختار جریان پیشوندی
یک جریان را می‌پوشاند و پیش از هر چیزی که خود جریان برساند چند بایت را نخست می‌دهد. پروتکل ترکیبی با آن بایتی را که نگاه کرده پس می‌گذارد.
نامانگلیسیگونهتوضیح
درونیinnerdyn جریانجریان پوشانده‌شده.
پیشوند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رشته = ""برچسبی که برای آخرین شماره‌گیری برگزیده شد؛ برای گزارش و آزمون به کار می‌آید.
net-tunnel-RouterDialer.salam
// زبان: فارسی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی همگام سازی

ناپایا 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").نام()
پایان
خروجیrouter 2 2 direct true echo:hi false block direct block

گزینش 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منطقی = نادرستدرست وقتی پروتکل جریان کارخواه را با جریان خودش (مثلا رمزشده) جایگزین کرده باشد. در این حالت دستگیره باید به جای جریانی که گرفته از جریان استفاده کند.
جریانstreamdyn جریانجریان جایگزین، فقط وقتی پوشانده درست است معتبر است.
ممنوعrefusedمنطقی = نادرستدرست وقتی سیاست مقصد را رد کرده است، تا درون‌سو بتواند «مجاز نیست» یا ۴۰۳ بدهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam

پذیرنده InboundProtocol

میانجی پذیرنده
سمت سرور یک پروتکل پراکسی: درخواست کارخواه را از یک جریان می‌خواند و پاسخ می‌دهد. درون‌سوهای SOCKS، HTTP و Trojan آن را پیاده می‌کنند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam

دستگیره Handler

میانجی دستگیره
پس از دست‌دهی موفق یک جریان کارخواه و نشست آن را می‌گیرد و سرویس می‌دهد. دستگیره انتقال همان همیشگی است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam

پروتکل خالی NullProtocol

ساختار پروتکل خالی
پروتکل درون‌سویی که همه را رد می‌کند. مقدار پیش‌فرض یک فیلد است.
نامانگلیسیگونهتوضیح
بی‌کاربردunusedصحیح = 0استفاده نمی‌شود.
net-tunnel-Mixed.salam
// زبان: فارسی
واردسازی شبکه.تونل

تابع ریشه:
    سرچاپ تونل.تشخیص ترکیبی(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.خطا
    سرچاپ تونل.فرمان اتصال، تونل.فرمان یو دی پی
پایان
خروجیtrue true true true A 1 mixed false false true true true false socks5 no protocol 1 3

نام Name

تابع نام(): رشته
null را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam

دست‌دهی Handshake

تابع دست‌دهی(_s: dyn جریان): نشست
همیشه شکست می‌خورد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam

پاسخ Reply

تابع پاسخ(_s: dyn جریان، _sess: نشست، _ok: منطقی)
کاری نمی‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam

پروتکل ترکیبی MixedProtocol

ساختار پروتکل ترکیبی
یک درگاه برای SOCKS4، SOCKS5 و پراکسی HTTP با هم: به بایت اول هر اتصال نگاه می‌کند و آن را به پروتکل درست می‌دهد. با ترکیبی جدید ساخته می‌شود.
نامانگلیسیگونهتوضیح
ساکس۴socks4dyn پذیرندهدرون‌سوی SOCKS4، اگر تعیین شده باشد.
ساکس۵socks5dyn پذیرندهدرون‌سوی SOCKS5، اگر تعیین شده باشد.
اچ تی تی پیhttpdyn پذیرندهدرون‌سوی پراکسی 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

ساختار دستگیره انتقال
دستگیره استاندارد: با شماره‌گیرش به مقصد وصل می‌شود، به کارخواه پاسخ می‌دهد، بایت‌های آغازین را می‌فرستد و سپس هر دو جهت را تا پایان اتصال رله می‌کند.
نامانگلیسیگونهتوضیح
شماره‌گیرdialerdyn شماره‌گیرشماره‌گیری که به مقصد می‌رسد. برای مسیریابی با قاعده یک شماره‌گیر مسیریاب بگذارید.
پروتکلprotodyn پذیرندهپروتکل درون‌سو که برای پاسخ به کارخواه به کار می‌رود.
آمارstatsآمارشمارنده‌های اتصال و بایت.
مهلت بیکاریidle_msصحیح = 300000اتصال رله‌شده را پس از این همه میلی‌ثانیه بی‌ترافیکی ببند. پیش‌فرض ۳۰۰۰۰۰؛ ۰ یعنی هرگز.
نگهبانguardشماره‌گیر نگهبانشماره‌گیر نگهبانی‌شده‌ای که وقتی has_guard درست است به کار می‌رود.
نگهبان داردhas_guardمنطقی = نادرستدرست وقتی انتقال‌دهنده از راه guard وصل می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam

رسیدگی Handle

تابع رسیدگی(s: dyn جریان، sess: نشست)
یک کارخواه را سرویس می‌دهد: شماره‌گیری، پاسخ، رله، به‌روزرسانی شمارنده‌ها.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam

درون‌سو تی سی پی TcpInbound

ساختار درون‌سو تی سی پی
یک شنونده‌ی TCP با استخر کارگر. با سرویس‌دهی پس‌زمینه یا سرویس‌دهی پیوسته شروع می‌شود.
نامانگلیسیگونهتوضیح
درگاه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

میانجی شماره‌گیر
چیزی که یک اتصال خروجی به یک مقصد باز می‌کند و آن را به صورت جریان برمی‌گرداند. شماره‌گیرهای مستقیم، مسدودکننده، پراکسی‌دار و مسیریابی‌شده همه آن را پیاده می‌کنند.
net-tunnel-Dialers.salam
// زبان: فارسی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی همگام سازی

ناپایا 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.معتبر()
پایان
خروجیblock false fallback true echo:hello direct false false

اتصال‌دهنده Connector

میانجی اتصال‌دهنده
یک گام از زنجیره‌ی پراکسی: کارساز مقصد را نام می‌برد و دست‌دهی آن پراکسی را روی جریانِ از پیش باز انجام می‌دهد. اتصال‌دهنده‌های SOCKS، HTTP و Trojan آن را پیاده می‌کنند.
net-tunnel-Chain.salam
// زبان: فارسی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی همگام سازی

ناپایا 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.نام()
پایان
خروجیchain>linehop true end:payload HOP service.internal:8080 linehop

شماره‌گیر مستقیم DirectDialer

ساختار شماره‌گیر مستقیم
مستقیم و با TCP به مقصد وصل می‌شود.
نامانگلیسیگونهتوضیح
مهلت اتصالtimeout_msصحیح = 10000اتصال چند میلی‌ثانیه می‌تواند طول بکشد. پیش‌فرض ۱۰۰۰۰.
حل‌کنندهresolverdyn حل‌کننده میزبانحل‌کننده‌ی اختیاری برای مقصدهای دامنه‌ای، مثلا مبتنی بر دی‌ان‌اس روی HTTPS.
حل‌کننده داردhas_resolverمنطقی = نادرستدرست یعنی از حل‌کننده استفاده شود. هر نشانی به نوبت در همان مهلت امتحان می‌شود.
ترجیح نسخه ششprefer_v6منطقی = نادرستنشانی‌های نسخه شش پیش از نسخه چهار امتحان شوند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Dialers.salam

اتصال Dial

تابع اتصال(target: نشانی): dyn جریان
یک اتصال TCP به مقصد باز می‌کند و آن را به شکل جریان درمی‌آورد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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

ساختار شماره‌گیر پراکسی
از راه یک گام پراکسی شماره‌گیری می‌کند: با شماره‌گیر بالادست به کارساز آن گام وصل می‌شود و سپس دست‌دهی همان گام را اجرا می‌کند.
نامانگلیسیگونهتوضیح
بالادستupstreamdyn شماره‌گیرشماره‌گیری که برای رسیدن به کارساز گام به کار می‌رود.
گامhopdyn اتصال‌دهندهگام پراکسی‌ای که باید از آن گذشت.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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

ساختار زنجیره
شماره‌گیری که از چند گام پراکسی به ترتیب می‌گذرد، با شروع از یک شماره‌گیر پایه. با زنجیره جدید و افزودن گام ساخته می‌شود.
نامانگلیسیگونهتوضیح
پایهbasedyn شماره‌گیرشماره‌گیری که به نخستین گام می‌رسد.
گام‌ها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

ساختار نشانی
مقصدی که باید به آن وصل شد: یک میزبان (نام یا IP) و یک درگاه، همراه با نوع میزبان و یک پرچم اعتبار. تجزیه نشانی و نشانی جدید آن را پر می‌کنند.
نامانگلیسیگونهتوضیح
میزبانhostرشته = ""نام میزبان یا متن IP، برای IPv6 بدون کروشه.
درگاهportصحیح = 0درگاه، از ۰ تا ۶۵۵۳۵.
نوعkindصحیح = 3نشانی آی‌پی۴، نشانی دامنه یا نشانی آی‌پی۶. عددها همان‌هایی هستند که نوع نشانی SOCKS5 به کار می‌برد.
معتبرvalidمنطقی = نادرستوقتی تجزیه شکست بخورد نادرست است. پیش از استفاده از نشانی همیشه آن را بررسی کنید.
حجمsizeصحیح = 0رمزگشاها آن را پر می‌کنند: نشانی کدشده چند بایت از سیم را گرفته است.
net-tunnel-Addr.salam
// زبان: فارسی
واردسازی شبکه.تونل

تابع ریشه:
    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.متن()
پایان
خروجیtrue true example.com 443 example.com:443 true true [2001:db8::5]:8080 false false true false 4 192.168.1.20 2001:db8::1 ::ffff:102:304 true 1.2.3.4:80

متن String

تابع متن(): رشته
نشانی را به شکل host:port برمی‌گرداند، با کروشه دور میزبان IPv6.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Addr.salam

مجموعه دامنه DomainSet

ساختار مجموعه دامنه
مجموعه‌ای از دامنه‌ها: نام دقیق، پسوند، کلیدواژه و عبارت باقاعده. جستجوی نام و پسوند هش‌شده است.
نامانگلیسیگونهتوضیح
کاملfullنگاشت<رشته، منطقی>نام‌های دقیق.
پسوندهاsuffixنگاشت<رشته، منطقی>پسوندها؛ نام با خودش و همه‌ی زیردامنه‌هایش می‌خورد.
کلیدواژه‌هاkeywordsوکتور<رشته>واژه‌هایی که می‌توانند هرجای نام باشند.
عبارت‌های باقاعدهregexesوکتور<رشته>عبارت‌های باقاعده.
شمارcountصحیح = 0شمار مدخل‌های افزوده‌شده.
net-tunnel-Router.salam
// زبان: فارسی
واردسازی شبکه.تونل

تابع ریشه:
    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"))
پایان
خروجیdivar.ir direct WWW.Digikala.com direct ایران.ir direct notaparat.com proxy evilir proxy google.com proxy 192.168.1.9 direct localhost direct block block block direct direct direct direct proxy direct 8 0 true true false true false

مجموعه آی‌پی IpSet

ساختار مجموعه آی‌پی
مجموعه‌ای از شبکه‌های IP نسخه چهار و شش. هر آزمون حداکثر یک جستجو برای هر طول پیشوند دارد.
نامانگلیسیگونهتوضیح
نسخه چهارv4نگاشت<صحیح۶۴، منطقی>شبکه‌های نسخه چهار به تفکیک پیشوند و نشانی.
طول‌های نسخه چهارv4_lensصحیح۶۴ = 0ماسک بیتی طول‌های پیشوند نسخه چهار.
نسخه ششv6نگاشت<رشته، منطقی>شبکه‌های نسخه شش.
طول‌های نسخه ششv6_lensوکتور<صحیح>طول‌های پیشوند نسخه شش.
شمارcountصحیح = 0شمار شبکه‌های افزوده‌شده.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam

آمار Stats

ساختار آمار
شمارنده‌های امن برای نخ‌ها در یک پراکسی: بایت‌های رفت و برگشت و شمار اتصال‌ها. با آمار جدید ساخته می‌شود.
نامانگلیسیگونهتوضیح
بارگذاریupاتمی.صحیح۶۴بایت‌هایی که از سمت کارخواه به سوی مقصد فرستاده شد.
دریافتdownاتمی.صحیح۶۴بایت‌هایی که از مقصد به کارخواه برگشت.
کل اتصال‌هاtotalاتمی.صحیح۶۴کل اتصال‌های اداره‌شده.
اتصال‌های فعالactiveاتمی.صحیح۶۴اتصال‌هایی که همین حالا رله می‌شوند.
اتصال‌های ناموفقfailedاتمی.صحیح۶۴اتصال‌هایی که به مقصدشان نرسید.
net-tunnel-Relay.salam
// زبان: فارسی
واردسازی شبکه.تونل
واردسازی استخر

تابع 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)
پایان
خروجیping from the client pong from the server relayed 20 20 up=20 down=20 total=0 active=0 failed=0 20 20

بایت بارگذاری 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چقدر می‌تواند ساکت باشد، به میلی‌ثانیه. ۰ یعنی بی‌حد.
net-tunnel-Idle.salam
// زبان: فارسی
واردسازی شبکه.تونل
واردسازی همگام سازی

تابع ریشه:
    timer := تونل.زمان‌سنج بیکاری جدید(100 برگردان صحیح۶۴)
    سرچاپ timer.منقضی شده()
    همگام سازی.خواب میلی ثانیه(160)
    سرچاپ timer.منقضی شده()، timer.میلی‌ثانیه بیکاری() بزرگتربرابر 150
    timer.ثبت فعالیت()
    سرچاپ timer.منقضی شده()
    timer.آزادسازی()

    plain := تونل.زمان‌سنج بیکاری جدید(0 برگردان صحیح۶۴)
    همگام سازی.خواب میلی ثانیه(30)
    سرچاپ "no limit:"، plain.منقضی شده()
    plain.آزادسازی()
پایان
خروجیfalse true true false no limit: false

ثبت فعالیت 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منطقی = نادرستدرست وقتی پیوند بگوید بررسی گواهی را نادیده بگیر. آن را نشانه‌ی هشدار بدانید.
net-tunnel-Link.salam
// زبان: فارسی
واردسازی شبکه.تونل

تابع ریشه:
    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")
پایان
خروجیtrue vless 203.0.113.9:443 ws tls cdn.example.com /ws Berlin 1 true false false aes-128-gcm 2 1 T a%20b%2Fc سلام c3ViamVjdHM_X2Q-Pg salam

اشتراک Subscription

ساختار اشتراک
گره‌هایی که در متن یک اشتراک پیدا شد، به‌علاوه‌ی تعداد سطرهایی که فهمیده نشد.
نامانگلیسیگونهتوضیح
گره‌هاnodesوکتور<گره>گره‌های معتبر به ترتیب.
ردشدهskippedصحیح = 0چند سطر ناتهی و غیرتوضیح پیوند معتبر نبودند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam

جریان Stream

میانجی جریان
یک اتصال دوطرفه‌ی بایت. TCP ساده، TLS، وب‌سوکت و لوله‌های درون‌حافظه همه آن را پیاده می‌کنند، پس پروتکل‌ها و رله‌ها روی هر کدام کار می‌کنند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Stream.salam

جریان تی سی پی TcpStream

ساختار جریان تی سی پی
یک جریان روی اتصال TCP ساده. پوشاندن تی سی پی یکی می‌سازد.
نامانگلیسیگونهتوضیح
اتصالconnتی سی پی.اتصال شبکهاتصال TCP.
net-tunnel-Wrap.salam
// زبان: فارسی
واردسازی شبکه.تی سی پی
واردسازی شبکه.تونل
واردسازی شبکه.وب‌سوکت
واردسازی همگام سازی

ناپایا 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)
پایان
خروجیtcp:hello 119 s:hello world

خواندن 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

ساختار پیکربندی درون‌سو
یک درون‌سوی پیکربندی به سبک v2ray: کجا گوش بدهد و با کدام پروتکل حرف بزند.
نامانگلیسیگونهتوضیح
برچسبtagرشته = ""نامی که بقیه‌ی پیکربندی برای این درون‌سو به کار می‌برند.
پروتکلprotocolرشته = ""نام پروتکل، مثل mixed، socks یا http. درون‌سوساز ثبت‌شده را برمی‌گزیند.
نشانی شنودlistenرشته = "127.0.0.1"نشانی‌ای که روی آن گوش داده می‌شود. پیش‌فرض 127.0.0.1 است.
درگاهportصحیح = 0درگاهی که روی آن گوش داده می‌شود. درگاهِ متنی در JSON هم پذیرفته می‌شود.
تنظیماتsettingsرشته = ""JSON خام شیء settings، به صورت متن نگه داشته می‌شود تا پروتکل بخواند.
تنظیمات جریانstream_settingsرشته = ""JSON خام streamSettings یک درون‌سو، به صورت متن نگه داشته می‌شود تا پروتکل بخواند.
net-tunnel-Config.salam
// زبان: فارسی
واردسازی شبکه.تونل

تابع ریشه:
    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.قاعده‌ها.طول()
پایان
خروجی0 1 3 3 proxy 10808 trojan 25 problems: 0 direct direct block proxy 3 duplicate outbound tag a rule 0 points to unknown outbound 'zzz' 1 proxy trojan false 7890 3 proxy-1 1

پیکربندی خروجی 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

ساختار پیکربندی
یک پیکربندی کامل به سبک v2ray: درون‌سوها، خروجی‌ها و قاعده‌های مسیریابی. تجزیه پیکربندی و بارگذاری پیکربندی آن را می‌سازند.
نامانگلیسیگونهتوضیح
سطح گزارشlog_levelرشته = "warning"سطح گزارش از پیکربندی. پیش‌فرض warning است.
درون‌سوهاinboundsوکتور<پیکربندی درون‌سو>درون‌سوها به ترتیب پرونده.
خروجی‌هاoutboundsوکتور<پیکربندی خروجی>خروجی‌ها به ترتیب پرونده.
قاعده‌هاrulesوکتور<پیکربندی قاعده>قاعده‌های مسیریابی به ترتیب پرونده. نخستین تطبیق برنده است.
خروجی پیش‌فرضdefault_outboundرشته = ""برچسبی که وقتی هیچ قاعده‌ای نخورد به کار می‌رود. اگر نباشد، نخستین خروجی.
خطاهاerrorsوکتور<رشته>مشکل‌های پیداشده هنگام تجزیه، به صورت سطرهای خوانا. برای پیکربندی درست خالی است.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam

خروجی‌ساز OutboundMaker

میانجی خروجی‌ساز
چیزی که می‌تواند برای یک پروتکل خروجی یک شماره‌گیر بسازد. با ثبت خروجی ثبتش کنید تا پیکربندی‌ها نام پروتکل را به کار ببرند.
net-tunnel-Registry.salam
// زبان: فارسی
واردسازی شبکه.تونل

ساختار 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.آخرین برچسب
پایان
خروجیtrue false true true direct direct block null direct block block false deny

درون‌سوساز 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.vpn یکی برای net.doh دارد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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"برچسبی که وقتی هیچ قاعده‌ای نخورد برگردانده می‌شود.
حل‌کنندهresolverdyn حل‌کننده میزبانبرای تبدیل مقصد دامنه‌ای به نشانی تا قاعده‌های 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وکتور<رشته>برای هر سطر بد یک پیام، با شماره‌ی سطر.
net-tunnel-Rules.salam
// زبان: فارسی
واردسازی شبکه.تونل

تابع ریشه:
    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)
پایان
خروجیerrors: 1 line 7: expected KIND,VALUE,TAG shop.ir direct my-tracker.net block 203.0.113.5 direct 127.0.0.1 direct example.com proxy block cannot read /nonexistent/rules.txt

پایاها و متغیرها

فرمان‌ها CMD_…

مقدارهای فرمان.
نامانگلیسیمقدار
فرمان اتصالCMD_CONNECT1
فرمان یو دی پیCMD_UDP3

نوع پروتکل ترکیبی MIXED_…

آنچه تشخیص ترکیبی برمی‌گرداند.
نامانگلیسیمقدار
ناشناختهMIXED_UNKNOWN0
اچ تی تی پیMIXED_HTTP1
ساکس۴MIXED_SOCKS44
ساکس۵MIXED_SOCKS55

نوع‌های نشانی ADDR_…

مقدارهای نوع.
نامانگلیسیمقدار
نشانی آی‌پی۴ADDR_IPV41
نشانی دامنهADDR_DOMAIN3
نشانی آی‌پی۶ADDR_IPV64

دامنه‌های ایران 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
"
فهرست داخلی مستقیم ایران به صورت متن: دامنه‌های ir. و چند سرویس بزرگ.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam

مهلت مستقیم DeadlineDirect

پایا مهلت مستقیم: صحیح۳۲ = -2
اگر به SetDeadline جریانی که یک اتصال TLS را می‌پوشاند داده شود یعنی: از این پس مستقیم از سوکت بخوان (کپی مستقیم XTLS Vision). جریان‌های دیگر آن را نمی‌گیرند.

نوع تطبیق‌دهنده‌ها M_…

مقدارهای نوع.
نامانگلیسیمقدار
تطبیق دامنهM_DOMAIN1
تطبیق پسوندM_SUFFIX2
تطبیق کلیدواژهM_KEYWORD3
تطبیق عبارت باقاعدهM_REGEX4
تطبیق سی‌آی‌دی‌آرM_CIDR5
تطبیق درگاهM_PORT6
تطبیق جی‌او‌سایتM_GEOSITE7
تطبیق جی‌او‌آی‌پیM_GEOIP8

تابع‌ها

جدول مبداها جدید NewSourceTable

تابع جدول مبداها جدید(): جدول مبداها
جدول تهی می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam

کلید مبدا SourceKey

تابع کلید مبدا(remote: رشته): رشته
کلیدی که نشانی کارخواه زیر آن شمرده می‌شود: IPv4 همان‌طور که هست، نشانی IPv6 نگاشت‌شده از IPv4 به شکل IPv4 اش، و هر IPv6 دیگر با پیشوند /64 اش.
net-tunnel-IPv6.salam
// زبان: فارسی
واردسازی شبکه.تونل

تابع ریشه:
    سرچاپ تونل.کلید مبدا("::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: صحیح): کارساز پذیرش
روی یک نشانی شنود می‌کند. برای پراکسی محلی 127.0.0.1. نشانی 0.0.0.0 همه‌ی واسط‌ها است و باید صریح خواسته شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Inbound.salam

شنود تی سی پی دوگانه ListenTcpDual

تابع شنود تی سی پی دوگانه(port: صحیح): کارساز پذیرش
روی :: گوش می‌دهد، پس کارخواه‌های IPv4 و IPv6 هر دو پذیرفته می‌شوند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-IPv6.salam

شنود محلی آی‌پی۶ ListenLocal6

تابع شنود محلی آی‌پی۶(port: صحیح): کارساز پذیرش
فقط روی ::1 گوش می‌دهد. درگاه ۰ یک درگاه آزاد برمی‌گزیند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-IPv6.salam

شنود محلی ListenLocal

تابع شنود محلی(port: صحیح): کارساز پذیرش
فقط روی 127.0.0.1 شنود می‌کند. درگاه ۰ درگاه آزاد برمی‌گزیند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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: رشته): منطقی
برای localhost، 127.0.0.0/8 و ::1 درست است.

سیاست برای نشانی شنود PolicyForBind

تابع سیاست برای نشانی شنود(p: سیاست مقصد، bind_host: رشته): سیاست مقصد
سیاستی را که برای شنونده‌ای روی یک میزبان باید به کار رود برمی‌گرداند: allow_private فقط وقتی میزبان حلقه محلی است اثر دارد.

آی‌پی ویژه است IsSpecialIP

تابع آی‌پی ویژه است(b: وکتور<صحیح>): منطقی
برای بایت‌های نشانی‌ای که به‌طور پیش‌فرض نباید برسد درست است.

نشانی خصوصی است IsPrivateAddress

تابع نشانی خصوصی است(ip: رشته): منطقی
برای نشانی متنی‌ای که به‌طور پیش‌فرض نباید برسد درست است.

بررسی بایت‌های آی‌پی PolicyCheckBytes

تابع بررسی بایت‌های آی‌پی(p: سیاست مقصد، ip: وکتور<صحیح>): منطقی
بایت‌های یک نشانی را با یک سیاست می‌سنجد.

بررسی آی‌پی در سیاست PolicyCheckIP

تابع بررسی آی‌پی در سیاست(p: سیاست مقصد، ip: رشته): منطقی
یک نشانی متنی را با یک سیاست می‌سنجد.

بررسی نام در سیاست PolicyCheckName

تابع بررسی نام در سیاست(p: سیاست مقصد، host: رشته): منطقی
یک نام دامنه را با فهرست پسوندها و قاعده‌ی localhost می‌سنجد.

طرح سیاست 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 جریان
یک اتصال TCP را به شکل جریان می‌پوشاند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam

پوشاندن تی ال اس WrapTls

تابع پوشاندن تی ال اس(c: تی ال اس.اتصال): dyn جریان
یک اتصال TLS را به شکل جریان می‌پوشاند.

پوشاندن وب‌سوکت WrapWebSocket

تابع پوشاندن وب‌سوکت(c: وب‌سوکت.اتصال وب): dyn جریان
یک اتصال وب‌سوکت را به شکل جریان می‌پوشاند: بایت‌های نوشته‌شده به پیام دودویی تبدیل می‌شوند و پیام‌های ورودی به شکل جریان پیوسته‌ی بایت خوانده می‌شوند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wrap.salam

اتصال تی سی پی DialTcp

تابع اتصال تی سی پی(host: رشته، port: صحیح، timeout_ms: صحیح): dyn جریان
با TCP و یک مهلت به میلی‌ثانیه وصل می‌شود و جریان را برمی‌گرداند. معتبر را بررسی کنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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: صحیح): صحیح
از روی بایت اول پروتکل را حدس می‌زند: ۵ یعنی SOCKS5، ۴ یعنی SOCKS4، یک حرف یعنی HTTP، هر چیز دیگر ناشناخته.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam

متن بایت ByteString

تابع متن بایت(b: صحیح): رشته
از یک عدد ۰ تا ۲۵۵ متنی یک‌بایتی می‌سازد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam

ترکیبی جدید NewMixed

تابع ترکیبی جدید(): پروتکل ترکیبی
یک پروتکل ترکیبی خالی برمی‌گرداند. پروتکل‌ها را با تابع‌های MixedSet اضافه کنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam

تنظیم ساکس۵ ترکیبی MixedSetSocks5

تابع تنظیم ساکس۵ ترکیبی(m &: پروتکل ترکیبی، p: dyn پذیرنده)
درون‌سوی SOCKS5 یک پروتکل ترکیبی را تعیین می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam

تنظیم ساکس۴ ترکیبی MixedSetSocks4

تابع تنظیم ساکس۴ ترکیبی(m &: پروتکل ترکیبی، p: dyn پذیرنده)
درون‌سوی SOCKS4 یک پروتکل ترکیبی را تعیین می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam

تنظیم اچ تی تی پی ترکیبی MixedSetHttp

تابع تنظیم اچ تی تی پی ترکیبی(m &: پروتکل ترکیبی، p: dyn پذیرنده)
درون‌سوی پراکسی HTTP یک پروتکل ترکیبی را تعیین می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Mixed.salam

شنود تی سی پی ListenTcp

تابع شنود تی سی پی(port: صحیح): درون‌سو تی سی پی
یک درگاه TCP می‌بندد (۰ یک درگاه آزاد برمی‌گزیند) و شنونده را با استخر کارگرش برمی‌گرداند. معتبر را بررسی کنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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: رشته): وکتور<صحیح>
متن IPv4 نقطه‌دار را به چهار عدد تجزیه می‌کند. برای هر چیزی که IPv4 دقیق نباشد بردار خالی برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Addr.salam

تجزیه آی‌پی۶ ParseIPv6

تابع تجزیه آی‌پی۶(text: رشته): وکتور<صحیح>
متن IPv6، از جمله :: و دنباله‌ی IPv4، را به شانزده عدد تجزیه می‌کند. در خطا بردار خالی برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Addr.salam

تجزیه آی‌پی ParseIP

تابع تجزیه آی‌پی(s: رشته): وکتور<صحیح>
متن IPv4 یا IPv6 را تجزیه می‌کند. نتیجه ۴ یا ۱۶ عدد دارد، یا هیچ.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Addr.salam

قالب‌بندی آی‌پی FormatIP

تابع قالب‌بندی آی‌پی(b: وکتور<صحیح>): رشته
۴ یا ۱۶ عدد را دوباره به متن برمی‌گرداند. IPv6 به کوتاه‌ترین شکل با :: درمی‌آید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Addr.salam

آی‌پی است IsIP

تابع آی‌پی است(s: رشته): منطقی
درست وقتی متن یک نشانی IPv4 یا IPv6 معتبر باشد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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: نشانی): وکتور<طبیعی۸>
نشانی را به شکل سیمی SOCKS5 می‌نویسد: یک بایت نوع، میزبان و درگاه دوبایتی.
net-tunnel-Wire.salam
// زبان: فارسی
واردسازی شبکه.تونل
واردسازی حافظه

تابع 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).متن()
پایان
خروجیsocks5 030b6578616d706c652e636f6d01bb vless 01bb020b6578616d706c652e636f6d true example.com:443 true true example.com:443 short false example.com:443 example.com:443

کدگذاری ویلس EncodeVless

تابع کدگذاری ویلس(a: نشانی): وکتور<طبیعی۸>
نشانی را به شکل سیمی VLESS می‌نویسد: نخست درگاه، سپس بایت نوع و میزبان.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wire.salam

کدگشایی ساکس DecodeSocks

تابع کدگشایی ساکس(ptr: تهی*، n: صحیح): نشانی
یک نشانی SOCKS5 را از حافظه می‌خواند. وقتی بایت‌ها کم یا نادرست باشند معتبر نادرست است؛ حجم می‌گوید چند بایت مصرف شد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wire.salam

کدگشایی ویلس DecodeVless

تابع کدگشایی ویلس(ptr: تهی*، n: صحیح): نشانی
یک نشانی VLESS را از حافظه می‌خواند، همان‌طور که کدگشایی ساکس برای SOCKS5 می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wire.salam

بایت‌های بردار VectorBytes

تابع بایت‌های بردار(v: وکتور<طبیعی۸>): تهی*
یک بردار بایت را در حافظه‌ی تازه کپی می‌کند و اشاره‌گر را برمی‌گرداند. با mem.Free آزادش کنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wire.salam

خواندن نشانی ساکس ReadSocksAddr

تابع خواندن نشانی ساکس(s: dyn جریان): نشانی
یک نشانی SOCKS5 را بایت به بایت از یک جریان می‌خواند و برمی‌گرداند. اگر جریان تمام شود زودتر می‌ایستد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Wire.salam

خواندن نشانی ویلس ReadVlessAddr

تابع خواندن نشانی ویلس(s: dyn جریان): نشانی
یک نشانی VLESS را از یک جریان می‌خواند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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: رشته): مجموعه دامنه
فهرست دامنه به قالب V2Ray را می‌خواند: هر خط یک مدخل با domain:، full:، keyword:، regexp:، include: و ویژگی‌هایی مثل @ads. آرگومان دوم فقط مدخل‌های دارای آن ویژگی را نگه می‌دارد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam

تجزیه فهرست آی‌پی ParseIpList

تابع تجزیه فهرست آی‌پی(text: رشته): مجموعه آی‌پی
فهرست شبکه‌های CIDR را می‌خواند، هر خط یکی، با توضیح #.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam

تنظیم پوشه داده جغرافیایی SetGeoDir

تابع تنظیم پوشه داده جغرافیایی(dir: رشته)
پوشه‌ای که فهرست‌های قاعده‌های geosite: و geoip: در آن جستجو می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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: وکتور<رشته>): صحیح
فایل geosite.dat را از حافظه می‌خواند و فهرست‌ها را ثبت می‌کند. بردار نام‌ها محدود می‌کند؛ خالی یعنی همه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam

بارگذاری جی‌او‌آی‌پی دی‌ای‌تی LoadGeoIpDat

تابع بارگذاری جی‌او‌آی‌پی دی‌ای‌تی(ptr: تهی*، n: صحیح، names: وکتور<رشته>): صحیح
فایل geoip.dat را از حافظه می‌خواند و فهرست‌ها را ثبت می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam

بارگذاری پرونده جی‌او‌سایت LoadGeoSiteFile

تابع بارگذاری پرونده جی‌او‌سایت(path: رشته، names: وکتور<رشته>): صحیح
پرونده geosite.dat را می‌خواند. شمار فهرست‌ها یا ۱- را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam

بارگذاری پرونده جی‌او‌آی‌پی LoadGeoIpFile

تابع بارگذاری پرونده جی‌او‌آی‌پی(path: رشته، names: وکتور<رشته>): صحیح
پرونده geoip.dat را می‌خواند. شمار فهرست‌ها یا ۱- را برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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: رشته): رشته
Base64 را، استاندارد یا امن برای نشانی، با یا بدون پر‌کننده رمزگشایی می‌کند. شکست سطر نادیده گرفته می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam

رمزگذاری پایه۶۴ نشانی B64EncodeUrl

تابع رمزگذاری پایه۶۴ نشانی(s: رشته): رشته
متن را به Base64 امن برای نشانی و بدون پر‌کننده کدگذاری می‌کند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam

تابع تجزیه لینک(link: رشته): گره
یک پیوند اشتراک vmess://، vless://، trojan:// یا ss:// را به یک گره تجزیه می‌کند. معتبر را بررسی کنید.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam

تابع گره به لینک(n: گره): رشته
یک گره را به شکل پیوند اشتراک می‌نویسد. تجزیه‌ی دوباره همان گره را می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Link.salam

تجزیه اشتراک ParseSubscription

تابع تجزیه اشتراک(text: رشته): اشتراک
یک اشتراک را تجزیه می‌کند: Base64 یا متن ساده با یک پیوند در هر سطر. سطرهای خالی و توضیح‌های # رد می‌شوند و سطرهای بد شمرده می‌شوند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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: رشته): پیکربندی
JSON به سبک v2ray را به یک پیکربندی تجزیه می‌کند. مشکل‌ها به جای توقف در خطاها جمع می‌شوند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam

بارگذاری پیکربندی LoadConfig

تابع بارگذاری پیکربندی(path: رشته): پیکربندی
یک پرونده‌ی پیکربندی را می‌خواند و تجزیه می‌کند. پرونده‌ی ناخواندنی پیکربندی‌ای با یک خطا می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam

اعتبارسنجی پیکربندی ValidateConfig

تابع اعتبارسنجی پیکربندی(c: پیکربندی): وکتور<رشته>
پیکربندی را از نظر برچسب تکراری، درگاه بد، قاعده‌ای که به جایی نمی‌رود و مانند آن بررسی می‌کند. برای هر مشکل یک سطر خوانا برمی‌گرداند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Config.salam

پیکربندی به جیسون ConfigToJson

تابع پیکربندی به جیسون(c: پیکربندی): رشته
یک پیکربندی را دوباره به JSON می‌نویسد. تجزیه‌ی نتیجه همان پیکربندی را می‌دهد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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: تهی*): منطقی
تابعی را روی نخی تازه اجرا می‌کند که پس از پایان خودش را پاک می‌کند. تابع یک اشاره‌گر می‌گیرد و چیزی برنمی‌گرداند. نخ‌های دست‌دهی و اتصال باید از این استفاده کنند و نه از spawn، چون نخی که هرگز join نشود پشته‌اش (۸ مگابایت فضای نشانی) را برای همیشه نگه می‌دارد.

قاعده جدید 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: رشته): منطقی
یک شرط CIDR اضافه می‌کند. اگر متن بازه‌ی معتبر نباشد نادرست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam

قاعده آدرس‌های خصوصی RulePrivate

تابع قاعده آدرس‌های خصوصی(r &: قاعده)
بازه‌های خصوصی و محلی را اضافه می‌کند: 10/8، 172.16/12، 192.168/16، loopback، پیوند محلی، 100.64/10، همتاهای IPv6 و localhost.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam

قاعده درگاه RulePort

تابع قاعده درگاه(r &: قاعده، spec: رشته): منطقی
شرط‌های درگاه را از متنی مثل 80,443,8000-8100 اضافه می‌کند. اگر بخشی بد باشد نادرست.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam

قاعده دامنه با پیشوند RuleDomainSpec

تابع قاعده دامنه با پیشوند(r &: قاعده، spec: رشته): منطقی
یک شرط دامنه از متنی به سبک v2ray اضافه می‌کند: domain:، suffix:، full:، keyword:، regexp: یا یک واژه‌ی تنها به عنوان کلیدواژه.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam

قاعده آی‌پی با پیشوند RuleIpSpec

تابع قاعده آی‌پی با پیشوند(r &: قاعده، spec: رشته): منطقی
یک شرط IP از متن اضافه می‌کند: یک CIDR، یک نشانی یا geoip:private.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam

قاعده مطابقت دارد RuleMatches

تابع قاعده مطابقت دارد(r: قاعده، target: نشانی): منطقی
درست وقتی مقصد قاعده را برآورده کند. مقصد دامنه با تطبیق‌دهنده‌های دامنه و مقصد IP با تطبیق‌دهنده‌های CIDR آزموده می‌شود.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam

قاعده با آی‌پی‌های حل‌شده مطابقت دارد RuleMatchesResolved

تابع قاعده با آی‌پی‌های حل‌شده مطابقت دارد(r: قاعده، target: نشانی، ips: وکتور<وکتور<صحیح>>): منطقی
مانند قاعده مطابقت دارد، ولی شرط‌های CIDR و GeoIP نشانی‌های حل‌شده‌ی مقصد دامنه‌ای را هم می‌سنجند.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: net-tunnel-Router.salam

تنظیم حل‌کننده SetResolver

تابع تنظیم حل‌کننده(rt &: مسیریاب، r: dyn حل‌کننده میزبان، ttl_ms: صحیح۶۴)
به مسیریاب یک حل‌کننده و مدت ماندگاری پاسخ را می‌دهد. پس از آن مقصد دامنه‌ای با قاعده‌های CIDR هم می‌خورد.

نمونه‌ی این مورد همراه با موارد بالاتر آمده است: 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