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