होस्टनाम द्वारा docker कंटेनर के लिए ssh कनेक्शन अग्रेषित करें


10

मैंने एक बहुत ही विशिष्ट स्थिति में प्रवेश किया है और हालांकि ऐसा करने के अन्य तरीके भी हैं, मैं थोड़े इस के साथ पागल हो गया हूं और इसे इस तरह से करने का एक तरीका खोजना चाहता हूं:

पृष्ठभूमि

कहो कि मेरे पास एक सर्वर है जो कई सेवाओं को अलग-थलग डॉकटर कंटेनरों में रखता है। चूंकि उन सेवाओं में से अधिकांश http हैं, मैं प्रत्येक सेवा के लिए विशिष्ट उपडोमेन को उजागर करने के लिए एक nginx प्रॉक्सी का उपयोग कर रहा हूं। उदाहरण के लिए, एक नोड सर्वर होस्ट पर 80बाध्य पोर्ट के साथ docker कंटेनर पर चल रहा है 127.0.0.1:8000। मैं nginx में एक vhost बनाऊंगा जो सभी अनुरोधों को सम्‍मिलित करता myapp.mydomain.comहै http://127.0.0.1:8000। इस तरह, डॉकटर कंटेनर को बाहर से नहीं पहुँचा जा सकता है, सिवाय इसके myapp.mydomain.com

अब मैं इस तरह से एक गोगस डॉकटर कंटेनर शुरू करना चाहता हूं gogs.mydomain.comजो गॉग्स कंटेनर की ओर इशारा करता है। इसलिए मैं इस गॉग्स कंटेनर को होस्ट पर पोर्ट पोर्ट 8000के साथ शुरू करता हूं 127.0.0.1:8001। और एक nginx साइट करने के gogs.mydomain.comलिए अनुरोध http://127.0.0.1:8001करता है और यह अच्छी तरह से काम करता है ...

हालांकि, गॉग एक git कंटेनर है, मैं भी इस तरह के माध्यम से repos का उपयोग करना चाहते हैं, git@gogs.mydomain.com:org/repoलेकिन यह वर्तमान सेटअप के साथ काम नहीं करता है। उस काम को बनाने का एक तरीका यह होगा कि 22कंटेनर के पोर्ट 0.0.0.0:8022को मेजबान के पोर्ट पर बाँध दिया जाए , और फिर git ssh url कुछ इस तरह हो सकता है git@gogs.mydomain.com:8022/repo

(यही कारण है कि काम करने के लिए प्रतीत नहीं होता है, जब मैं uri उस तरह के साथ एक मूल करने के लिए धक्का, Git उपयोगकर्ता के लिए पासवर्ड की मांग gitपर gogs.mydomain.com- के बजाय gogs.mydomain.com:8022- लेकिन यह है कि शायद कुछ मैं गलत और क्षेत्र से बाहर कर रहा हूँ इस प्रश्न के लिए है, तथापि, मैं उसके लिए भी किसी निदान की सराहना करूंगा)

मुसीबत

मेरी मुख्य चिंता यह है, कि मैं ssh पोर्ट <gogs container>:22को उसी तरह सम्‍मिलित करना चाहता हूं जैसे मैं nginx का उपयोग करके http पोर्ट को सम्‍मिलित कर रहा हूं; gogs.mydomain.comकंटेनर के बंदरगाह पर जाने के लिए किसी भी ssh कनेक्शन 22। अब मैं कंटेनर के ssh पोर्ट को होस्ट के ssh पोर्ट पर नहीं बांध सकता क्योंकि होस्ट पर पहले से ही sshd चल रहा है। इसके अलावा, इसका मतलब यह होगा कि *.mydomain.comकंटेनर के sshd में जाने के लिए कोई भी कनेक्शन ।


मैं किसी भी ssh कनेक्शन चाहते हैं:

  • mydomain.com host.mydomain.com या होस्ट पर sshd को अग्रेषित करने के लिए mydomain का IP पता
  • gogs.mydomain.comया git.mydomain.comगॉग्स कंटेनर पर sshd के लिए एक पास को स्वीकार किया जाना चाहिए
  • *.mydomain.com(जहां *ऊपर की संभावनाओं के अलावा कुछ भी नहीं है) को अस्वीकार कर दिया जाए

यदि यह http होता, तो मैं आसानी से nginx के माध्यम से वह काम कर सकता था। वहाँ एक तरीका है कि ssh के लिए है?


(इसके अलावा एक अंग पर बाहर जाना और पूछना: वहाँ एक तरीका है कि सामान्य रूप से किसी भी tcp सेवा के साथ है ?)

जिस तरह से मैं इसे यहाँ करने की कोशिश कर रहा हूँ, वह भी स्वागतयोग्य है। मुझे नहीं बताया जा रहा है जब मैं जो करने की कोशिश कर रहा हूं वह पूरी तरह से बेवकूफ है।


मेरे दिमाग में पहले से क्या है:

शायद मैं एक roवॉल्यूम के रूप में कंटेनर के साथ होस्ट पर sshd सॉकेट साझा कर सकता हूं ? इसका मतलब होगा कि कंटेनर के अंदर sshd सभी कनेक्शनों को उठा सकता है *.mydomain.com। वहाँ कंटेनर के अंदर sshd बनाने के लिए एक रास्ता हो सकता है के अलावा सभी कनेक्शन को अस्वीकारgogs.mydomain.com या git.mydomain.com? हालाँकि, होस्ट पर sshd *.mydomain.comकिसी भी तरह से सभी कनेक्शनों को उठाएगा gogs.mydomain.com; इसलिए संघर्ष होगा। मुझे नहीं पता, मैंने वास्तव में इसकी कोशिश नहीं की है। क्या मुझे इसकी कोशिश करनी चाहिए ?

जवाबों:


2

ऐसा करना "hostname द्वारा" बस ssh के दायरे के अंदर नहीं है। Ssh प्रोटोकॉल स्वयं नाम-आधारित वर्चुअल होस्टिंग का समर्थन नहीं करता है (वास्तव में HTTP यहां नियम से अपवाद है)।

प्राप्त करने के पक्ष में SSHd कभी भी यह नहीं जान सकता है कि आपने होस्टनाम को अपने क्लाइंट से कनेक्ट करने के लिए कहा है क्योंकि यह जानकारी प्रोटोकॉल के अंदर पारित नहीं हुई है।

यदि आपको इसके साथ काम करने के लिए बस कुछ क्लाइंट्स की आवश्यकता है तो आप प्रत्येक क्लाइंट को अपने सर्वर से कनेक्ट करने के लिए कॉन्फ़िगर कर सकते हैं और फिर डॉकटर कंटेनर में जा सकते हैं जैसे:

Host yourcontainer
        Hostname internal.ip.of.your.container
        ProxyCommand ssh your.docker.host nc %h %p

इस तरह से ssh प्रॉक्सी कमांड देगा, जो आपके होस्ट को ssh सेशन खोलेगा और netcatआपके कंटेनर में कनेक्शन स्थापित करने के लिए कॉल करेगा । इस तरह आपको वास्तव में बाहरी दुनिया में अपने कंटेनरों के एसटी पोर्ट को उजागर करने की आवश्यकता नहीं है।


0

हाल के ओपनएसएसएच संस्करणों में प्रोक्सीजंप निर्देश और -जे ध्वज है:

ssh -J proxyuser@jumphost user@target
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.