نحوه ایجاد SSH Tunnel یا Port Forward در لینوکس
SSH Tunnel (همچنین به عنوان SSH port forwarding هم شناخته میشود) در حقیقت مسیردهی آسان ترافیک شبکه local از طریق SSH به هاست های ریموت میباشد.
با این روش تمام کانکشن های شما با استفاده از encryption امن هستند.
این شیوه راه آسانی برای تعریف یک VPN (مخفف Virtual Private Network) فراهم میآورد، که برای ارتباط به شبکه های private از بستر شبکه های public غیر امن مانند اینترنت میباشد.
شما ممکن است همچنین سرورهای local ی که پشت NAT و Firewall قرار دارند را از بستر تانل های امن دسترسی دهید،
همانطور که در ngrok پیاده سازی شده است. مقاله ngrok چیست می تواند مفید باشد
به طور پیش فرض session های SSH برقراری تانل برای ارتباطات شبکه را مجاز میداند و همچنین سه نوع SSH port forwarding وجود دارد :
- Local
- Dynamic
- Remote
این مثال را با توجه به مقادیر پیش فرض زیر ادامه می دهیم.
هاست لوکال : 192.168.43.31
هاست ریموت : server1.example.com
معمولا، شما میتوانید به طور امن به یک سرور ریموت با استفاده از SSH همانند مثال زیر متصل شوید. من لاگین ssh بدون پسورد را بین هاست های remote و local را کانفیگ کرده ام در نتیجه از من درخواست پسورد نمیشود.
$ ssh [email protected]
Local SSH Port Forwarding
این نوع از port forwarding به شما اجازه میدهد از کامپیوتر لوکال تان به سرور ریموت متصل شوید.
فرض میکنیم که شما پشت یک فایروال محدود هستید یا توسط یک فایروال خروجی از دسترسی به یک اپلیکیشن در حال اجرا روی پورت 3000 روی سرور ریموت تان block شده اید.
شما میتوانید یک پورت local را فوروارد کنید (به طور مثال 8080) که میتوانید از آن برای دسترسی به اپلیکیشن به صورت local استفاده کنید.
آپشن -L برای تعریف پورت فوروارد شده به هاست ریموت و remote port میباشد.
$ ssh [email protected] -L 8080: server1.example.com:3000
اضافه کردن آپشن -N به معنای اجرا نکردن یک دستور remote است که در این شرایط شما shell ی دریافت نخواهید کرد.
$ ssh -N [email protected] -L 8080: server1.example.com:3000
آپشن -f دستور ssh را در محیط background اجرا میکند.
$ ssh -f -N [email protected] -L 8080: server1.example.com:3000
اکنون روی ماشین لوکال تان یک مرورگر باز کنید
به جای دسترسی به اپلیکیشن ریموت به جای استفاده از آدرس server1.example.com:3000 شما میتوانید به آسانی از localhost:8080 یا192.168.43.31:8080 همانند تصویر زیر استفاده کنید.
Remote SSH Port Forwarding
Remote SSH Port Forwarding به شما این امکان را میدهد که از ماشین ریموت خود به کامپیوتر لوکال تان متصل شوید. به صورت پیش فرض ssh اجازه remote port forwarding را نمیدهد
شما میتوانید آنرا با استفاده از بخش GatewayPorts در تنظیمات اصلی sshd واقع در فایل کانفیگ /etc/ssh/sshd_config روی هاست ریموت خود فعال کنید.
فایل را باز کنید و آنرا با استفاده از ویرایشگر متنی مورد علاقه خود ویرایش کنید.
$ sudo vim /etc/ssh/sshd_config
به دنبال بخش مورد نظر بگردید و آنرا از کامنت خارج کنید و مقدار آنرا همانند زیر برابر با yes قرار دهید.
GatewayPorts yes
تغییرات را ذخیره کنید و از آن خارج شوید. سپس به منظور اعمال تغییرات شما نیاز دارید که سرویس sshd را ریستارت کنید.
$ sudo systemctl restart sshd
or
$ sudo service sshd restart
سپس دستور زیر را برای فوروارد کردن پورت 5000 روی ماشین ریموت به پورت 3000 روی ماشین لوکال اجرا کنید.
$ ssh -f -N [email protected] -R 5000:localhost:3000
به محض اینکه شما این روش از tunneling را درک کنید شما میتوانید به آسانی و به شیوه ای امن یک سرور برنامه نویسی لوکال را پابلیش کنید مخصوصا اگر پشت NAT و Firewall باشد.
تانل های همانند Ngrok, pagekite, localtunnel و متدهای بیشمار دیگر همه به شیوه ای مشابه کار میکنند.
Dynamic SSH Port Forwarding
این سومین روش از port forwarding میباشد.
برخلاف port forward لوکال و ریموت که ارتباط با یک پورت مجزا را امکان پذیر میکردند این روش یک رنج کاملی از ارتباطات TCP را از طریق یک رنجی از پورت ها ممکن میسازد.
روش Dynamic Port Forwarding ماشین شما را به عنوان یک SOCKS proxy server که به صورت پیش فرض روی پورت 1080 در حال listen میباشد، تنظیم و تعریف میکند.
برای مبتدیان باید بگوییم که SOCKS یک پروتکل اینترنت است که نحوه اتصال یک کلاینت به یک سرور را از طریق یک سرور پراکسی (در اینجا SSH میباشد) تعریف میکند.
شما میتوانید Dynamic Port Forwarding را با آپشن -D فعال کنید.
دستور زیر یک پراکسی SOCKS را روی پورت 1080 آغاز میکند که به شما امکان اتصال به هاست ریموت را میدهد.
$ ssh -f -N -D 1080 [email protected]
از این به بعد شما میتوانید کاری کنید که اپلیکیشن های روی ماشین تان از این سرور SSH Proxy استفاده کنند،
تنها کافیست تنظیمات و کانفیگ آنها را طوری انجام دهید که از این سرور استفاده کنند.
دقت کنید که Socks Proxy بعد از اینکه session ssh بسته شود کار خود را متوقف خواهد کرد.
خلاصه
در این پست ما انواع گوناگون port forwarding از یک ماشین به ماشین دیگر را و برای tunneling ترافیک از طریق کانکشن امن SSH توضیح دادیم.
این یکی از استفاده های بیشمار از SSH است. شما نیز میتوانید نظرات خود را در این پست ارسال کنید.
نکته : port forwarding ssh معایب قابل ملاحظه ای دارد، این دستور میتواند آثار سوءی داشته باشد، میتواند برای bypass کردن مانیتورینگ شبکه و برنامه های فیلترینگ ترافیک (یا فایروال) مورد استفاده قرار گیرد.
هکرها میتوانند از آن برای فعالیت های مخرب خود استفاده کنند.