تونل سازی SSH یا فوروارد کردن (باز) پورت SSH روشی برای ایجاد یک اتصال SSH رمزگذاری شده بین یک کلاینت و یک دستگاه سرور است که از طریق آن سرویس‌های مختلف می‌توانند اطلاعات خود را به صورت رمزنگاری شده جابجا کنند.

هنگامی که شما از پروتکل‌هایی مثل VNC یا FTP استفاده می‌کنید، اطلاعات شما به صورت رمزنشده بر روی شبکه جابجا می‌شوند؛ فوروارد کردن SSH برای انتقال اطلاعات شبکه در سرویس‌هایی کاربرد دارد که از یک پروتکل بدون رمز مانند VNC یا  FTP استفاده می‌کنند، و دسترسی به محتواها را از سیستم‌های راه دور امکان پذیر کرده و فایروال‌های میانی را دور می‌زند. در اصل، شما می‌توانید هر پورت TCP را در شبکه محلی خود باز کرده و از طریق یک اتصال تونل SSH اطلاعات خود را منتقل کنید.

سه نوع فوروارد کردن پورت SSH وجود دارد:

    • فوروارد کردن پورت بصورت محلی: اتصالی را از هاست کلاینت به هاست سرور SSH و سپس به پورت هاست مقصد باز می‌کند. در این نوع ایجاد تونل SSH، شما می‌توانید از کامپیوتر محلی خود به سرور ریموت مورد نظر متصل شوید.

    • فوروارد کردن پورت بصورت ریموت: پورتی را از هاست سرور به هاست کلاینت و سپس به پورت هاست مقصد باز می‌کند. بنابراین به شما اجازه داده می‌شود از دستگاه ریموت خود به کامپوتر محلی‌تان متصل شوید.

    • فوروارد کردن پورت بصورت پویا: دستگاه را به یک سرور پروکسی SOCKS تبدیل می‌کند که امکان برقراری ارتباطات TCP را از طریق طیف وسیعی از پورت‌ها فراهم می‌نماید.

در این مقاله، در مورد نحوه راه اندازی و تنظیم تونل‌های SSH رمزگذاری شده محلی، راه دور و پویا صحبت خواهیم کرد.

 

فوروارد کردن پورت بصورت محلی

فوروارد کردن پورت بصورت محلی به شما امکان می‌دهد تا یک پورت را از دستگاه محلی (کلاینت ssh) به پورت دستگاه ریموت (سرور ssh) متصل کنید، که سپس به یک پورت در دستگاه مقصد تونل می‌شود.
در این نوع اتصال، کلاینت SSH به یک پورت معین گوش (listen) می‌دهد و هرگونه اتصال را از آن پورت به پورت مشخص شده در سرور SSH ریموت، تونل می‌کند که سپس به یک پورت در دستگاه مقصد متصل می‌شود. دستگاه مقصد می‌تواند سرور SSH ریموت یا هر دستگاه دیگری باشد.
فوروارد کردن پورت بصورت محلی بیشتر برای اتصال به یک سرویس ریموت درون یک شبکه داخلی مانند یک پایگاه داده یا سرور VNC استفاده می‌شود.

در لینوکس، macOS و دیگر سیستم‌های یونیکس برای ایجاد یک پورت محلی، گزینه -L را برای کلاینت ssh استفاده می‌کنند:

ssh -L [LOCAL_IP:]LOCAL_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER

گزینه‌های استفاده شده به شرح زیر هستند:

گزینه‌های استفاده شده به شرح زیر هستند:
    • [LOCAL_IP:] LOCAL_PORT: شماره IP و شماره پورت دستگاه محلی. هنگامی‌که LOCAL_IP حذف شود، کلاینت ssh به هاست محلی  متصل می‌شود.
    • DESTINATION: DESTINATION_PORT: IP یا نام دامنه و پورت دستگاه مقصد.
    • [USER @] SERVER_IP: آدرس IP کاربر SSH ریموت و سرور.

می‌توانید از هر شماره پورت بزرگتر از 1024 به عنوان یک LOCAL_PORT استفاده کنید. پورت‌های کوچکتر از عدد 1024 پورت‌های ثبت شده هستند و تنها توسط کاربر root می‌توانند مورد استفاده قرار بگیرند. اگر سرور SSH شما به یک پورت دیگری به غیر از 22 (پیش فرض) گوش می‌دهد از گزینه -p [PORT_NUMBER] استفاده کنید.
نام دامنه مقصد باید از روی سرور SSH قابل تبدیل به آدرس IP باشد.
فرض کنید که شما یک سرور پایگاه داده MySQL در حال اجرا روی دستگاه db001.host در یک شبکه داخلی (خصوصی)، که از دستگاه  pub001.host با استفاده از پورت 3306 قابل دسترسی است، حال شما می‌خواهید با استفاده از کلاینت mysql ماشین محلی خود به سرور پایگاه داده وصل شوید. برای این کار می‌توانید ارتباط را به صورت زیر برقرار نمایید:

ssh -L 3336:db001.host:3306 user@pub001.host

پس از اجرای دستور، از شما خواسته می‌شود رمزعبور کاربر SSH ریموت را وارد کنید. پس از وارد کردن آن، به سرور ریموت وارد شده و تونل SSH ایجاد می‌گردد. این ایده خوبی است برای راه اندازی و تنظیم احراز هویت مبتنی بر کلید SSH و اتصال به سرور بدون وارد کردن رمز عبور است.
حال اگر آدرس IP کلاینت پایگاه داده دستگاه محلی خود را 127.0.0.1:3336 در نظر بگیرید، اتصال از طریق دستگاه pub001.host  که به عنوان یک سرور واسطه عمل می‌کند، به سرور MySQL db001.host:3306 برقرار می‌شود.
می‌توان با تنها یک دستور ssh چندین پورت را به مقصد‌های مختلف متصل کنید. به عنوان مثال، در نظر بگیرید شما یک سرور پایگاه داده MySQL دیگری دارید که روی دستگاه db002.host در حال اجرا است و شما می‌خواهید از هر دو کلاینت محلی که به هر دو سرور وصل شوید، بدین منظور باید دستور زیر را تایپ کنید:

ssh -L 3336:db001.host:3306 3337:db002.host:3306 user@pub001.host

برای اتصال به سرور دوم باید از 127.0.0.1:3337 استفاده کنید.
وقتی هاست مقصد همان سرور SSH است به جای تعیینIP ‌هاست مقصد یا نام دامنه می‌توانید از localhost استفاده نمایید.
فرض کنید که شما باید از طریق VNC که در یک دستگاه ریموت اجرا می‌شود و از خارج قابل دسترسی نیست، به آن سرور متصل شوید. در اینصورت دستوری که شما باید استفاده نمایید به صورت زیر می‌باشد:

ssh -L 5901:127.0.0.1:5901 -N -f user@remote.host

گزینه -f به دستور ssh می‌گوید که در پس زمینه اجرا شود و -N میگوید یک دستور ریموت را اجرا ننماید. ما از localhost استفاده می‌کنیم زیرا VNC و سرور SSH در هاست یکسانی در حال اجرا هستند.
اگر در تنظیم تونل سازی با مشکلی روبه‌رو شدید، پیکربندی سرور SSH ریموت خود را بررسی کنید و مطمئن شوید که AllowTcpForwarding  روی مقدار no تنظیم نشده باشد. چراکه به طور پیش فرض، فوروارد کردن امکان پذیر است.

فوروارد کردن به صورت ریموت

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

ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT [USER@]SSH_SERVER

گزینه‌های استفاده شده به شرح زیر هستند:
    • [REMOTE:] REMOTE_PORT: IP و شماره پورت در سرور SSH ریموت. خالی بودن براکت مربوط به REMOTE بدان معنی است که سرور SSH ریموت به تمام رابط‌ها متصل می‌شود.
    • DESTINATION: DESTINATION_PORT: IP یا نام دامنه و پورت دستگاه مقصد.
    • [USER @] SERVER_IP: آدرس IP کاربر SSH ریموت و سرور.
فوروارد کردن پورت بصورت ریموت بیشتر به منظور دسترسی به یک سرویس داخلی برای شخصی از بیرون، مورد استفاده قرار می‌گیرد.
فرض کنید که شما در حال پیاده سازی یک برنامه وب در دستگاه محلی خود هستید و می‌خواهید یک پیش نویسی را برای توسعه دهنده خود نشان دهید. شما یک IP عمومی ندارید بنابراین توسعه دهنده دیگری نمی‌تواند از طریق اینترنت به برنامه دسترسی پیدا کند.
اگر شما به یک سرور SSH ریموت دسترسی دارید می‌توانید یک اتصال پورت ریموت به صورت زیر راه اندازی نمایید:

ssh -L 8080:127.0.0.1:3000 -N -f user@remote.host

دستور فوق باعث می‌شود تا سرور ssh به پورت 8080 گوش دهد و تمام داده‌ها از این پورت را به دستگاه محلی شما در پورت 3000 به صورت امن منتقل کند.
اکنون آن توسعه دهنده می‌تواند با تایپ the_ssh_server_ip: 8080 در مرورگر خود از برنامه عالی شما پیش نمایش بگیرد.
اگر در تنظیم فوروارد کردن پورت بصورت ریموت مشکلی پیش آمد، مطمئن شوید که GatewayPorts در تنظیمات سرور SSH ریموت روی مقدار yes تنظیم شده باشد.

فوروارد کردن پورت بصورت پویا

فوروارد کردن پورت بصورت پویا به شما این امکان را می‌دهد که یک سوکت در دستگاه محلی (کلاینت ssh) ایجاد کنید که به عنوان یک سرور پروکسی SOCKS عمل می‌کند. هنگامی‌که یک کلاینت به این پورت متصل می‌شود، اتصال به دستگاه ریموت (سرور ssh) برقرار شده و سپس به یک پورت پویا در دستگاه مقصد متصل می‌گردد.
به این ترتیب، تمام برنامه‌های کاربردی با استفاده از پروکسی SOCKS به سرور SSH متصل شده و سرور تمام داده‌ها را بصورت امن، به مقصد واقعی خود هدایت می‌کند.
در لینوکس، macOS و دیگر سیستم‌های یونیکسی برای فوروارد کردن پورت بصورت پویا (SOCKS) گزینه -D برای کلاینت ssh استفاده می‌گردد.

ssh -R [LOCAL_IP:]LOCAL_PORT [USER@]SSH_SERVER

گزینه‌های استفاده شده به شرح زیر است:
    • [LOCAL_IP:] LOCAL_PORT: IP و شماره پورت دستگاه محلی. هنگامی‌که LOCAL_IP حذف شود، کلاینت ssh به localhost متصل می‌شود.
    • [USER @] SERVER_IP: آدرس IPکاربر SSH ریموت و سرور
نمونه بارز فوروارد کردن پورت بصورت پویا، تونل انتقال داده مرورگر وب از طریق یک سرور SSH است.
دستور زیر یک تونل SOCKS در پورت 9090 ایجاد می‌کند:

ssh -D 9090 -N -f user@remote.host

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

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

نحوه راه اندازی تونل ارتباطی SSH در ویندوز

کاربران ویندوز می‌توانند با استفاده از کلاینت PuTTY SSH تونل‌های SSH را ایجاد کنند. شما می‌توانید PuTTY را از اینجا دانلود کنید.
1. Putty را راه اندازی کرده و آدرس IP سرور SSH را در قسمت Host name (or IP address) وارد کنید.


2. در زیر منوی Connection، زیرعنوان SSH را باز کرده و Tunnels را انتخاب کنید. دکمه Local را برای تنظیم محلی، Remote را برای تنظیم ریموت و Dynamic را برای فوروارد کردن پویای پورت بررسی کنید.
    • در صورت تنظیم فوروارد کردن بصورت محلی، در قسمت Source Port، پورت فوروارد شده محلی را وارد نمایید و درفیلد Destination، هاست و IP مقصد را وارد کنید، به عنوان مثال localhost:5901.
    • برای فوروارد کردن پورت بصورت ریموت، پورت فوروارد شده سرور SSH را در فیلد Source Port وارد کرده و در بخش Destination هاست و IP مقصد را وارد کنید، برای مثال، localhost:3000.
    • در صورت تنظیم اتصال پویا، فقط پورت SOCKS محلی را در قسمت Source Port وارد کنید.


3. مطابق تصویر زیر بر روی دکمه Add کلیک کنید


4. به صفحه Session برگردید و تنظیمات را ذخیره کنید تا دیگر نیازی به وارد کردن آنها نداشته باشید. نام نشست را در قسمت  Saved Session وارد کرده و بر روی دکمه Save کلیک نمایید.


5. نشست ذخیره شده را انتخاب کرده و با کلیک روی دکمه Open به سرور ریموت وارد شوید.


یک پنجره جدید که از شما نام کاربری و رمز عبورتان را درخواست می‌کند نشان داده می‌شود. پس از وارد کردن نام کاربری و رمز عبور خود به سرورتان وارد خواهید شد و تونل SSH شروع به کار خواهد کرد.
تنظیم روند احراز هویت کلید عمومی به شما این امکان را می‌دهد که بدون وارد کردن رمز عبور به سرور خود متصل شوید.

 

منبع:

How to Set up SSH Tunneling (Port Forwarding)