تونل تماس
تونل تماس، ترافیک پراکسی را درون یک تماس تصویری روی یک سرویس عمومی ویدیوکنفرانس جابهجا میکند:
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 تنظیم کنید.