ฉันเข้าสู่สถานการณ์ที่เฉพาะเจาะจงมากและแม้ว่าจะมีวิธีอื่นในการทำเช่นนี้ฉันก็รู้สึกหมกมุ่นอยู่กับสิ่งนี้และต้องการหาวิธีที่จะทำสิ่งนี้:
พื้นหลัง
สมมติว่าฉันมีเซิร์ฟเวอร์ที่ใช้งานบริการหลายอย่างที่ซ่อนตัวอยู่ในคอนเทนเนอร์นักเทียบท่าแยก เนื่องจากบริการเหล่านั้นส่วนใหญ่เป็น 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.comhost.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; ดังนั้นจะมีความขัดแย้ง ฉันไม่ได้ลองจริงๆ ฉันควรลองไหม