پرش به محتویات

تونل تماس

همهٔ قابلیت‌های هیدیفای

تونل تماس، ترافیک پراکسی را درون یک تماس تصویری روی یک سرویس عمومی ویدیوکنفرانس جابه‌جا می‌کند: VK Calls، Yandex Telemost، Dion، WB Stream یا Bitrix24. یک طرف inbound با "type": "call" را اجرا می‌کند و طرف دیگر outbound با "type": "call" را. هر دو به یک تماس می‌پیوندند و داده به شکل فریم‌های ویدیوی تماس یا data channelهای WebRTC منتقل می‌شود. این قابلیت از sing-box-extended به این‌جا منتقل شده است.

در هیدیفای از ابتدا تا انتها آزمایش نشده است. آزمایش آن به حساب کاربری روی این سرویس‌ها نیاز دارد، برای همین فقط کد data channel به‌تنهایی بررسی شده است. انتظار داشته باشید که خودتان اشکال‌یابی کنید.

چرا از آن استفاده کنیم

  • شبکه فقط فهرست کوتاهی از سرویس‌های داخلی را باز گذاشته و تماس تصویری روی یکی از آن‌ها هنوز کار می‌کند.
  • همهٔ پراکسی‌های دیگر مسدودند و برای عبور، سرعت پایین و اتصال ناپایدار را می‌پذیرید.

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

چطور از فیلترینگ عبور می‌کند

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

محدودیت‌ها:

  • مسدودشدن حساب. طرف سرور از حساب خود شما استفاده می‌کند. سرویس می‌تواند تماسی را ببیند که تمام روز با جریان ویدیویی غیرانسانی برقرار است و حساب را مسدود کند.
  • محدودیت سرعت. سرویس نرخ بیت ویدیو و data channel را محدود می‌کند، پس تونل از یک پراکسی مستقیم خیلی کندتر است. سرعت آن در هیدیفای اندازه‌گیری نشده است.
  • تغییرات سرویس. کد از کلاینت وب هر سرویس تقلید می‌کند: نسخه‌های API ثابت در کد، user agent کروم، و برای Telemost مقدارهایی که از صفحهٔ وب خوانده می‌شوند. وقتی سرویس کلاینت یا API خود را تغییر دهد، تونل تا به‌روزشدن کد کار نمی‌کند.
  • کپچا در VK. طرف کلاینت در VK به‌عنوان مهمان ناشناس وارد می‌شود. ممکن است VK کپچا بخواهد. در این حالت لاگ پیام «vk-auth: solve the captcha to continue: http://127.0.0.1:PORT/» را نشان می‌دهد. آن نشانی را ظرف ۵ دقیقه در مرورگری روی همان دستگاه باز کنید، وگرنه اتصال شکست می‌خورد.
  • لینک همان کلید است. کلید رمزنگاری از لینک تماس ساخته می‌شود. هر کسی که لینک را داشته باشد، از جمله خود سرویس، می‌تواند تونل را بخواند و از سرور شما به‌عنوان پراکسی استفاده کند. لینک را محرمانه نگه دارید.
  • وقتی خود سرویس مسدود است یا فیلتر تماس‌های تصویری را محدود می‌کند، کمکی نمی‌کند.

چطور کار می‌کند

  • طرف سرور (inbound). با حساب شما وارد سرویس می‌شود و یک تماس می‌سازد، یا به تماسی که در join_link آمده می‌پیوندد. اگر تماس را خودش بسازد، لینک آن را در لاگ می‌نویسد، مثلاً «call[vk]: join_link=…». اتصال‌هایی که از راه تماس می‌رسند مثل اتصال‌های هر inbound دیگری به router می‌روند. این inbound روی هیچ پورتی گوش نمی‌دهد.
  • طرف کلاینت (outbound). به‌عنوان مهمان و بدون حساب به تماسِ join_link می‌پیوندد. TCP و UDP را حمل می‌کند.
  • مسیر داده. هر اتصال یک جریان شماره‌دار درون یک تونل است. تونل یکی از دو حامل را به کار می‌برد:
  • ویدیو: داده با XChaCha20-Poly1305 رمز می‌شود و به شکل فریم‌های یک ترک ویدیوی VP8 فرستاده می‌شود، و در برخی سرویس‌ها یک ترک اشتراک صفحه هم به آن اضافه می‌شود.
  • data channel: داده روی data channel مربوط به WebRTC تماس فرستاده می‌شود.
  • راه‌اندازی. هر دو طرف هنگام شروع sing-box وصل می‌شوند. هر تلاش بعد از ۶۰ ثانیه رها می‌شود. وقتی تلاشی شکست بخورد، همان طرف خطا را در لاگ می‌نویسد و بعد از ۵ ثانیه، سپس ۱۰ ثانیه، سپس ۳۰ ثانیه و از آن پس هر یک دقیقه دوباره تلاش می‌کند، تا وقتی sing-box متوقف شود. اتصال‌ها به outbound منتظر اولین تلاش آن می‌مانند. تا وقتی وصل نیست، با خطای «call: not connected to the call yet» شکست می‌خورند.
  • اتصال دوباره. وقتی تماس دوباره وصل می‌شود، اتصال‌هایی که از آن می‌رسند همچنان به router سپرده می‌شوند، پس قوانین route کار می‌کنند.

پیکربندی

به برچسب ساخت with_call نیاز دارد. بدون آن، کانفیگ دارای "type": "call" با خطای «Call is not included in this build, rebuild with -tags with_call» متوقف می‌شود.

سرور (inbound):

{
  "type": "call",
  "tag": "call-in",
  "platform": "vk",
  "join_link": "https://vk.ru/call/join/AbCdEf123",
  "cookies": [
    { "name": "<cookie name>", "value": "<cookie value>" },
    { "name": "<cookie name>", "value": "<cookie value>" }
  ]
}

کلاینت (outbound):

{
  "type": "call",
  "tag": "call-out",
  "platform": "vk",
  "join_link": "https://vk.ru/call/join/AbCdEf123"
}

لینک و کوکی‌های بالا فقط نمونه‌اند. لینک تماسی را که خودتان ساخته‌اید و کوکی‌های نشست واردشدهٔ مرورگر خودتان را به کار ببرید.

فیلد نوع پیش‌فرض معنی
platform string ندارد، الزامی سرویس: vk، telemost، dion، wbstream یا bitrix. از روی لینک حدس زده نمی‌شود.
join_link string "" تماسی که باید به آن پیوست. در outbound الزامی است. در inbound اگر خالی بماند، تماس تازه‌ای ساخته می‌شود و لینکش را از لاگ بردارید.
mode string پایین‌تر را ببینید روش حمل داده، فقط برای wbstream و bitrix: dc (data channel) یا video. هر دو طرف باید یک حالت داشته باشند.
cookies فهرستی از {name, value} [] فقط inbound. کوکی‌های نشست واردشدهٔ شما روی سرویس.
email string "" inbound، فقط dion. همراه password، برای ورود بدون کوکی، یا ورود دوباره وقتی کوکی refresh نیست یا منقضی شده است.
password string "" inbound، فقط dion. همراه email.
read_buffer number 32768 اندازهٔ بافر خواندن برای تونل‌های data channel، به بایت.

فیلدهای معمول dial (detour، bind_interface و بقیه) هم کار می‌کنند. تونل از آن‌ها برای رسیدن به سرویس تماس استفاده می‌کند.

سرویس‌ها

platform سرویس inbound join_link mode
vk VK Calls بله لینک تماس VK. آخرین بخش مسیر، توکن تماس است. استفاده نمی‌شود، ویدیو
telemost Yandex Telemost بله لینک کنفرانس Telemost. استفاده نمی‌شود، ویدیو
dion Dion بله https://dion.vc/event/<slug>، dion://<slug> یا خود slug. استفاده نمی‌شود، ویدیو
wbstream WB Stream بله https://stream.wb.ru/room/<id>، wbstream://<id> یا خود id. dc (پیش‌فرض) یا video
bitrix Bitrix24 خیر https://<portal>/video/<alias> video (پیش‌فرض) یا dc

کوکی‌ها

cookies یک فهرست JSON از شیءهای {"name": …, "value": …} است، همان قالبی که افزونه‌های خروجی‌گرفتن کوکی در مرورگر می‌سازند. فیلدهای دیگر این شیءها نادیده گرفته می‌شوند و مدخل‌های بی‌نام کنار گذاشته می‌شوند. کوکی‌ها را از مرورگری بردارید که در آن وارد سرویس شده‌اید. آن‌چه هر سرویس لازم دارد، تا جایی که کد نشان می‌دهد:

  • vk: کوکی‌های ورود شما به vk.ru. کد آن‌ها را برای گرفتن توکن به login.vk.ru می‌فرستد.
  • telemost: کوکی‌های ورود شما به Yandex. کد آن‌ها را به API تله‌موست می‌فرستد.
  • dion: کد vc-refresh-token و vc-access-token را می‌خواند. اگر vc-refresh-token نباشد یا رد شود و email و password تنظیم شده باشند، به‌جایش با آن‌ها وارد می‌شود. با email و password فهرست می‌تواند خالی باشد. بدون آن‌ها نباید خالی باشد.
  • wbstream: باید __wb_device_id را داشته باشد. از بقیه فقط wbx-refresh، x_wbaas_token، _wbauid و wbx-validation-key فرستاده می‌شوند.

کوکی‌ها و رمز عبور به اندازهٔ ورود به حسابتان قدرت دارند. هر کسی که کانفیگ شما را بخواند می‌تواند از حسابتان استفاده کند.

نکته‌ها

  • bitrix فقط به‌عنوان outbound کار می‌کند. inbound با "platform": "bitrix" با خطای «call: unsupported platform bitrix» شکست می‌خورد، پس سرور هیدیفای نمی‌تواند طرف دیگر باشد.
  • outbound فیلد cookies را می‌پذیرد ولی از آن استفاده نمی‌کند: کلاینت همیشه به‌عنوان مهمان وارد می‌شود.
  • max_buffered_amount و memory_limit پذیرفته می‌شوند ولی اثری ندارند.
  • در wbstream، مقدار mode به جز dc یا video باعث می‌شود کانفیگ بارگذاری نشود و خطای «call: unknown wbstream mode …, use dc or video» را بدهد.
  • در telemost، وقتی relay راه نیفتد، خطا در لاگ نوشته می‌شود و sing-box به کار ادامه می‌دهد.
  • در vk، لاگ توکن پیوستن به تماس را، که بخشی از کلید تونل است، نشان نمی‌دهد.
  • وقتی طرف سرور تماس تازه می‌سازد، لینک در هر بار اتصال عوض می‌شود. برای ثابت ماندن لینک، join_link را در inbound تنظیم کنید.

همچنین ببینید


اخرین بروزرسانی: 26 فوریهٔ 2026

نظرات