Ssh bağlantılarını ana bilgisayar adına göre docker kapsayıcısına iletme


10

Çok özel bir duruma girdim ve bunu yapmanın başka yolları olsa da, buna takıntılı oldum ve bunu tam olarak böyle yapmanın bir yolunu bulmak istiyorum:

Arka fon

Diyelim ki izole docker kaplarına sıkışmış birkaç hizmeti çalıştıran bir sunucum var. Bu hizmetlerin çoğu http olduğundan, her hizmete belirli alt etki alanları göstermek için bir nginx proxy kullanıyorum. Örneğin, bir düğüm sunucusu bağlantı noktası ana makineye 80bağlı olarak bir docker kapsayıcısında çalışıyor 127.0.0.1:8000. Ben proxy uygulama tüm istekleri için nginx bir sankonu oluştururuz myapp.mydomain.comiçin http://127.0.0.1:8000. Bu şekilde, docker konteynerine içinden hariç, dışarıdan erişilemez myapp.mydomain.com.

Şimdi bir gogs docker konteynerini gogs.mydomain.comgogs konteynerine işaret edecek şekilde başlatmak istiyorum . Bu yüzden ana bilgisayara bağlı port ile bu gogs konteyner başlatmak . Ve bir nginx sitesi isteklerini proxy için ve iyi çalışıyor ...8000127.0.0.1:8001gogs.mydomain.comhttp://127.0.0.1:8001

Ancak, git git kap olmak gogs, ben de aracılığıyla depoları erişmek istiyorum git@gogs.mydomain.com:org/repoama geçerli kurulum ile çalışmaz. Bu işi yapmanın bir yolu 22, konteynerin bağlantı noktasını 0.0.0.0:8022ana bilgisayardaki bağlantı noktasına bağlamak ve daha sonra git ssh url'si gibi bir şey olabilir git@gogs.mydomain.com:8022/repo.

(Yani işin görünmüyor; böyle uri bir kökeni iterken, git kullanıcının parolasını talep gitüzerine gogs.mydomain.com- yerine gogs.mydomain.com:8022- ama bu ancak, muhtemelen bu soru için yanlış ve kapsam dışında yapıyorum şey, Bunun için herhangi bir teşhis için minnettar olurum)

Sorun

Benim asıl endişe, ben ssh bağlantı noktası <gogs container>:22nginx kullanarak http bağlantı noktaları proxy gibi proxied istiyorum olduğunu; örn . gogs.mydomain.comkabın bağlantı noktasına iletilecek ssh bağlantıları 22. Artık ana bilgisayarda çalışan bir sshd olduğu için kabın ssh portunu ana bilgisayarın ssh portuna bağlayamıyorum. Ayrıca, bu *.mydomain.com, kapsayıcıya ait herhangi bir bağlantının sshd'ye geçeceği anlamına gelir .


Herhangi bir ssh bağlantısı istiyorum:

  • mydomain.com host.mydomain.com veya alan adımın IP adresi kabul edilecek ve ana bilgisayardaki sshd'ye iletilecek
  • gogs.mydomain.comveya git.mydomain.comgogs kapsayıcısındaki sshd'ye kabul edilmek
  • *.mydomain.com( *yukarıdaki olasılıklardan başka bir şey nerede ) reddedilecek

Eğer http olsaydı, bu işi nginx aracılığıyla kolayca yapabilirdim. Ssh için bunu yapmanın bir yolu var mı?


(Ayrıca bir uzuv dışarı çıkmak ve sormak istiyorum: genel olarak herhangi bir tcp hizmeti ile bunu başarmak için bir yolu var mı?)

Burada yapmaya çalıştığım yolla ilgili herhangi bir fikir de kabul edilir. Yapmaya çalıştığım şeyin tamamen aptalca olduğu söylenmesine aldırmıyorum.


Zaten aklımda ne var:

Belki ana bilgisayardaki sshd soketini bir kap olarak kap ile paylaşabilir miyim ro? Bu, kabın içindeki sshd'nin tüm bağlantıları alabileceği anlamına gelir *.mydomain.com. Konteyner içindeki sshd'nin veya dışındaki tüm bağlantıları reddetmesinin bir yolu olabilir mi? Ancak, ana bilgisayardaki sshd dahil olmak üzere tüm bağlantıları alacak ; yani bir çatışma olur. Bilmiyorum, gerçekten denemedim. Should ben denemek?gogs.mydomain.comgit.mydomain.com*.mydomain.comgogs.mydomain.com

Yanıtlar:


2

Bunu "hostname ile" yapmak ssh'ın kapsamı dışında değildir. Ssh protokolünün kendisi ad tabanlı sanal barındırma desteklemez (aslında HTTP buradaki kuralın istisnasıdır).

Alıcı taraftaki SSHd, istemciden bağlanmasını istediğiniz ana bilgisayar adını asla bilemez, çünkü bu bilgi protokolün içinden geçirilmez.

Bununla çalışmak için birkaç istemciye ihtiyacınız varsa, her istemciyi sunucunuza bağlanacak şekilde yapılandırabilir ve ardından docker kapsayıcısına aşağıdaki gibi atlayabilirsiniz:

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

Bu şekilde ssh, ana makinenize bir ssh oturumu açacak ve netcatkapsayıcıyla bağlantı kurmaya çağıracak proxy komutunu çağıracaktır . Bu şekilde konteynerlerinizin ssh portunu dış dünyaya maruz bırakmanıza gerek kalmaz.


0

Son OpenSSH sürümlerinde ProxyJump yönergesi ve -J bayrağı bulunur:

ssh -J proxyuser@jumphost user@target
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.