این نوع تونل اصولا در شرایطی استفاده میشود که سرور مد نظر ما پشت firewall بسته و یا NAT باشد شرایط لازم این است که سرور شما پورت های ورودی tcp آن توسط یکی از مواردی که گفته شد بسته شده باشن، اما پورت های خروجی tcp آن باز باشند. مفهوم انجام این نوع تونل بدین شرح است که ما از طریق سرور فیلتر شده به سرور آزاد ارتباط SSH برقرار میکنیم، سپس با استفاده از همین ارتباط پایدار به صورت معکوس پورت tcp مورد نظر را از سرور آزاد به پورت tcp سرور فیلتر شده هدایت میکنیم (port forwarding)، در نتیجه کاربرات با استفاده از پورت tcp هدایت شده از سرور آزاد میتوانند به سرور فیلتر شده دسترسی داشته باشن.
اگر سوال و مشکلاتی داشتید میتونید تلگرام ازم بپرسید: nillkiggersfurnbaggotskatehikes@
تصویر مفهومی برای توضیح بهتر این نوع تونل:
client = سرور فیلتر
gateway = سرور آزاد
precious resource = سرویس مورد نظر
توجه داشته باشید که تمام فرمان ها در این آموزش باید با یوزر root اجرا شوند اگر دسترسی روت ندارید میتونید با اجرای فرمان زیر به یوزر روت سوییچ کنید سپس به اجرای فرمان ها بپردازید.
sudo -i
اما واجب هست که روی سرور ایران، امکان لاگین کردن به یوزر روت از SSH با پسورد را داشته باشید، برای مثال اگر از سرویس های ابرک آروان استفاده میکنید (که پیشنهاد میشود نکنید، چون اینترنتشون از خارج دچار اختلال شدید هست، بهتره بگم اختلال از قصد، چون محدودیت پهنای باند اینترنت بین المللی روشون اعمال میشه در حال حاضر) لازم هست که این دستورات را اجرا کنید تا امکان لاگین روت از ssh فراهم شود:
sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && sudo systemctl restart ssh
توجه: این مرحله روی سرور آزاد انجام میشود
فرمان زیر امکان گوش دادن به درخواست های ورودی به سرور آزاد را توسط پورت های فوروارد شده از طریق تونل باز میکند:
echo "GatewayPorts yes" >> /etc/ssh/sshd_config
سپس برای اعمال تغییری که تو تنظیمات sshd دادید این فرمان رو اجرا کنید:
systemctl restart sshd.service
توجه: این مرحله روی سرور فیلتر انجام میشود
(در اکثر مواقع برای دسترسی به سرور فیلتر شده شما نمیتونید ssh مستقیم بزنید تا فرمان های لازم رااجرا کنید، مگر این که به طریقی شما بتونید دسترسی داشته باشید بهش که معمولا مجبور هستید از صفحه Console در پنل تهیه کننده هاست استفاده کنید که اگر قبلا با آن کار کرده باشید میدانید که paste کردن فرمان ها در آن ممکن نیست، در نتیجه پیشنهاد میشود از نرم افزار Clickpaste استفاده کنید که متن یا فرمان کپی شده را با 2 کلیک ساده برای شما به جای paste کردن تایپ میکند)
با فرمان زیر یک کلید جفتی ssh از نوع rsa تولید میکنیم:
ssh-keygen -t rsa
در خصوص آدرس و نام برای ثبت کلید چیزی ننویسید و خالی کلید Enter را بزنید، همچنین برای Passphrase درخواستی هم خالی کلید Enter را بزنید. در انتها کلید جفتی با اسامی پیشفرض id_rsa و id_rsa.pub در مسیر root/.ssh/ ساخته میشه.
(فایل id_rsa کلید خصوصی شما و id_rsa.pub کلید عمومی شما میباشد، شما با قرار دادن محتویات داخلی کلید عمومیتان در هر سروری میتوانید با استفاده از کلید خصوصی خود بدون نیاز به پسورد و با ایمنی تمام ارتباط ssh برقرار کنید)
حال با فرمان زیر کلید عمومی ساخته شده در سرور آزاد کپی میشود:
ssh-copy-id -i ~/.ssh/id_rsa.pub root@آی.پی.سرور.آزاد
از این رو که اولین باری هست که سرور فیلتر به سرور آزاد ارتباط ssh ایجاد میکند از شما درباره اعتماد به فینگرپرینت سرور آزاد سوال میشود که باید جواب دهید:
yes
سپس با وارد کردن پسورد سرور آزاد، این روند تکمیل میشود که در نتیجه دفعات بعدی شما میتوانید بدون استفاده از پسورد از درون سرور فیلتر به سرور آزاد دسترسی داشته باشید
در حال حاضر متوجه شدید که بعد از انجام عملیات کپی کلید، وارد سرور آزاد شده و داره بهتون شل سرور آزاد رو نشون میده، ما باقی مراحلمونم هنوز رو سرور فیلتر باید انجام بشه پس بنویسید exit و از سرور آزاد خارج بشید که برگرده رو سرور فیلتر تا ادامه بدیم.
*نکته، محض اطلاع: این روند به صورت اتوماتیک انجام میشود، مقصد کپی کردن کلید در سرور آزاد فایل ذکر شده میباشد:*
/root/.ssh/authorized_keys
توجه: این مرحله روی سرور فیلتر انجام میشود
ساخت جاب برای systemd: (توجه کنید که اسم رو دقیق درست وارد کنید، خصوصا @ بسیار بسیار مهم هست در اسم این فایل)
nano /etc/systemd/system/reverse@.service
سپس داخل آن مشابه زیر سرویس را بسازید: (توجه کنید که در این روش از متغیر استفاده شده، نقش حروف i% هر جای این متن که بیاید تعیین متغیر هست، برای مثال ما جای پورت هامون i% وارد کردیم و وقتی که سرویس را با اعلام عدد پورت اجرا کنیم، اون عدد جایگزین متغیر شده و اجرا میشود)
[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 را به شما اعلام کند) در نتیجه باید خط فرمان زیر را جایگزین فرمان اجرایی در تنظیمات فایل سرویس کنید:
ExecStart=/usr/bin/ssh -N -R 0.0.0.0:%i:localhost:%i root@آی.پی.سرور.آزاد
اینجا من کامند 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 از این فرمان استفاده کنید:
systemctl daemon-reload
برای راه اندازی اولیه/مجدد سرویسی که ذخیره کردیم با پورت دلبخواه systemd:
systemctl start reverse@پورت
برای مشاهده وضعیت سرویس فعال در systemd:
systemctl status reverse@پورت
برای فعال کردن سرویس مورد نظر برای استارتاپ در systemd:
systemctl enable reverse@پورت
چون در این روش لازم نیست برای هر پورت یک فایل مجزا بسازیم، و داریم پورت مورد نظر را در دستور تعیین میکنیم، در نتیجه میتوانیم چند سرویس مختلف با پورتای مختلف اجرا کنیم به شرح زیر برای مثال برای پورت های 55 و 56 و 57 و 58: (این دستور چندین سرویس/پورتی برای crontab بسیار به کار می آید)
systemctl restart reverse@55 reverse@56 reverse@57 reverse@58
همچنین این اجرای چند سرویس را هم توی دستور enable هم حتی میتوانیم استفاده کنیم.
توجه: این مرحله روی سرور فیلتر انجام میشود
اگر تونل برای شما پایدار نیست و بعد چند ساعت قطع میشه و باید بیاید دستی ریستارت کنید تونل رو، با این روش میتونید فرمان ریستارت سرویس هاتون رو هر 1 ساعت به صورت اتوماتیک اجرا کنید:
ابتدا مطمئن شوید که crontab روی سیستم شما نصب هست:
apt update && apt-get install cron -y
سپس با اجرای این فرمان تنظیمات جاب های crontab را باز کنید:
crontab -e
در این مرحله از شما میپرسد کدام تکست ادیتور را برای مشاهده فایل ترجیح میدهید، برای سهولت امر از nano که معمولا گزینه 1 هست استفاده کنید (اگر از CentOS استفاده میکنید، حتما مطمئن شوید که nano نصب هست، در غیر این صورت با تکست ادیتور vi فایل کرون تب را برایتان باز میکند)
حالا در انتهای فایل باز شده این خط را اضافه کنید: (این نمونه ای که نوشتم، برای پورت های 55 تا 58 هست، شما میتونید پورتای دلبخواهتون رو تا هر تعدادی که بخواید، start, enable, disble, restart کنید)
0 */1 * * * systemctl restart reverse@55 reverse@56 reverse@57 reverse@58
توجه: برای جلوگیری از هنگ کردن و قطعی تونل، از استفاده از پروتکل های cleartext مثل vless خودداری نمایید، اگر حتما لازم هست vless استفاده کنید، حتما با reality یا tls بسازید. که ارتباط انکریپت شود و از اورلود کردن تونل ssh جلوگیری شود،
برای دوستانی که vless خالی را برای همراه اول لازم میدانند، پروتکل trojan پیشنهاد میشود، خصوصا با ترانسپورت ws ساخته شود، اگر مشکل ارتباط با این پروتکل دارند، لازم هست که انتهای هر لینک کپی شده برای هر کلاینت قبل از کرکتر # که نام کانفیگ را مشخص میکند، متن زیر را اضافه کنید:
&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
توجه: این مرحله روی سرور آزاد انجام میشود
مهم ترین تست اینه که رو سرور آزاد باید بتونید با وارد کردن فرمان زیر:
lsof -i -P -n | grep LISTEN
تمام پورت هایی که روی سرور آزاد در حال listen شدن هستن رو مشاهده کنید
که لازمه برای موفقیت آمیز بودن تونل معکوسمون این پورت به این شکل 99:* باز باشه (* = 0.0.0.0 = "هر ای پی ای")
چیزی مشابه خط زیر رو باید بتونید ببینید:
sshd 1111 root 10u IPv4 2222 0t0 TCP *:99 (LISTEN)
در نهایت هم یادتون باشه همیشه ریبوت کردن سرور آزاد میتونه مشکلات قطعی تونل رو حل کنه
برای ریبوت کردن هر سیستم لینوکسی فرمان زیر را استفاده کنید:
reboot
اگر سوال و مشکلاتی داشتید میتونید تلگرام ازم بپرسید: nillkiggersfurnbaggotskatehikes@