اگر در خانه سرور لینوکسی دارید، معمولا پشت یک مسیریاب NAT یا یک دیوار آتش محدود است. حال اگر میخواهید از طریق SSH به سرور خانگی خود متصل شوید، درحالیکه از خانه دور هستید. چگونه باید آن را تنظیم کنید؟ Port Forward کردن برای اتصال SSH معمولا یکی از گزینههای رایج است. یا ابن حال ممکن است به ترفندهای خاصی احتیاج داشته باشید مانند زمانی که در شرایط پیچیدهتری قرار داشته باشید. یا ISP شما پورت موردنظر شما را مسدود کرده باشد. در این موارد راه حل دومی وجود دارد. تونل SSH معکوس.
تونل SSH معکوس چیست؟
یکی از گزینههای جایگزین برای Port Forwarding، تونل SSH معکوس است. این روش بسیار روش سادهای محسوب میشود. به این شکل که ابتدا به یک میزبان Relay نیاز دارید، که در خارج از محدوده خانه شما باشد تا بتوانید از آن جا که هستید به آن متصل شوید. سپس میتوانید میزبان Relay را با یک Public VPS بهجای IP تنظیم کنید.
توسط این روش شما تونلی مداوم بین سرور خانگی و میزبان Relay ایجاد کردهاید، با این روش شما میتوانید به سرور خانگی محدود خود توسط Relay Host متصل شوید. (به همین خاطر هم هست که نام آن را تونل معکوس گذاشتهاند!)
این روش شما بهصورت دائم، اگر سرور قابلدسترسی بود، به سرور خانگی خود متصل هستید؛ هر چقدر هم که سرور خانگی شما با دیوار آتش محدود شده باشد.
تنظیم تونل SSH معکوس در لینوکس
اجازه دهید تا به نحوه ایجاد و تنظیم تونل SSH معکوس در لینوکس بپردازیم. به فرضیات را در ادامه اشاره خواهیم کرد. ما می خواهیم سرور خانگی را به یک Relay Server متصل کنیم، پس میتوانیم با استفاده از relayserver به homeserver متصل شویم. این اتصال از طریق کامپیوتر دیگری توسط SSH بانام clientcomputer انجام میشود.
در سرور خانگی، Terminal را باز کنید و دستورات زیر را اجرا نمایید:
homeserver~$ ssh -fN -R 10022:localhost:22 [email protected]
در این جا پرت شماره 10022 استفاده شده است پس دقت کنید در سرور Relay از این پرت برنامه دیگری استفاده نمیکند. معمولا 10022 پرتی بیاستفاده است که گزینه خوبی محسوب میشود. بخش -R 10022:localhost:22 مربوط به Reverse کردن است، که پرت 22 سرور خانگی را به 1022 در Relay Server فروارد میکند.
-fN در SSH زمانی بهکار میرود که باید دستوری را در پسزمینه اجرا کرد. مثلا دستوری را اجرا میکنیم و نیازی به نوشتن دستوری نداریم مانند ما که فقط میخواهیم یک تونل بزنیم!
بعد از اجرای دستورات بالا میتوانید به خط فرمان سرور خانگی برگردید. به سرور Relay متصل شوید که آدرس آن 127.0.0.1:10022 است.
sudo netstat -nap | grep 10022
اگر خروجی مانند زیر بود همهچیز به خوبی پیش رفته است.
tcp 0 0 127.0.0.1:10022 0.0.0.0:* LISTEN 8493/sshd
سپس وارد کامپیوتر Client شده و دستورات زیر را جهت ورود تایپ کنید:
ssh -p 10022 homeserver_user@localhost
نکته: در دستور قبل حتما باید از نام کاربر و گذرواژه خود در سرور خانگی بهره بگیرید نه از Relay Server، پس در این مورد دقت کنید بعد از اینکه با موفقیت به سرور خانگی متصل شدید کار شما تمام نشده است.
زمانی که دستور بالا اجازه دسترسی به سرور خانگی را از پشت شبکه NAT به شما داد. شما باید دو بار وارد شوید! اولین بار به Relay Server و دومین بار به homeserver. به این دلیل که نقطه پایانی Relay Server به Loopback یا همان 127.0.0.1 متصل است.
اتصال مستقیم به سرور خانگی:
اما در حقیقت میتوانید با یکبار دسترسی و Login به Relay Server به سرور خانگی متصل شوید به این صورت که اجازه دهید SSHD پورت را فوروارد کند نه تنها از loopback همچنین در سرور خارجی. این کار با تعیین GatewayPorts در تنظیمات SSHD انجامپذیر است.
در /etc/ssh/sshd_conf دخل Relay Server خط زیر را اضافه کنید:
relayserver~$ vi /etc/ssh/sshd_conf
GatewayPorts clientspecified
sshd را Restart کنید.
sudo systemctl restart sshd
یا روش دیگر در دبیان قدیمی یا اوبونتو 14.04:
relayserver~$ sudo /etc/init.d/ssh restart
حال تونل معکوس را در homeserver آغاز کنید:
homeserver~$ ssh -fN -R 1.1.1.1:10022:localhost:22 [email protected]
به Relay Server وارد شوید و مطمئن شوید که تونل SSH معکوس بهدرستی تنظیمشده است.
relayserver~$ sudo netstat -nap | grep 10022
خروجی مورد انتظار:
tcp 0 0 1.1.1.1:10022 0.0.0.0:* LISTEN 1538/sshd: dev
برخلاف گذشته دیگر End Point ما 1.1.1.1:10022 است و نه 127.0.0.1:10022 که یعنی میتوان به SSH از میزبان خارجی متصل شد. حالا از یک کامپیوتر خارجی مثلا همان clientcomputer به سرور متصل شوید:
clientcomputer~$ ssh -p 10022 [email protected]
در دستور بالا 1.1.1.1 همان IP عمومی سرور Relay است که به آن دسترسی مییابیم. و homeserver_user هم همان نام کاربری در homeserver است.
ایجاد اتصال ماندگار و پایا:
حال که آموختیم چگونه یک تونل معکوس SSH داشته باشیم حال بیاییم آن را پایاتر کنیم. بنابراین تونل برای همیشه در حال اجرا است. در هر حال براحتی قادر خواهید بود به سرور خانگی متصل شوید حتی اگر سیستم ریبوت شود یا اتفاق دیگری رخ دهد.
برای تونل پایا قرار است از autossh استفاده کنیم. همانطور که از نامش معلوم است این ابزار به شما اجازه میدهد که بهصورت خودکار به SSH را Stsrt کنید. یا زمانی که SSH متوقف شد دوباره آن را اجرا کند پس شما یک SSH همیشه در حال اجرا خواهید داشت.
ابتدا SSH را بهصورت اتصال بدون پسورد تنظیم کنید. بهصورتی که بدون نیاز به پسورد متصل شود. سپس دستورات زیر را در سرور خانگی اجرا کنید:
homeserver~$ autossh -M 10900 -fN -o “PubkeyAuthentication=yes” -o “StrictHostKeyChecking=false” -o “PasswordAuthentication=no” -o “ServerAliveInterval 60” -o “ServerAliveCountMax 3” -R 1.1.1.1:10022:localhost:22 [email protected]
-M 10900 نیز همان شمارهی پرت است که باید در Relay Server توسط هیچ برنامهای بهکار نرفته باشد. -fN هم که مانند قبل باعث میشود SSH همیشه در پسزمینه باشد.
-o XXXX برای تأیید هویت بهکار میرود که باید کلید هویتی خود را وارد کنید و برای اجرای Auto SSH برای همیشه آن را در /etc/rc.local قرار دهید.
نتیجهگیری:
در این مقاله به بررسی روش استفاده از تونل معکوس برای دسترسی به سرور خانگی پرداختیم که پشت یک شبکه NAT و یک دیوار آتش محدود شده قرار دارد. همچنین قابل ذکر است که این روش برای یک سرور خانگی و توسط Public VPS است و هیچگونه امنیت بالایی را تضمین نمیکند. توصیه میشود برای کارهای تجاری و جدیتر از روشهای امنتری استفاده نمایید.
منبع: salam-donya