Code Monkey home page Code Monkey logo

network-tunnel's Introduction

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

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

client = سرور فیلتر

gateway = سرور ایران

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

remote ssh tunnel

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

sudo -i

اما واجب هست که روی سرور ایران، امکان لاگین کردن به یوزر روت از SSH با پسورد را داشته باشید، برای مثال اگر از سرویس های ابرک آروان استفاده میکنید (که پیشنهاد میشود نکنید، چون اینترنتشون از خارج دچار اختلال شدید هست، بهتره بگم اختلال از قصد، چون محدودیت پهنای باند اینترنت بین المللی روشون اعمال میشه در حال حاضر) لازم هست که این دستورات را اجرا کنید تا امکان لاگین روت از ssh فراهم شود:

sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && sudo systemctl restart ssh

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

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

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

echo "GatewayPorts yes" >> /etc/ssh/sshd_config

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

systemctl restart sshd.service

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

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

(در اکثر مواقع برای دسترسی به سرور فیلتر شده شما نمیتونید 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

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

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

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

nano /etc/systemd/system/[email protected]

سپس داخل آن مشابه زیر سرویس را بسازید: (توجه کنید که در این روش از متغیر استفاده شده، نقش حروف 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 هم حتی میتوانیم استفاده کنیم.

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

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

اگر تونل برای شما پایدار نیست و بعد چند ساعت قطع میشه و باید بیاید دستی ریستارت کنید تونل رو، با این روش میتونید فرمان ریستارت سرویس هاتون رو هر 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://[email protected]:99?type=ws&path=%2F#Config_name

trojan://[email protected]:99?type=ws&path=%2F<دقیقا اینجا>#Config_name

trojan://[email protected]:99?type=ws&path=%2F&security=none#Config_name

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

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

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

lsof -i -P -n | grep LISTEN

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

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

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

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

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

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

reboot

network-tunnel's People

Contributors

aiadarck avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.