Tunnel (تونل معکوس)
endpointهای tunnel چند نمونهٔ sing-box را از طریق یک سرور عمومی به هم وصل میکنند تا به ماشینی که
آدرس عمومی ندارد (پشت NAT یا فایروال) هم بشود دسترسی داشت. سرور endpoint "type": "tunnel_server"
را اجرا میکند و هر ماشین دیگر "type": "tunnel_client" را. هر کلاینت اتصالهایی را به سرور باز نگه
میدارد و سرور ترافیک مربوط به آن کلاینت را از همین اتصالها به آن برمیگرداند. هر طرف یک UUID دارد
و قاعدههای مسیریابی تعیین میکنند ترافیک به کدام طرف برود.
چرا از آن استفاده کنیم
- دسترسی به ماشین خانه یا محل کار که آدرس IP عمومی ندارد، از طریق سروری که دارد.
- وصل کردن دو کلاینت که مستقیم به هم دسترسی ندارند، از طریق سرور.
- استفاده از هر پروتکل پروکسی بین کلاینتها و سرور، مثلاً VLESS با REALITY، تا تونل از محافظت همان پروتکل بهره ببرد.
چطور از فیلترینگ عبور میکند
تونل پنهانسازی مخصوص خودش ندارد. ترافیک آن داخل خروجیای که به کلاینت میدهید و ورودیای که به سرور میدهید حرکت میکند، پس دقیقاً شبیه همان پروتکل است. پروتکلی را انتخاب کنید که در شبکهٔ شما کار میکند. چون کلاینت همیشه خودش به سرور وصل میشود، جایی هم که اتصال ورودی به کلاینت مسدود است کار میکند.
چطور کار میکند
- هویتها. هر کلاینت یک
uuid(نام عمومی آن که در قاعدههای مسیریابی میآید) و یکkey(یک راز، آن هم با قالب UUID) دارد. سرورuuidخودش و فهرستی از کاربرها دارد که هر کدامuuidوkeyیک کلاینت است. - اتصالهای آماده. پس از شروع، هر کلاینت از طریق
outboundخود ۵ اتصال به سرور باز میکند و آماده نگه میدارد. سرور برای هر کلاینت حداکثر ۱۰ اتصال نگه میدارد و با رسیدن اتصال تازه قدیمیترین را میبندد. اگر اتصالی شکست بخورد، کلاینت ۵ ثانیه صبر میکند و دوباره تلاش میکند. - آدرس کنترل. اتصالهای تونل داخل پروتکل خروجی به آدرس
sp.tunnel.sing-box.arpa:444میروند وinboundسرور آنها را رسیدگی میکند. بقیهٔ اتصالهایی که به این ورودی میرسند مثل همیشه مسیریابی میشوند، پس همین ورودی میتواند به کاربرهای عادی پروکسی هم سرویس بدهد. - فرستادن ترافیک. اتصالی که به endpoint
tunnel_clientمسیریابی شود، همراه UUID طرفی که برای آن است (مقصد تونل) به سرور فرستاده میشود. در سرور دوباره مسیریابی میشود وtunnel_sourceبرابر کلاینت فرستنده وtunnel_destinationبرابر مقصد است: - اگر مقصد همان
uuidخود سرور باشد، سرور آن را مثل هر اتصال دیگری مسیریابی میکند (مثلاً به اینترنت). - اگر مقصد کلاینت دیگری باشد، یک قاعده آن را به endpoint
tunnel_serverمیفرستد و این endpoint آن را از یکی از اتصالهای آمادهٔ آن کلاینت تحویل میدهد. کلاینت مقصد آن را باtunnel_sourceبرابر فرستنده مسیریابی میکند. - فقط TCP حمل میشود و UDP رد میشود.
- اتصالی که مقصدش خود فرستنده باشد بهعنوان حلقهٔ مسیریابی رد میشود.
پیکربندی
سرور:
{
"endpoints": [
{
"type": "tunnel_server",
"tag": "tunnel",
"uuid": "00000000-0000-0000-0000-000000000001",
"users": [
{
"uuid": "11111111-1111-1111-1111-111111111111",
"key": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa"
},
{
"uuid": "22222222-2222-2222-2222-222222222222",
"key": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"
}
],
"inbound": {
"type": "vless",
"tag": "tunnel-in",
"listen": "::",
"listen_port": 443,
"users": [{ "uuid": "cccccccc-cccc-cccc-cccc-cccccccccccc" }]
}
}
],
"route": {
"rules": [
{
"tunnel_destination": ["22222222-2222-2222-2222-222222222222"],
"outbound": "tunnel"
}
]
}
}
کلاینت:
{
"endpoints": [
{
"type": "tunnel_client",
"tag": "tunnel",
"uuid": "11111111-1111-1111-1111-111111111111",
"key": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa",
"outbound": {
"type": "vless",
"tag": "tunnel-out",
"server": "203.0.113.10",
"server_port": 443,
"uuid": "cccccccc-cccc-cccc-cccc-cccccccccccc"
}
}
]
}
فیلدهای tunnel_client
| فیلد | نوع | پیشفرض | معنی |
|---|---|---|---|
uuid |
string | الزامی | UUID این کلاینت. دیگران آن را بهعنوان مقصد تونل به کار میبرند. |
key |
string | الزامی | راز این کلاینت با قالب UUID. باید با key یکی از کاربرهای سرور یکی باشد. |
outbound |
object | الزامی | یک خروجی کامل (با type، tag و فیلدهایش) که به inbound سرور میرسد. |
فیلدهای tunnel_server
| فیلد | نوع | پیشفرض | معنی |
|---|---|---|---|
uuid |
string | الزامی | UUID سرور. ترافیکی که برای این UUID است از خود سرور خارج میشود. |
users |
فهرست | ندارد | کلاینتها، هر کدام با uuid و key. |
inbound |
object | الزامی | یک ورودی کامل (با type، tag و فیلدهایش) که کلاینتها به آن وصل میشوند. |
connect_timeout |
duration | 5s |
چقدر برای یک اتصال آمادهٔ آزاد از کلاینت مقصد صبر کند. |
فیلدهای قاعدهٔ مسیریابی
| فیلد | کجا | معنی |
|---|---|---|
tunnel_source |
قاعدههای route و DNS، rule setها | با UUID طرفی که اتصال را فرستاده تطبیق میدهد. |
tunnel_destination |
قاعدههای route و DNS، rule setها | با UUID طرفی که اتصال برای آن است تطبیق میدهد. |
override_tunnel_destination |
actionهای route و route-options |
UUID طرفی را که اتصال برای آن است تعیین میکند. |
نکتهها
- اتصال تازه مقصد تونلش را از
override_tunnel_destinationدر یک action از نوعrouteیاroute-optionsمیگیرد. هر دو endpoint اتصال بدون مقصد را رد میکنند («tunnel destination not set»). - کلید کلاینت ناشناخته، یا UUID مقصدی که کاربر نیست، رد و در لاگ ثبت میشود.
- همهٔ UUIDها و کلیدها باید UUID معتبر باشند، وگرنه کانفیگ بارگذاری نمیشود.