ส่งต่อการเชื่อมต่อ ssh ไปยังคอนเทนเนอร์นักเทียบท่าตามชื่อโฮสต์


10

ฉันเข้าสู่สถานการณ์ที่เฉพาะเจาะจงมากและแม้ว่าจะมีวิธีอื่นในการทำเช่นนี้ฉันก็รู้สึกหมกมุ่นอยู่กับสิ่งนี้และต้องการหาวิธีที่จะทำสิ่งนี้:

พื้นหลัง

สมมติว่าฉันมีเซิร์ฟเวอร์ที่ใช้งานบริการหลายอย่างที่ซ่อนตัวอยู่ในคอนเทนเนอร์นักเทียบท่าแยก เนื่องจากบริการเหล่านั้นส่วนใหญ่เป็น http ฉันจึงใช้พร็อกซี nginx เพื่อแสดงโดเมนย่อยเฉพาะสำหรับแต่ละบริการ ตัวอย่างเช่นเซิร์ฟเวอร์โหนดกำลังทำงานบนคอนเทนเนอร์นักเทียบท่าที่มีพอร์ตที่80ผูกไว้127.0.0.1:8000กับโฮสต์ ฉันจะสร้าง vhost ใน Nginx ที่ผู้รับมอบฉันทะคำขอทั้งหมดเพื่อmyapp.mydomain.com วิธีการที่ภาชนะนักเทียบท่าที่ไม่สามารถเข้าถึงได้จากภายนอกยกเว้นผ่านhttp://127.0.0.1:8000myapp.mydomain.com

ตอนนี้ฉันต้องการเริ่มต้นตู้คอนเทนเนอร์gogs dockerในลักษณะที่gogs.mydomain.comชี้ไปที่ตู้ gogs ดังนั้นฉันจึงเริ่มต้นภาชนะ gogs นี้ด้วยพอร์ตที่8000ผูกไว้127.0.0.1:8001กับโฮสต์ และไซต์ nginx proxying ร้องขอไปgogs.mydomain.comยังhttp://127.0.0.1:8001และทำงานได้ดี ...

อย่างไรก็ตาม, gogs เป็น git container, ฉันยังต้องการเข้าถึง repos อย่างเช่นผ่าน, git@gogs.mydomain.com:org/repoแต่มันไม่ทำงานกับการตั้งค่าปัจจุบัน วิธีหนึ่งที่จะทำให้การทำงานที่จะมีการผูกพอร์ต22ของภาชนะไปยังท่าเรือ0.0.0.0:8022ในพื้นที่และจากนั้น URL SSH git@gogs.mydomain.com:8022/repoคอมไพล์สามารถเป็นสิ่งที่ชอบ

(ดูเหมือนจะไม่ทำงานเมื่อฉันกดไปที่ต้นกำเนิดที่มี uri เช่นนั้น git ต้องการรหัสผ่านสำหรับผู้ใช้gitบนgogs.mydomain.com- แทนgogs.mydomain.com:8022- แต่นั่นอาจเป็นสิ่งที่ฉันทำผิดและอยู่นอกขอบเขตสำหรับคำถามนี้อย่างไรก็ตาม ฉันจะขอบคุณการวินิจฉัยใด ๆ เช่นกัน)

ปัญหา

ความกังวลหลักของฉันคือว่าฉันต้องการพอร์ต ssh <gogs container>:22ที่จะพร็อกซี่เหมือนฉันกำลัง proxying พอร์ต HTTP โดยใช้ nginx; คือการเชื่อมต่อ SSH ใด ๆ ที่จะได้รับการส่งต่อไปยังท่าเรือคอนเทนเนอร์gogs.mydomain.com 22ตอนนี้ฉันไม่สามารถผูกพอร์ต ssh ของคอนเทนเนอร์เข้ากับพอร์ต ssh ของโฮสต์ได้เพราะมี sshd ที่ทำงานอยู่บนโฮสต์แล้ว นอกจากนี้ยังหมายความว่าการเชื่อมต่อใด ๆ ที่จะ*.mydomain.comได้รับการส่งผ่านไปยังคอนเทนเนอร์ของ sshd


ฉันต้องการเชื่อมต่อ ssh ใด ๆ กับ:

  • mydomain.com host.mydomain.com หรือที่อยู่ IP ของ mydomain ที่จะยอมรับและส่งต่อไปยัง sshd บนโฮสต์
  • gogs.mydomain.comหรือgit.mydomain.comจะได้รับการส่งผ่านไปยัง sshd บนภาชนะ gogs
  • *.mydomain.com(ซึ่ง*เป็นสิ่งอื่นนอกเหนือจากความเป็นไปได้ด้านบน) ที่จะถูกปฏิเสธ

ถ้าเป็น http ฉันสามารถทำให้มันทำงานผ่าน nginx ได้อย่างง่ายดาย มีวิธีการทำเช่นนั้นสำหรับ SSH หรือไม่?


(และต้องการออกไปที่แขนขาและถามว่า: มีวิธีการที่จะบรรลุด้วยบริการ TCP ใด ๆโดยทั่วไป?)

ข้อมูลเชิงลึกเกี่ยวกับวิธีที่ฉันพยายามทำที่นี่ก็ยินดีต้อนรับ ฉันไม่รังเกียจที่จะบอกเมื่อสิ่งที่ฉันพยายามทำคือโง่ที่สุด


สิ่งที่ฉันมีอยู่ในใจแล้ว:

บางทีฉันอาจใช้ซ็อกเก็ต sshd บนโฮสต์กับคอนเทนเนอร์เป็นroโวลุ่มหรือไม่ นั่นหมายความว่า sshd ภายในคอนเทนเนอร์สามารถรับการเชื่อมต่อทั้งหมด*.mydomain.comได้ มีวิธีทำให้ sshd ภายในคอนเทนเนอร์ปฏิเสธการเชื่อมต่อทั้งหมดนอกเหนือจากgogs.mydomain.comหรือgit.mydomain.com? อย่างไรก็ตาม sshd บนโฮสต์จะรับการเชื่อมต่อทั้งหมดเพื่อ*.mydomain.comรวมถึงgogs.mydomain.com; ดังนั้นจะมีความขัดแย้ง ฉันไม่ได้ลองจริงๆ ฉันควรลองไหม

คำตอบ:


2

การทำสิ่งนี้ "by hostname" นั้นไม่ได้อยู่ในขอบเขตของ ssh โปรโตคอล ssh นั้นไม่สนับสนุนการโฮสต์เสมือนตามชื่อ (อันที่จริง HTTP เป็นข้อยกเว้นจากกฎที่นี่)

SSHd ที่อยู่ด้านรับไม่สามารถรู้ชื่อโฮสต์ที่คุณขอให้ลูกค้าเชื่อมต่อได้เนื่องจากข้อมูลนี้ไม่ได้ถูกส่งผ่านภายในโปรโตคอล

หากคุณต้องการลูกค้าเพียงไม่กี่รายที่จะทำงานกับสิ่งนี้คุณสามารถกำหนดค่าไคลเอนต์แต่ละเครื่องเพื่อเชื่อมต่อกับเซิร์ฟเวอร์ของคุณจากนั้นข้ามไปที่คอนเทนเนอร์นักเทียบท่าเช่นนี้:

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

วิธีนี้ ssh จะเรียกใช้คำสั่ง proxy ซึ่งจะเปิดเซสชัน ssh ไปยังโฮสต์ของคุณและโทรnetcatเพื่อสร้างการเชื่อมต่อไปยังคอนเทนเนอร์ของคุณ วิธีนี้คุณไม่จำเป็นต้องเปิดเผยคอนเทนเนอร์ ssh ไปสู่โลกภายนอก


0

เวอร์ชัน OpenSSH ล่าสุดมีคำสั่ง ProxyJump และแฟล็ก -J:

ssh -J proxyuser@jumphost user@target
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.