# نودهای رله

> مسیریابی ترافیک از طریق سرور داخلی برای مقاومت در برابر مسدودسازی IP.

## مسائلی که نودهای رله حل می‌کنند

هنگامی که IP سرور خروجی شما مسدود شود، کلاینت‌ها دسترسی را از دست می‌دهند. یک نود رله یک نقطه ورودی داخلی برای آنها فراهم می‌کند که مسدود کردن آن سخت‌تر است:

```
کلاینت → رله (IP داخلی) → سرور خروجی (خارج) → اینترنت
```

سانسورکنندگان ترافیک را به IP داخلی می‌بینند. رله TCP خام را به سرور خروجی ارسال می‌کند — تمام رمزگذاری بین کلاینت و سرور خروجی end-to-end است. رله هرگز متن ساده را نمی‌بیند.

## چگونه نودهای رله کار می‌کنند

یک رله [Realm](https://github.com/zhboner/realm) را اجرا می‌کند، یک forwarder TCP سبک‌وزن و بدون کپی (~5 مگابایت Rust باینری). به پورت 443 (قابل پیکربندی) گوش می‌دهد و تمام ترافیک را به پورت 443 سرور خروجی ارسال می‌کند. بدون Docker، بدون نرم‌افزار VPN، بدون پنل مدیریتی.

تمام پروتکل‌ها از طریق رله کار می‌کنند:
- **Reality** — دست‌دهی end-to-end، رله کاملاً شفاف است
- **XHTTP** — مسیریابی شده از طریق رله با پارامتر صریح `sni=`
- **WSS** — حالت دامنه، مسیریابی شده با `sni=domain&host=domain`

## استقرار یک رله

ابتدا سرور خروجی را به طور عادی استقرار دهید. سپس یک رله به آن اشاره را استقرار دهید:

```bash
meridian relay deploy RELAY_IP --exit EXIT_IP
```

Provisioner:
1. بسته‌های مورد نیاز را نصب می‌کند و BBR را فعال می‌کند
2. firewall UFW را پیکربندی می‌کند (اجازه SSH + پورت رله)
3. Realm باینری را دانلود می‌کند (نسخه ثابت‌شده، SHA256-تأیید‌شده)
4. پیکربندی Realm را نوشته و سرویس systemd را شروع می‌کند
5. اتصال رله → خروجی را تأیید می‌کند

### پرچم‌ها

| پرچم | پیش‌فرض | توضیح |
|------|---------|-------------|
| `--exit/-e EXIT` | (الزامی) | IP یا نام سرور خروجی |
| `--name NAME` | (خودکار) | نام دوست‌انه برای رله (مثلاً `ru-moscow`) |
| `--port/-p PORT` | 443 | پورت گوش‌دهی روی سرور رله |
| `--user/-u USER` | root | کاربر SSH روی سرور رله |
| `--yes/-y` | | پرسش‌های تأیید را رد کنید |

### مثال با تمام گزینه‌ها

```bash
meridian relay deploy 10.0.0.5 --exit 1.2.3.4 --name ru-moscow --port 443 --user ubuntu
```

## چگونه کلاینت‌ها اتصال برقرار می‌کنند

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

هنگام افزودن کلاینت‌های جدید، URL‌های رله به‌طور خودکار شامل می‌شوند:

```bash
meridian client add alice --server 1.2.3.4   # URL‌های رله شامل هستند
```

## مدیریت نودهای رله

```bash
meridian relay list                    # تمام نودهای رله در تمام سرورهای خروجی
meridian relay list --exit 1.2.3.4     # نودهای رله برای یک خروجی خاص
meridian relay check RELAY_IP          # بررسی سلامت 4 نقطه‌ای
meridian relay remove RELAY_IP         # توقف سرویس + حذف از پیکربندی
```

### بررسی سلامت

`meridian relay check` چهار چیز را آزمایش می‌کند:

| بررسی | آنچه که آزمایش می‌شود |
|-------|---------------|
| SSH به رله | آیا می‌توانید به سرور رله متصل شوید؟ |
| سرویس Realm | آیا سرویس systemd فعال است؟ |
| رله → خروجی TCP | آیا رله می‌تواند سرور خروجی را در پورت 443 برسد؟ |
| محلی → رله TCP | آیا ماشین شما می‌تواند رله را در پورت گوش‌دهی خود برسد؟ |

### حذف یک رله

```bash
meridian relay remove RELAY_IP [--exit EXIT_IP] [--yes]
```

این سرویس Realm را متوقف می‌کند، رله را از اعتبارات سرور خروجی حذف می‌کند و تمام صفحات اتصال کلاینت را دوباره تولید می‌کند (بازگشت به URL‌های مستقیم تنهایی).

## رله‌های متعدد

می‌توانید چندین رله را به یک سرور خروجی متصل کنید — برای مثال، رله‌هایی در شهرهای مختلف یا ISP‌های مختلف:

```bash
meridian relay deploy 10.0.0.5 --exit 1.2.3.4 --name ru-moscow
meridian relay deploy 10.0.0.6 --exit 1.2.3.4 --name ru-spb
```

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

## حل مسائل

### تضاد پورت

یک سرویس دیگر از پورت 443 روی رله استفاده می‌کند. با `ss -tlnp sport = :443` بررسی کنید و سرویس متضاد را متوقف کنید، یا از پورت دیگری با `--port 8443` استفاده کنید.

### مسدودسازی Firewall

اطمینان حاصل کنید که پورت 443 روی firewall تأمین کننده ابری رله / گروه امنیتی باز است، نه تنها UFW.

### سرور خروجی غیرقابل دسترسی است

رله باید بتواند سرور خروجی را در پورت 443 برسد. با `curl -I https://EXIT_IP` از رله آزمایش کنید، یا `meridian relay check` را اجرا کنید.

### سرویس رله شروع نشده است

سرویس Realm را بررسی کنید: `systemctl status meridian-relay`. لاگ‌ها را مشاهده کنید: `journalctl -u meridian-relay --no-pager -n 20`.
