در این مقاله قصد دارم شما را با مفهومی بسیار جذاب به نام SSH Tunneling / Port Forwarding آشنا کنم، افرادی که کار System Admin در یک شرکت انجام داده اند یا دروه LPIC1 , LPIC2 را گذرانده اند حتما با این مفهوم آشنا هستن ولی در این مقاله میخواهم به صورت کامل تر و با سناریو به شرح آن بپردازم.

افرادی که علاقه مند به مباحث شبکه هستن حتما برای آنها این مقاله جذاب می باشد و این را هم بگویم که این مقاله برای کسانی مفید می باشد که حداقل دوره های network+ , CCNA یا دوره های LPIC گذرانده باشن از این جهت میگویم که اگر با این مفاهیم آشنا باشید درک عمیق تری نسبت به موضوعی که میخواهم توضیح بدهم دارید.

ولی من تا میتونم هر موضوعی که در این مقاله بحث میشه رو یک تعریف ازش داشته باشم تا دوستانی که حتی آشنایی ندارن از آن درکی پیدا کنن.

SSH Tunneling / Port Forwarding چیست ؟

همین اول یک تعریفی از این مفاهیم داشته باشیم، SSH Tunneling یک روش انتقال داده های شبکه از طریق یک اتصال امن و مرزنگاری شده می باشد که می توان از آن برای پیاده سازی شبکه های خصوصی و همچنین دسترسی به خدمات اننترانت و فایروال استفاده کرد.

قبل از شروع درک مفهوم SSH Tunneling باید در مورد مفهوم استاندارد SSH اطلاع داشته باشیم، SSH استانداردی برای ورودی های داده به صورت ایمن از راه دور می باشد. همچین می توان ایمن سازی ترافیک داده های هر برنامه کاربردی را با استفاده از port forwarding فراهم کرد و اساساً هر پورت TCP/IP را بر روی SSH می توان تونل کرد. به بیان ساده تر هنگامی که اتصالی را از طریق SSH برقرار می کنیم تمام داده های که بین سرور و کلاینت رد و بدل می شود به صورت رمزنگاری شده است و نمیتوان اصطلاحا ترافیک شبکه را شنود (sniff network traffic) کرد.

همانطور که در بالا مشاهده می کنید یک تونل بین یک کلاینت و سرور ایجاد شده است که از طریق SSH این تونل رمزنگاری شده است.

خب من قصد دارم از تعاریف بیام بیرون و با شکل مفهوم تمام بحثی که قصد دارم و برسونم، به تصویر زیر دقت کنید تا وارد موضوع اصلی بشیم .

اولین مفهومی که میخواهم بگویم NAT Server می باشد، اول بگویم که چرا از این مفهوم استفاده می کنیم همانطور که در تصویر بالا مشاهده می کنید ما چند کلاینت و یک روتر و یک سرور NAT داریم که از طریق آن به اینترنت وصل شده ایم. هنگامی که ما شروع به طراحی شبکه میکنیم تمام IP های ما مثل تمام سیستم های یک دانشگاه در داخل یک شبکه Local قرار دارند. IP ها به دو دسته Public , Private تقسیم بندی می شوند، IP Private همان های هستن که به روتر ها یا سیستم های شبکه داخلی خود میدهیم و از بیرون قابل دسترس نیستن.

IP Public، این دسته از IP ها از طریق شرکت های ISP (Internet Service Provider) قابل خریدن هستن و در بستر اینترنت معتبر می باشند بدین معنی این IP در فضای ابری که آن را اینترنت می نامیم قابل دسترس هستن، پس برای اینکه ما بتوانیم به فضای اینترنت دسترسی داشته باشیم باید یک IP Valid داشته باشیم.

NAT (Network Address Translation) خب در اینجا هست که NAT وارد عمل می شود، اگر ما از NAT استفاده نکنیم و بخواهیم به اینترنت دسترسی پیدا کنیم باید برای هر سیستم یک IP Valid خریدار کنیم پس خیلی جالب نیست ! همانطور که از اسم این مفهوم پیدا می باشد وظیفه ترجمه آدرس شبکه را عهده دارد، در شکل بالا همانطور که مشاهده می کنید هنگامی که یک شبکه داخلی می خواهد به اینترنت وصل بشود در سر راه آن یک NAT Server قرار دارد که روی آن یک IP Valid تنظیم شده است . NAT Server درون IP Table خود درخواست کلاینت را از طریق IP Valid به اینترنت ارجاع می دهد بعد از اتمام و گرفتن پاسخ به IP خود آن سیستم پاسخ را برمیگرداند، پس وظیفه تبدیل و ترجمه IP ها بر عهده NAT می باشد.

هنگامی که شما بر روی سیستم خانگی خود اینترنت را از طریق هر ISP راه اندازی میکنید به شما یک IP Valid می دهد که بر روی مودم خانگی شما تنظیم شده است و از طریق NAT Server هنگامی که سایتی باز میکنید درخواست شما به فضای ابری هدایت میکند.

تمام این مفاهیم داریم می گویم که به مفهوم اصلی برسیم و خیلی نمیشود مباحث را باز کرد چون بعضی از مفاهیم بالا هر کدوم چندین سر فصل میشه که توی دوره های مختلف میشه تدریس کرد ولی تا میتونم سعی میکنم مفهوم برسونم و جوری توضیح بدم تا درک بشه.

SSH Port Forwarding

خب حالا بیایم برسی کنیم و ببنیم اصلا داستان چی هست و SSH Tunneling / Port Forwarding کجا ها برای ما کاربرد داره .

: مشکل همانطور که قبلا گفتم وقتی شروع به طراحی شبکه می کنید شما در داخل یک شبکه محلی Local قرار دارید، شما وقتی که می خواهید با سرور به صورت راه دور ارتباط برقرار کنید باید به آن SSH یا telnet بزنید، خب ارتباط شما با محیط بیرون برقرار است ولی فرض کنید نیاز دارین از یک محیط دیگ مثل دانشگاه یا محیط کار به سیستم خود در خانه وصل بشوید و یک سری کار ها را انجام بدهید. در همان سناریو بالا فک کنید از بیرون میخواهید به سیستم های داخل شبکه محلی خود وصل شوید به دلیل اینکه مشکلی پیش آمده است.

خب اینجا هست که مفهوم SSH Port Forwarding وارد عمل می شود شما به راحتی می توانید یک Port بر روی یک از سیستم های داخلی خود Forward کنید به این عمل می گویند SSH Port Forwarding که از طریق آن میتوانید یک تونل امن جوری که کسی متوجه نشود ایجاد کنید. اگر هنوز ابهام دارید نگران نباشید در جلو تر به صورت کامل این مفهوم را باز میکنم.

قبل شرع میخوام به شکل های زیر دقت کنید که خیلی مهم می باشد چون برای تونل زدن خیلی راه های معتدی وجود دارد و من چهارتا از پرکاربرد ترینشو براتون آوردم :

۱. Local port forwarding - اتصال یک سرور گیرنده SSH از طریق Port Forwarding به یک سرور مقصد، من تصویر اول و دستوری که زده شده براتون بازش میکنم .

ssh -L 123:localhost:456 remotehost

: شرح دستور بالا ssh کن به صورت لوکال به پورت 123، وصل کن به localhost:456 بعد از اینکه به remotehost وصل شدی. از طریق این مفهوم ما تنوسیم یک پورتی از طریق تونل زدن وصل کنیم به یک جای دیگ پس هر موقع من وصل بشم به پورت 456 در واقع از طریق تونل به پورت 123 وصل شدیم. (-L به مفهوم Local می باشد)

۲. Remote port forwarding - خب در مفهوم قبلی یک پورت از روی کلاینت فورواد کردیم به یک لوکال هاست دیگ حالا همین تونل را میخوایم به صورت بالعکس انجام بدیم.

ssh -R 123:localhost:456 remotehost

: شرح دستور بالا وصل کن به صورت Remote / Reverse پورت 123 به localhost:456 بعد از اینکه به remotehost وصل شدی، پس اگرم من وصل بشم به پورت 123 انگار از طریق SSH Tunnel وصل شدم به پورت 456. (-R به مفهوم Remote / Reverse می باشد)

: سناریو اول فرض کنید در یک شرکتی کار میکنید به عنوان System Admin به شما یک سرور داده اند و شما را مجاب کرده اند حتما هر مشکلی پیش آمد باید بیاین اینجا و مشکل رو حل کنی و تمام دسترسی های این سرور هم از بیرون بسته است، میخوام در قالب همین مثال بحث SSH Port Forwarding بگم و هم یک راه میانبر بهتون یاد بدم که از انجامش کلی لذت ببرید.

: راه حل سناریو اول خیلی ساده شما میتوانید یک سرور VPS برای خود خریداری کنید و از طریق مفهومی که برای شما توضیح دادم یک SSH Tunnel از طریق سرور خود به سرور داخل شرکت بزنید در صورتی که هیچ کس متوجه این قضیه نشود (:

وقتی شما اتصال تونل خود را برقرار کنید هر موقع وارد یک پورت مثل 456 شدیم در واقعا وارد سرور خود روی پورتی که تنظیم کرده ایم شده ایم، من در تصویر زیر سناریوی برای شما کشیده ام، خوب توجه کنید :

هنگامی که یک ارتباط از طریق سیستم خود به سرور VPS برقرار کنیم و به پورت 456 وصل بشویم یعنی به تونلی که روی پورت 123 ایجاد کردیم و آن را به سرور شرکت وصل کردیم متصل شده ایم و در نتیجه دسترسی به اطلاعات ان داریم .

سناریو دوم : فرض کنید شما دو سرور دارید، یک سرور به نام canada-server در کانادا می باشد و سررور dev-server در محل کار شما است که میخوایم از طریق سرور که توی کانادا داریم وصل بشیم به لبتابی که توی خونه داریم، طبق صحبت های که کردیم امکانش نباید باشه چون ما از بیرون بخوایم وصل بشیم به کامپیوتر خودمون چون داخل یک شبکه محلی هستیم امکان پذیر نیست پس راه کار چیه ؟

خب طبق شکل زیر سناریو براتو باز میکنم و راه حل و براتون توضیح میدم :

طبق صحبتی که کردیم و Tunnel که بین سیستم ما و سرور dev-server ایجاد شد خیلی راحت میتونیم با SSH کردن روی سرور داخل کانادا و از روی اون با SSH کردن به پورت 1002به سیستم داخل خونه وصل بشیم.

جمع بندی

SSH Tunneling / Port Forwarding بحث پیشرفته ای می باشد و قطعا نیاز به تجربه و گرفتن مدارک مختلفی دارد، ولی من سعی کردم سناریو محور با مفاهیم مهم شبکه اشناتون کنم و در کنارش این مفهوم خیلی جذاب و براتون شرح بدم، بسیار سناریوهای مختلفی میشه نوشت تا Tunnel های تو در توی در شبکه های خودتون ایجاد کنید، امیدوارم از این بحث در جهت مثبت استفاده کنید و به فکر هک کردن نیفتین، بحث هک و امنیت هم اگرچه در مسیر قانون مند خودش خیلی جذاب است، امیدوارم این مقاله برای دوستانی که دنبال مباحث شبکه هستن مفید باشه.