सारांश अवलोकन

  • SSH टनल ऐसी तकनीक है जो उन सेवाओं तक सुरक्षित पहुँच देती है जिन तक बाहर से सीधे पहुँचना संभव नहीं होता, या आंतरिक सेवाओं को अस्थायी रूप से बाहर उपलब्ध कराती है।
  • SSH पोर्ट फ़ॉरवर्डिंग को मुख्य रूप से लोकल फ़ॉरवर्डिंग, रिमोट फ़ॉरवर्डिंग, डायनेमिक लोकल फ़ॉरवर्डिंग, डायनेमिक रिमोट फ़ॉरवर्डिंग में बाँटा जाता है।
  • -L में लोकल SSH client पोर्ट खोलता है, और -R में रिमोट SSH server पोर्ट खोलता है।
  • Bastion Host का उपयोग करने पर सिर्फ SSH server ही नहीं, बल्कि उस server की पहुँच में आने वाली दूसरी private network सेवाओं से भी कनेक्ट किया जा सकता है।
  • डायनेमिक फ़ॉरवर्डिंग किसी एक निश्चित destination को तय नहीं करती, बल्कि SOCKS proxy बनाकर कई host और port तक पहुँच देती है।
  • रिमोट फ़ॉरवर्डिंग को external network पर publish करने के लिए SSH server की GatewayPorts setting की जाँच करनी चाहिए।

परिचय

SSH टनल का उद्देश्य

  • SSH सिर्फ remote command execution के लिए नहीं, बल्कि network traffic को encrypt करके भेजने वाली tunnel capability भी देता है।

  • अलग VPN या dedicated proxy program के बिना, सिर्फ standard SSH command से private network access और service exposure संभव है।

  • इसके कुछ प्रमुख उपयोग इस प्रकार हैं।

    • public server के जरिए internal VPC service तक पहुँचना
    • remote development server के local port को उपयोगकर्ता के PC के browser में खोलना
    • घर या private network की सेवाओं को अस्थायी रूप से बाहर उपलब्ध कराना
    • local browser के debugging port को remote development agent से जोड़ना
  • SSH टनल को समझते समय इन दो बातों को अलग-अलग देखना ज़रूरी है।

    • कौन-सी machine नया port खोलकर listen कर रही है
    • tunnel से गुज़रा traffic किस machine के नज़रिए से destination तक पहुँच रहा है

मुख्य भाग

लोकल फ़ॉरवर्डिंग रिमोट सेवा को लोकल से जोड़ती है

  • लोकल पोर्ट फ़ॉरवर्डिंग वह तरीका है जिसमें remote server या remote server की पहुँच में मौजूद सेवा को उपयोगकर्ता के PC के local port से जोड़ा जाता है।
  • इसकी बुनियादी command structure इस प्रकार है।
ssh -L [local_addr:]local_port:remote_addr:remote_port [user@]sshd_addr  
  • SSH client उपयोगकर्ता के PC के local_port पर connection का इंतज़ार करता है।

  • उस port पर आने वाला traffic SSH tunnel से होकर remote_addr:remote_port तक भेजा जाता है।

  • अंतिम destination तक connection SSH server वाले network के नज़रिए से होता है।

  • इसके प्रमुख उपयोग इस प्रकार हैं।

    • remote MySQL, PostgreSQL, Redis access
    • सिर्फ private network में खुलने वाले web application तक पहुँचना
    • server के external interface पर publish न किए गए container port तक पहुँचना

Bastion Host private network access को relay करता है

  • remote_addr और SSH connection का target sshd_addr एक ही machine होना ज़रूरी नहीं है।

  • अगर SSH server दूसरी internal services तक पहुँच सकता है, तो उस server को relay point की तरह इस्तेमाल किया जा सकता है।

  • ऐसे relay server को Bastion Host या Jump Host कहा जाता है।

  • सामान्य connection structure इस प्रकार है।

    • उपयोगकर्ता के PC से public Bastion Host पर SSH connection
    • Bastion Host की पहुँच में आने वाली VPC की internal service तक traffic forwarding
  • इससे उन database, search cluster, internal API आदि तक पहुँचा जा सकता है जो बाहर से public नहीं हैं।

रिमोट फ़ॉरवर्डिंग लोकल सेवा को रिमोट पर publish करती है

  • रिमोट पोर्ट फ़ॉरवर्डिंग वह तरीका है जिसमें उपयोगकर्ता के PC या internal network की सेवा को बाहरी SSH server के port से जोड़ा जाता है।
  • इसकी बुनियादी command structure इस प्रकार है।
ssh -R [remote_addr:]remote_port:local_addr:local_port [user@]gateway_addr  
  • remote SSH server remote_port खोलता है और connection का इंतज़ार करता है।

  • उस port पर आने वाला traffic SSH tunnel के जरिए SSH client की तरफ के local_addr:local_port तक भेजा जाता है।

  • इसके प्रमुख उपयोग इस प्रकार हैं।

    • laptop पर चल रहे development server को external demo के लिए publish करना
    • homelab service को internet से accessible बनाना
    • local browser के debugging port को remote development environment में उपलब्ध कराना

बाहरी publish के लिए GatewayPorts setting ज़रूरी है

  • default setting में रिमोट फ़ॉरवर्डिंग port सिर्फ SSH server के localhost पर bind हो सकता है।
  • इस स्थिति में उस service तक remote server के अंदर से पहुँचा जा सकता है, लेकिन बाहर से नहीं।
  • अगर आप remote server के public IP से access देना चाहते हैं, तो sshd_config में यह setting देखनी चाहिए।
GatewayPorts yes  
  • यह setting port को external interface पर expose कर सकती है, इसलिए firewall और access control साथ में लागू करना चाहिए।
  • development service को सीधे public internet पर expose करने से unauthenticated access या attack की संभावना बढ़ सकती है।

लोकल machine private network की Jump Host बन सकती है

  • रिमोट फ़ॉरवर्डिंग का destination सिर्फ उसी machine तक सीमित नहीं है जिस पर SSH client चल रहा हो।

  • अगर उपयोगकर्ता का PC home network के किसी दूसरे server तक पहुँच सकता है, तो उस internal server के port को भी remote SSH server के जरिए publish किया जा सकता है।

  • इस स्थिति में उपयोगकर्ता का PC नीचे दिए गए दो network के बीच relay machine बन जाता है।

    • home network या private development network
    • public SSH gateway server
  • इससे ऐसे home server या internal development server की सेवाओं तक बाहर से पहुँचा जा सकता है जो सीधे internet से जुड़े नहीं हैं।

डायनेमिक लोकल फ़ॉरवर्डिंग लोकल SOCKS proxy बनाती है

  • सामान्य लोकल फ़ॉरवर्डिंग में एक local port एक ही destination से fixed रहता है।
  • डायनेमिक लोकल फ़ॉरवर्डिंग SSH client पर SOCKS proxy बनाती है।
  • इसकी बुनियादी command structure इस प्रकार है।
ssh -D [local_addr:]local_port [user@]sshd_addr  
  • उपयोगकर्ता के PC के तय port पर SOCKS proxy चलती है।

  • SOCKS support करने वाले application हर connection के लिए अलग destination address और port दे सकते हैं।

  • वास्तविक destination connection remote SSH server वाले network के नज़रिए से होता है।

  • एक ही SSH connection से remote private network की कई services तक पहुँचना, fixed लोकल फ़ॉरवर्डिंग से इसका मुख्य अंतर है।

  • इसके प्रमुख उपयोग इस प्रकार हैं।

    • Bastion Host के जरिए कई internal API call
    • private network के अंदर web application को explore करना
    • एक EC2 instance के जरिए कई VPC endpoint तक पहुँचना

डायनेमिक रिमोट फ़ॉरवर्डिंग रिमोट SOCKS proxy बनाती है

  • -R option में fixed destination को छोड़ देने पर remote SSH server पर SOCKS proxy बनाई जा सकती है।
  • इसकी बुनियादी command structure इस प्रकार है।
ssh -R [bind_address:]port [user@]gateway_addr  
  • remote gateway server तय किए गए port पर SOCKS connection का इंतज़ार करता है।
  • proxy में आने वाले request SSH tunnel के जरिए client side तक भेजे जाते हैं।
  • अंतिम destination तक connection SSH client वाले network के नज़रिए से होता है।
  • इससे remote server से उपयोगकर्ता के PC की पहुँच में आने वाले पूरे home network या private network तक पहुँचा जा सकता है।
  • डायनेमिक रिमोट फ़ॉरवर्डिंग के लिए client पर OpenSSH 7.6 या उससे ऊपर का version चाहिए।
  • remote SOCKS proxy को external interface पर publish करने के लिए सामान्य रिमोट फ़ॉरवर्डिंग की तरह GatewayPorts setting की ज़रूरत होती है।

बैकग्राउंड execution option सिर्फ tunnel को बनाए रखता है

  • SSH connection के बाद कोई command चलाए बिना सिर्फ port forwarding बनाए रखने के लिए -N option का उपयोग करें।
  • tunnel को background में भेजने के लिए -f option साथ में इस्तेमाल किया जा सकता है।
  • प्रकार के अनुसार उदाहरण इस प्रकार हैं।
ssh -f -N -L ...  
ssh -f -N -R ...  
ssh -f -N -D ...  
  • automation या लंबे समय तक चलने वाले environment में tunnel shutdown, reconnect और failure detection की व्यवस्था अलग से करनी चाहिए।

command को port खुलने की जगह से अलग करें

  • ssh -L में लोकल SSH client नया port खोलता है।
  • ssh -R में remote SSH server नया port खोलता है।
  • ssh -D लोकल SSH client पर SOCKS proxy बनाता है।
  • destination के बिना ssh -R remote SSH server पर SOCKS proxy बनाता है।
  • command याद रखने का बुनियादी नियम इस प्रकार है।
-L = local:remote  
-R = remote:local  
  • colon के बाईं तरफ दिया गया address और port वही नया listening point होता है जो खुलता है।
  • local का मतलब SSH client खुद भी हो सकता है, या वह internal machine भी जिसे client access कर सकता है।
  • remote का मतलब SSH server खुद भी हो सकता है, या वह दूसरी internal machine भी जिसे server access कर सकता है।

निष्कर्ष

SSH टनल को access direction के आधार पर चुनें

  • अगर remote service को अपने PC पर इस्तेमाल करना है, तो लोकल फ़ॉरवर्डिंग -L का उपयोग करें।

  • अगर अपने PC या internal service को remote server की तरफ publish करना है, तो रिमोट फ़ॉरवर्डिंग -R का उपयोग करें।

  • अगर remote network में कई destination तक लचीले ढंग से पहुँचना है, तो डायनेमिक लोकल फ़ॉरवर्डिंग -D का उपयोग करें।

  • अगर client-side पूरे network को remote gateway से लचीले ढंग से accessible बनाना है, तो destination छोड़े हुए डायनेमिक रिमोट फ़ॉरवर्डिंग -R का उपयोग करें।

  • SSH टनल design करते समय पहले इन बातों की जाँच करें।

    • नया port कहाँ खोलना है
    • कौन-सी machine अंतिम destination तक पहुँच सकती है
    • GatewayPorts, firewall, SSH access permission settings
    • बाहरी publish से पैदा होने वाले security risk
  • सबसे महत्वपूर्ण निर्णय मानदंड यह है कि service किस तरफ दिखनी चाहिए और कौन-सी machine वास्तव में destination तक पहुँच सकती है

अभी कोई टिप्पणी नहीं है.

अभी कोई टिप्पणी नहीं है.