آموزش پورت فورواردینگ در لینوکس و ایجاد SSH Tunneling
هدف از پورت فورواردینگ در لینوکس، هدایت ترافیک مربوط یک پورت به پورت دیگر همان سیستم یا یک سیستم ریموت دیگر است که این عمل در زمینه هایی مثل دسترسی به سرویس های داخلی از خارج شبکه، توزیع بار و بهینه سازی ترافیک، دور زدن محدودیت های شبکه و … بسیار کاربردی است.
SSH Tunneling یا SSH Port Forwarding هم یکی دیگر از تکنیک های پورت فورواردینگ است که با استفاده از پروتکل SSH یک کانال امن برای هدایت ترافیک از شبکه محلی به هاست ریموت را فراهم می کند. برای ایجاد SSH Tunneling می توانید بسته به نیاز خود از سه روش محلی، ریموت و داینامیک استفاده کنید.
اگر می خواهید صاحب یک سرور لینوکس حرفه ای باشید که از انواع تکنیک هایی مثل SSH Tunneling پشتیبانی کند، می توانید از صفحه خرید سرور مجازی لینوکس دیدن کنید.
انواع پورت فورواردینگ در لینوکس
در حالت کلی ۳ نوع پورت فورواردینگ داریم:
۱. پورت فورواردینگ محلی (Local port forwarding)
پورت فورواردینگ محلی این امکان را به شما می دهد که ترافیک مربوط به یک پورت موجود در سیستم محلی را به پورت سیستم ریموت دیگر هدایت کنید.
فرض کنید یک سرور پایگاه داده ریموت وجود دارد که می خواهید با کلاینت MySQL سیستم محلی خود به آن متصل شوید. با انتقال پورت محلی می توانید بین آنها یک تونل SSH امن ایجاد کنید و بعد از وارد کردن رمز عبور، از طریق سیستم محلی خود به آن سرور متصل شوید.
از کاربردهای Local port forwarding می توان به موارد زیر اشاره کرد:
- ایجاد کانال SSH امن و رمزگذاری اتصالات بین سیستم محلی و ریموت
- دسترسی به سرویس های داخلی شبکه مثل وب سرور ها، پایگاه داده ها و … به صورت ریموت
- دسترسی به محیط های توسعه و تست از راه دور
- دور زدن محدودیت های فایروال
- پشتیبانی از ابزارهای مدیریت سیستم
- …
۲. پورت فورواردینگ از راه دور (Remote port forwarding)
انتقال پورت ریموت دقیقاً برعکس پورت فورواردینگ محلی عمل می کند و این امکان را به شما می دهد که ترافیک مربوط به پورت موجود در دستگاه ریموت را به یک پورت دستگاه محلی ارسال کنید.
فرض کنید در سیستم محلی خود در حال توسعه یک اپلیکیشن هستید و می خواهید یک پیش نمایش از آن را به همکار خود نشان دهید.
حالا اگر به یک سرور SSH ریموت دسترسی دارید، می توانید ترافیک مربوط به پورت ۸۰۸۰ آن را به پورت ۳۰۰۰ سیستم محلی خود تونل کنید تا توسعه دهنده با مراجعه به لینک the_ssh_server_ip:8080، پیش نمایش اپلیکیشن شما را ببیند.
از کاربردهای Remote port forwarding می توان به موارد زیر اشاره کرد:
- اتصال اپلیکیشن های سمت سرور به خدمات سیستم محلی با تونل SSH
- ایجاد دسترسی به سرویس های داخلی
- تست و اشکال زدایی اپلیکیشن های تحت وب توسط تیم به صورت ریموت
- دسترسی به دسکتاپ محلی به صورت ریموت
- …
۳. پورت فورواردینگ پویا (Dynamic Port Forwarding)
انتقال پورت داینامیک سبک کار متفاوتی دارد و به جای اینکه درگیر شماره پورت از پیش تعریف شده برای سیستم محلی و ریموت باشید، یک سوکت در دستگاه محلی ایجاد می کنید تا به عنوان سرور پراکسی SOCKS عمل کند.
به این ترتیب، ترافیک تمام برنامه هایی که برای استفاده از این پراکسی پیکربندی شده اند، از طریق یک پورت مشخص به یک یا چند مقصد هدایت می شوند.
فرض کنید میخواهید ترافیک مرورگر وب خود را از طریق یک سرور SSH هدایت کنید و از آن به عنوان واسط اتصال اینترنتی استفاده کنید. برای این کار میتوانید یک پروکسی SOCKS روی سیستم محلی خود ایجاد کنید و مرورگر را به گونهای تنظیم کنید که از این پروکسی استفاده کند و از طریق آن به میزبان ریموت متصل شود.
از کاربردهای Dynamic Port Forwarding می توان به موارد زیر اشاره کرد:
- دور زدن فیلترینگ و محدودیت های شبکه
- دسترسی به منابع داخلی شبکه
- دسترسی به محیط های DevOps توسط تیم توسعه
- استفاده از ابزارهای مختلف از طریق یک کانال امن
- تست و ارزیابی دسترسی به وب سایت ها و سرویس های مختلف
- …
ارتباط بین پورت فورواردینگ و SSH Tunneling
SSH Tunneling و پورت فورواردینگ در واقع دو مفهوم مرتبط هستند که ارتباط نزدیکی هم با همدیگر دارند. در اصل، SSH Tunneling که با اسم SSH Port Forwarding هم شناخته می شود، قابلیتی است که توسط SSH ارائه می شود و این امکان را به شما می دهد که ترافیک شبکه محلی را به صورت امن از طریق یک اتصال SSH رمزگذاری شده هدایت کنید.
به عبارت دیگر، هنگامی که شما از پورت فورواردینگ استفاده می کنید، در واقع یک تونل SSH برای هدایت ترافیک از طریق یک اتصال SSH ایجاد می کنید. این تونل به شما امکان می دهد تا ترافیک شبکه خود را از طریق یک کانال امن عبور دهید و به مقاصد مختلف دسترسی پیدا کنید.
پیش نیازهای ایجاد SSH Tunneling در لینوکس
- سیستم یا سرور لینوکس
- راه اندازی و فعال سازی SSH
- یک کاربر با امتیازات مدیریتی و دسترسی SSH
- نصب OpenSSH
Debian/Ubuntu
sudo apt update
sudo apt install openssh-client openssh-server
CentOS/RHEL/Fedora
sudo yum install openssh-clients openssh-server
یا
sudo dnf install openssh-clients openssh-server
ArchLinux
sudo pacman -S openssh
* در صورت تمایل می توانید از کلاینت گرافیکی PuTTy هم استفاده کنید.
- پیکربندی فایروال برای تایید ترافیک SSH
sudo ufw allow 22/tcp
sudo ufw reload
ایجاد SSH Tunneling در لینوکس به شکل محلی، ریموت و داینامیک
حالا که از پیش نیازهای راه اندازی تونل SSH مطمئن هستید، وقت آن است که نحوه ایجاد SSH Tunneling را امتحان کنید:
نحوه ایجاد Local SSH Port Forwarding
فرض کنید که به خاطر محدودیت های فایروال یا هر دلیل دیگر، نمی توانید به اپلیکیشنی که روی پورت ۳۰۰۰ سرور ریموت اجرا می شود، دسترسی داشته باشید.
شما می توانید از طریق پورت مثلاً ۸۰۸۰ سیستم محلی خود به این اپلیکیشن دسترسی پیدا کنید، منتها به شرطی که تونل SSH بین این دو پورت را ایجاد کرده باشید.
برای این کار باید دستور زیر را اجرا کنید:
ssh [email protected] -L 8080:server1.example.com:3000
[email protected] نشاندهنده نام کاربری (admin) و آدرس دستگاه ریموت (server1.example.com ) است.
آپشن L پورت فورارد شده محلی به هاست و پورت سرور ریموت را تعریف می کند که نشانه Local بودن پورت فورواردینگ است.
8080 پورت موردنظر از سیستم محلی شماست.
server1.example.com آدرس سرور ریموت مقصد است.
3000 هم پورت موردنظر از سرور مقصد است که قصد دارید ترافیک پورت 8080 سیستم محلی را به سمت آن هدایت کنید.
اکنون شما می توانید مرورگر خود را باز کنید و به جای وارد کردن آدرس server1.example.com:3000 برای دسترسی به آن اپلیکیشن، از آدرس های زیر استفاده کنید:
localhost:8080
یا
IP-Address:8080
به این ترتیب، ترافیک مرورگر شما از طریق تونل SSH به پورت ۳۰۰۰ سرور ریموت هدایت می شود و شما می توانید به اپلیکیشن دسترسی پیدا کنید.
نحوه ایجاد Remote SSH Tunneling
در حالت پیش فرض، SSH اجازه پورت فورواردینگ به صورت ریموت را نمی دهد و برای اینکه بتوانید این محدودیت را کنار بگذارید، ابتدا باید این قابلیت را در فایل پیکربندی etc/ssh/sshd_config/ فعال کنید.
- برای این کار می توانید از دستورالعمل GatewayPorts کمک بگیرید.
- پس ابتدا این فایل پیکربندی را با ویرایشگر دلخواه خود باز کنید:
sudo vim /etc/ssh/sshd_config
- برای اینکه در حالت درج قرار بگیرید، حرف i را وارد کنید.
- سپس به دنبال خط GatewayPorts بگردید و مقدار yes را برای آن لحاظ کنید.
بعد از اینکه کارتان تمام شد، ابتدا باید فشردن کلید Esc از حالت درج خارج شوید و در حالت خط فرمان قرار بگیرید. بعد عبارت ترکیبی زیر را وارد کنید و اینتر را بزنید تا این تغییرات ذخیره شده و فایل بسته شود.
:wq!
- سرویس sshd را ریستارت کنید تا تغییرات اعمال شود.
sudo systemctl restart sshd
یا
sudo service sshd restart
فرض کنید این بار می خواهید اپلیکیشنی که در پورت ۳۰۰۰ سیستم محلی شما در حال اجرا است را در اختیار همکار خود قرار دهید. برای این کار باید بین پورت ۵۰۰۰ دستگاه ریموت همکار خود و پورت ۳۰۰۰ سیستم خود یک تونل SSH از نوع ریموت ایجاد کنید تا ترافیک پورت ۵۰۰۰ دستگاه ریموت به پورت ۳۰۰۰ سیستم شما هدایت شود.
- دستور زیر را اجرا کنید:
ssh [email protected] -R 5000:localhost:3000
[email protected] نشاندهنده نام کاربری (admin) و آدرس دستگاه ریموت (server1.example.com ) است.
آپشن R پورت فورارد شده دستگاه ریموت به پورت سیستم محلی را تعریف می کند که نشانه Remote بودن پورت فورواردینگ است.
5000 پورت موردنظر از سیستم ریموت است.
localhost آدرس سیستم محلی است.
3000 هم پورت موردنظر از سیستم محلی است که قصد دارید ترافیک پورت 5000 سیستم ریموت را به سمت آن هدایت کنید.
حالا کاربر دستگاه ریموت با مراجعه به آدرس http://server1.example.com:5000 به پورت ۳۰۰۰ سیستم محلی شما هدایت می شود و اپلیکیشن شما را می بیند.
نحوه ایجاد SSH پورت فورواردینگ به صورت داینامیک
برای استفاده از این روش پورت فورواردینگ، ابتدا باید پروتکل اینترنتی SOCKS را که برای تعریف نحوه اتصال یک کلاینت به سرور است را راه اندازی کنید.
فرض کنید می خواهید ترافیک مرورگر خود را از طریق سرور https://server1.example.com به اینترنت هدایت کنید.
ابتدا با دستور زیر یک پراکسی SOCKS را در پورت مثلاً 1080 راه اندازی کنید و تونل SSH را ایجاد کنید:
ssh -f -N -D 1080 [email protected]
آپشن f به SSH می گوید که در پس زمینه و بی صدا اجرا شود.
آپشن N به SSH می گوید که صرفاً فقط تونل ایجاد کند و هیچ دستور دیگری اجرا نشود.
آپشن D هم پورت محلی که به عنوان پراکسی SOCKS در نظر گرفته اید را مشخص می کند.
[email protected] نشاندهنده نام کاربری (admin) و آدرس دستگاه ریموت (server1.example.com ) است.
در قسمت تنظیمات پراکسی مرورگر خود، پروکسی SOCKS را به localhost و پورت 1080 پیکربندی کنید.
حالا ترافیک مرورگر شما از طریق سرور server1.example.com به اینترنت هدایت می شود و می توانید به طور امن و خصوصی از اینترنت استفاده کنید.
سخن آخر
پورت فورواردینگ در لینوکس کاربردهای زیادی دارد و با ایجاد انواع SSH Tunneling می توانید از عهده دسترسی به انواع سرویس های داخلی – خارجی، از بین بردن محدودیت های فایروال و بهبود امنیت شبکه خود بربیایید. اگر کاربر ویندوز هستید، آموزش پورت فورواردینگ در ویندوز هم می تواند برای شما بسیار مفید واقع شود.