SSH: ورودی و افزودههای هیدیفای
sing-box اصلی فقط میتواند به یک سرور SSH وصل شود. هیدیفای یک سرور SSH (ورودی،
"type": "ssh" در فهرست inbounds)، پشتیبانی UDP برای خروجی SSH از راه UDP over TCP، و یک
اتصال پسزمینه که خروجی را آماده نگه میدارد اضافه میکند. بقیهٔ خروجی SSH مثل sing-box اصلی
کار میکند و آنجا مستند شده است. این صفحه فقط بخشهای هیدیفای را توضیح میدهد.
چرا از آن استفاده کنیم
- سروری میخواهید که هر کلاینت SSH بتواند با port forwarding (
ssh -L) یا بهعنوان پراکسی SOCKS (ssh -D) از آن استفاده کند، بیآنکه به کاربران دسترسی shell روی سرور بدهید. - میخواهید UDP (مثلاً DNS، QUIC یا تماس صوتی) از خروجی SSH عبور کند. SSH ساده فقط TCP را میبرد.
- میخواهید خروجی SSH پیش از اولین اتصال وصل، تست و آماده نشان داده شود.
چطور از فیلترینگ عبور میکند
SSH پروتکلی رایج برای مدیریت سرورهاست و بسیاری از شبکهها آن را باز میگذارند. ترافیک رمزنگاری شده است، پس فیلتر نمیتواند ببیند چه سایتهایی را باز میکنید.
این روش پنهان نمیکند که ترافیک SSH است. فیلتر میتواند دستدادن SSH را ببیند و بعضی شبکهها نشستهای طولانی یا پرترافیک SSH را کند یا مسدود میکنند. جایی از آن استفاده کنید که SSH مجاز است.
چطور کار میکند
ورودی
- سرور روی TCP گوش میدهد و دستدادن SSH را با
host_keyخودش انجام میدهد. - کاربر با رمز عبور یا کلید عمومی از فهرست
usersوارد میشود. هر دو بررسی کاربر را با نامش پیدا میکنند. - سرور فقط درخواستهای port forwarding (کانالهای
direct-tcpip) را میپذیرد. درخواست shell، اجرای فرمان یا subsystem رد میشود. درخواست forward که سرور نتواند بخواند، بهتنهایی رد میشود؛ اتصال SSH و forwardهای دیگرش ادامه پیدا میکنند. - هر اتصال forward شده مثل اتصال هر ورودی دیگری مسیریابی میشود. نام کاربر ثبت میشود، پس آمار
و قاعدههای مسیریابی
auth_userکار میکنند. مهلتهای خواندن و نوشتن (deadline) روی اتصالهای forward شده کار میکنند. - اتصال forward شده به نشانی UDP over TCP در sing-box، ترافیک UDP را میبرد. پس یک خروجی SSH
هیدیفای با
udp_over_tcpمیتواند UDP را از این سرور بفرستد. وقتیnetworkشاملudpنباشد، این قابلیت خاموش است.
خروجی: UDP over TCP
وقتی udp_over_tcp روشن است، خروجی هر نشست UDP را درون یک اتصال TCP forward شده و با قالب
UDP over TCP در sing-box میفرستد. سرور باید این قالب را بفهمد: ورودی SSH هیدیفای میفهمد، سرور
OpenSSH معمولی نمیفهمد.
بدون udp_over_tcp، خروجی UDP را نمیپذیرد، حتی اگر network شامل udp باشد. UDP را به
خروجی دیگری بفرستید.
خروجی: اتصال پسزمینه
- پس از شروع، خروجی بدون انتظار برای ترافیک، در پسزمینه به سرور وصل میشود. وقتی نشست قطع شود، دوباره وصل میشود: پس از خطا ۱ ثانیه صبر میکند و بعد از هر خطای تازه دو برابر، تا حداکثر ۱ دقیقه.
- وقتی وصل شد، پایش بلافاصله آن را تست میکند.
- تا وقتی وصل نیست، برنامه آن را در حال اتصال نشان میدهد، و آخرین خطای اتصال را بهعنوان خطای پراکسی (نه در نوع آن). پایش تا وقتی خروجی وصل نشده آن را رد میکند.
- وقتی برنامه نخواسته اتصالهای بیکار نگه داشته شوند، نشست پس از پایان آخرین اتصالش بسته میشود و تا اتصال بعدی دوباره باز نمیشود.
پیکربندی
ورودی
{
"inbounds": [
{
"type": "ssh",
"tag": "ssh-in",
"listen": "::",
"listen_port": 2222,
"host_key": [
"-----BEGIN OPENSSH PRIVATE KEY-----\n...\n-----END OPENSSH PRIVATE KEY-----"
],
"users": [
{ "user": "alice", "password": "<password>" },
{ "user": "bob", "public_key": "ssh-ed25519 AAAA... bob@laptop" }
]
}
]
}
| فیلد | نوع | پیشفرض | معنی |
|---|---|---|---|
host_key |
list of strings | الزامی | کلیدهای خصوصی سرور با قالب PEM یا OpenSSH. سرور بدون host key نمیتواند دستدادن را کامل کند. |
users |
list of objects | ندارد | کاربرانی که میتوانند وارد شوند. |
users[].user |
string | ندارد | نام کاربر. |
users[].password |
string | ندارد | رمز عبور. خالی بگذارید تا ورود با رمز برای این کاربر خاموش شود. |
users[].public_key |
string | ندارد | یک کلید عمومی، به شکل یک خط از فایل authorized_keys. خالی بگذارید تا ورود با کلید برای این کاربر خاموش شود. |
server_version |
string | پیشفرض SSH در Go | رشتهٔ نسخهای که سرور میفرستد، مثل SSH-2.0-OpenSSH_9.6. اگر پیشوند SSH-2.0- را نداشته باشد، اضافه میشود. |
host_key_algorithms |
list of strings | همه | الگوریتمهای host key که سرور ارائه میدهد. کلید RSA فقط با rsa-sha2-512، rsa-sha2-256 یا ssh-rsa که در فهرست آمده باشند امضا میکند. کلیدهای دیگر فقط وقتی استفاده میشوند که نوعشان در فهرست باشد، مثل ssh-ed25519. اگر هیچ host keyی باقی نماند، کانفیگ بارگذاری نمیشود. |
network |
"tcp" or "udp" |
هر دو | بدون udp، سرور UDP over TCP را نمیبرد. سرور همیشه روی TCP گوش میدهد. |
فیلدهای معمول گوش دادن (listen، listen_port و بقیه) مثل ورودیهای دیگر کار میکنند.
خروجی
{
"outbounds": [
{
"type": "ssh",
"tag": "ssh-out",
"server": "203.0.113.10",
"server_port": 2222,
"user": "alice",
"password": "<password>",
"udp_over_tcp": true
}
]
}
| فیلد | نوع | پیشفرض | معنی |
|---|---|---|---|
udp_over_tcp |
bool or object | خاموش | ترافیک UDP را درون اتصالهای TCP forward شده بفرست. true یعنی نسخهٔ ۲. شکل شیء آن {"enabled": true, "version": 1} یا 2 است. |
network |
"tcp" or "udp" |
هر دو | شبکههایی که خروجی میپذیرد. sing-box اصلی فقط TCP را میپذیرد. UDP فقط وقتی پذیرفته میشود که udp_over_tcp روشن باشد. |