An open API service indexing awesome lists of open source software.

https://github.com/ipmartnetwork/ssh-tunnel

تانل معکوس بین 2 سرور
https://github.com/ipmartnetwork/ssh-tunnel

Last synced: about 2 months ago
JSON representation

تانل معکوس بین 2 سرور

Awesome Lists containing this project

README

          

XPanel



SSH-Tunnel
تانل معکوس بین 2 سرور

آموزش راه اندازی تونل معکوس بین 2 سرور با استفاده از SSH و اتوماسیون با systemd

این نوع تونل اصولا در شرایطی استفاده میشود که سرور مد نظر ما پشت firewall بسته و یا NAT باشد
شرایط لازم این است که سرور شما پورت های ورودی tcp آن توسط یکی از مواردی که گفته شد بسته شده باشن، اما پورت های خروجی tcp آن باز باشند.
مفهوم انجام این نوع تونل بدین شرح است که ما از طریق سرور فیلتر شده به سرور آزاد ارتباط SSH برقرار میکنیم، سپس با استفاده از همین ارتباط پایدار به صورت معکوس پورت tcp مورد نظر را از سرور آزاد به پورت tcp سرور فیلتر شده هدایت میکنیم (port forwarding)، در نتیجه کاربرات با استفاده از پورت tcp هدایت شده از سرور آزاد میتوانند به سرور فیلتر شده دسترسی داشته باشن.

**تصویر مفهومی برای توضیح بهتر این نوع تونل:**

client = سرور فیلتر


gateway = سرور آزاد


precious resource = سرویس مورد نظر

توجه داشته باشید که تمام فرمان ها در این آموزش باید با یوزر root اجرا شوند
اگر دسترسی روت ندارید میتونید با اجرای فرمان زیر به یوزر روت سوییچ کنید سپس به اجرای فرمان ها بپردازید.

```bash
sudo -i
```

اما واجب هست که روی سرور ایران، امکان لاگین کردن به یوزر روت از SSH با پسورد را داشته باشید، برای مثال اگر از سرویس های ابرک آروان استفاده میکنید لازم هست که این دستورات را اجرا کنید تا امکان لاگین روت از ssh فراهم شود:
```bash
sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && sudo systemctl restart ssh
```

1. آماده سازی سرور آزاد


توجه: این مرحله روی سرور آزاد انجام میشود

فرمان زیر امکان گوش دادن به درخواست های ورودی به سرور آزاد را توسط پورت های فوروارد شده از طریق تونل باز میکند:

```bash
sudo sed -i 's/#GatewayPorts no/GatewayPorts yes/' /etc/ssh/sshd_config
```

سپس برای اعمال تغییری که تو تنظیمات sshd دادید این فرمان رو اجرا کنید:

```bash
systemctl restart sshd.service
```

2. تهیه کلید SSH درون سرور فیلتر شده و شناخت آن به سرور آزاد


توجه: این مرحله روی سرور فیلتر انجام میشود

(در اکثر مواقع برای دسترسی به سرور فیلتر شده شما نمیتونید ssh مستقیم بزنید تا فرمان های لازم رااجرا کنید، مگر این که به طریقی شما بتونید دسترسی داشته باشید بهش که معمولا مجبور هستید از صفحه Console در پنل تهیه کننده هاست استفاده کنید که اگر قبلا با آن کار کرده باشید میدانید که paste کردن فرمان ها در آن ممکن نیست، در نتیجه پیشنهاد میشود از نرم افزار Clickpaste استفاده کنید که متن یا فرمان کپی شده را با 2 کلیک ساده برای شما به جای paste کردن **تایپ** میکند)

با فرمان زیر یک کلید جفتی ssh از نوع rsa تولید میکنیم:

```bash
ssh-keygen -t rsa
```

در خصوص آدرس و نام برای ثبت کلید چیزی ننویسید و خالی کلید Enter را بزنید، همچنین برای Passphrase درخواستی هم خالی کلید Enter را بزنید.
در انتها کلید جفتی با اسامی پیشفرض id_rsa و id_rsa.pub در مسیر root/.ssh/ ساخته میشه.

(فایل id_rsa کلید خصوصی شما و id_rsa.pub کلید عمومی شما میباشد، شما با قرار دادن محتویات داخلی کلید عمومیتان در هر سروری میتوانید با استفاده از کلید خصوصی خود بدون نیاز به پسورد و با ایمنی تمام ارتباط ssh برقرار کنید)

حال با فرمان زیر کلید عمومی ساخته شده در سرور آزاد کپی میشود:

```bash
ssh-copy-id -i ~/.ssh/id_rsa.pub root@آی.پی.سرور.آزاد
```

از این رو که اولین باری هست که سرور فیلتر به سرور آزاد ارتباط ssh ایجاد میکند از شما درباره اعتماد به فینگرپرینت سرور آزاد سوال میشود که باید جواب دهید:

```bash
yes
```

سپس با وارد کردن پسورد سرور آزاد، این روند تکمیل میشود که در نتیجه دفعات بعدی شما میتوانید بدون استفاده از پسورد از درون سرور فیلتر به سرور آزاد دسترسی داشته باشید

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

*نکته، محض اطلاع: این روند به صورت اتوماتیک انجام میشود، مقصد کپی کردن کلید در سرور آزاد فایل ذکر شده میباشد:*

/root/.ssh/authorized_keys

3. ساخت فایل سرویس systemd و ایجاد تونل


توجه: این مرحله روی سرور فیلتر انجام میشود

ساخت جاب برای systemd: (توجه کنید که اسم رو دقیق درست وارد کنید، خصوصا @ بسیار بسیار مهم هست در اسم این فایل)

```bash
nano /etc/systemd/system/reverse@.service
```

سپس داخل آن مشابه زیر سرویس را بسازید:
(توجه کنید که در این روش از متغیر استفاده شده، نقش حروف i% هر جای این متن که بیاید تعیین متغیر هست، برای مثال ما جای پورت هامون i% وارد کردیم و وقتی که سرویس را با اعلام عدد پورت اجرا کنیم، اون عدد جایگزین متغیر شده و اجرا میشود)

```bash
[Unit]
Description=Reverse SSH Tunnel Port %I
After=network-online.target

[Service]
Type=simple
ExecStart=ssh -N -R 0.0.0.0:%i:localhost:%i root@آی.پی.سرور.آزاد
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target
```

برای پیاده سازی این روش در دیستروی CentOS لازم هست فایل اجرایی ssh را با مسیر محض آن تنظیم کنید که معمولا در usr/bin/ ذخیره شده. (اگر هنوزم مشکل در رابطه با Absolute Path دریافت کردید، فرمان "which ssh" را اجرا کنید تا مسیر محض ssh را به شما اعلام کند)
در نتیجه باید خط فرمان زیر را جایگزین فرمان اجرایی در تنظیمات فایل سرویس کنید.
یعنی باید ssh در دستور اجرا بشود
/usr/bin/ssh

------------------------------------------------------



توضیحات

------------------------------------

اینجا من کامند sshی که استفاده شده رو براتون یه توضیحی میدم فقط محض رفع شک و شبهه ها


ssh -N -R 0.0.0.0:پورت:localhost:پورت root@آی.پی.سرور.آزاد


این کامند رو به 2 قسمت براتون تقسیم میکنم


قسمت فاقد دستور تونل میشه


اول این قسمت اجرا میشه


ssh -N root@آی.پی.سرور.آزاد


وقتی کهssh کامل وصل شد به سرور مد نظر


سپس قسمت دستور تونل اجرا میشه


-R 0.0.0.0:99:localhost:99


که تایین میکنه تونل از کجا برقرار بشه و به کجا برسه


در اینجا 0.0.0.0:99 روی سرور آزاد تنظیم میشه که تایین میکنه از تمام ای پی های ممکن (0.0.0.0 تنها و تنها به معنی تمام ای پی ها هست، هیچ معنی دیگری ندارد) روی پورت 99 درخواست ها رو قبل کن و هدایت کن به سرور خودمون


در اصل به localhost:99 سرویسیه که رو پورت 99 رو سرور فیلتر شده داره کار میکنه و به درخواست هایی که بهش هدایت میشن جواب میده.




بعد از ذخیره فایل برای بازخوانی جاب های جدید در systemd از این فرمان استفاده کنید:

```bash
systemctl daemon-reload
```

برای راه اندازی اولیه/مجدد سرویسی که ذخیره کردیم با پورت دلبخواه systemd:

```bash
systemctl start reverse@پورت
```

برای مشاهده وضعیت سرویس فعال در systemd:

```bash
systemctl status reverse@پورت
```

برای فعال کردن سرویس مورد نظر برای استارتاپ در systemd:
```bash
systemctl enable reverse@پورت
```

چون در این روش لازم نیست برای هر پورت یک فایل مجزا بسازیم، و داریم پورت مورد نظر را در دستور تعیین میکنیم، در نتیجه میتوانیم چند سرویس مختلف با پورتای مختلف اجرا کنیم
به شرح زیر برای مثال برای پورت های 55 و 56 و 57 و 58: (این دستور چندین سرویس/پورتی برای crontab بسیار به کار می آید)
```bash
systemctl restart reverse@55 reverse@56 reverse@57 reverse@58
```
همچنین این اجرای چند سرویس را هم توی دستور enable هم حتی میتوانیم استفاده کنیم.

4. ایجاد اتوماسیون برای systemctl restart و نکات مهم برای پایداری بیشتر


توجه: این مرحله روی سرور فیلتر انجام میشود

اگر تونل برای شما پایدار نیست و بعد چند ساعت قطع میشه و باید بیاید دستی ریستارت کنید تونل رو،
با این روش میتونید فرمان ریستارت سرویس هاتون رو هر 1 ساعت به صورت اتوماتیک اجرا کنید:

ابتدا مطمئن شوید که crontab روی سیستم شما نصب هست:

```bash
apt update && apt-get install cron -y
```

سپس با اجرای این فرمان تنظیمات جاب های crontab را باز کنید:

```bash
crontab -e
```

در این مرحله از شما میپرسد کدام تکست ادیتور را برای مشاهده فایل ترجیح میدهید،
برای سهولت امر از nano که معمولا گزینه 1 هست استفاده کنید
(اگر از CentOS استفاده میکنید، حتما مطمئن شوید که nano نصب هست، در غیر این صورت با تکست ادیتور vi فایل کرون تب را برایتان باز میکند)

حالا در انتهای فایل باز شده این خط را اضافه کنید:
(این نمونه ای که نوشتم، برای پورت های 55 تا 58 هست، شما میتونید پورتای دلبخواهتون رو تا هر تعدادی که بخواید، start, enable, disble, restart کنید)

```bash
0 */1 * * * systemctl restart reverse@55 reverse@56 reverse@57 reverse@58
```

توجه: برای جلوگیری از هنگ کردن و قطعی تونل، از استفاده از پروتکل های cleartext مثل vless خودداری نمایید، اگر حتما لازم هست vless استفاده کنید، حتما با reality یا tls بسازید. که ارتباط انکریپت شود و از اورلود کردن تونل ssh جلوگیری شود،

برای دوستانی که vless خالی را برای همراه اول لازم میدانند، پروتکل trojan پیشنهاد میشود، خصوصا با ترانسپورت ws ساخته شود، اگر مشکل ارتباط با این پروتکل دارند، لازم هست که انتهای هر لینک کپی شده برای هر کلاینت قبل از کرکتر # که نام کانفیگ را مشخص میکند، متن زیر را اضافه کنید:

```bash
&security=none
```

لینک نمونه که از پنل کپی میشود:

trojan://gy7PCiGHoC@1.1.1.1:99?type=ws&path=%2F#Config_name


trojan://gy7PCiGHoC@1.1.1.1:99?type=ws&path=%2F<دقیقا اینجا>#Config_name


trojan://gy7PCiGHoC@1.1.1.1:99?type=ws&path=%2F&security=none#Config_name

5. تست کردن وضعیت تونل روی سرور آزاد


توجه: این مرحله روی سرور آزاد انجام میشود


مهم ترین تست اینه که رو سرور آزاد باید بتونید با وارد کردن فرمان زیر:

```bash
lsof -i -P -n | grep LISTEN
```

تمام پورت هایی که روی سرور آزاد در حال listen شدن هستن رو مشاهده کنید

که لازمه برای موفقیت آمیز بودن تونل معکوسمون این پورت به این شکل 99:* باز باشه (* = 0.0.0.0 = "هر ای پی ای")

چیزی مشابه خط زیر رو باید بتونید ببینید:

sshd 1111 root 10u IPv4 2222 0t0 TCP *:99 (LISTEN)

در نهایت هم یادتون باشه همیشه ریبوت کردن سرور آزاد میتونه مشکلات قطعی تونل رو حل کنه


برای ریبوت کردن هر سیستم لینوکسی فرمان زیر را استفاده کنید:

```bash
reboot
```

# تلگرام

[@ipmart_network](https://t.me/ipmart_network)

[@iPmart Group](https://t.me/ipmartnetwork_gp)

# حمایت از ما :hearts:
حمایت های شما برای ما دلگرمی بزرگی است


Donate Crypto on Plisio


| TRX | BNB | Litecoin |
| ---------------------------------------- |:-------------------------------------------------:| -------------------------------------------------:|
| ```TJbTYV1fFo2485sYMyajxGPLFzxmNmPrNA``` | ```0x4af3de9b303a8d43105e284823d95b4c600961a3``` | ```MPrkzFiNtw4Rg67bbZB6gCxa9LV87orABM``` |

XPanel