Soru Hostname ile docker konteynerine giden ssh bağlantıları


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

Arka fon

İzole docker konteynırlarına sıkışmış çeşitli servisler çalıştıran bir sunucum olduğunu varsayalım. Bu hizmetlerin çoğu http olduğu için, her bir hizmete belirli alt etki alanlarını göstermek için bir nginx proxy kullanıyorum. Örneğin, bir düğüm sunucusu bağlantı noktasıyla bir docker konteynerinde çalışıyor 80 bağlı olmak 127.0.0.1:8000 ana bilgisayarda. Nginx'te tüm istekleri destekleyen bir vhost oluşturacağım myapp.mydomain.com için http://127.0.0.1:8000. Bu sayede, docker kabına dışarıdan erişilemez. myapp.mydomain.com.

Şimdi başlamak istiyorum gogs docker konteyner böyle bir şekilde gogs.mydomain.com gogs kabına işaret eder. Ben de başladım bu gogs konteyner liman ile 8000 bağlı olmak 127.0.0.1:8001 ana bilgisayarda. Ve bir nginx sitesi proxy istekleri gogs.mydomain.com için http://127.0.0.1:8001 ve iyi çalışıyor ...

Bununla birlikte, goglar bir git konteyneri, ben de benzerleri aracılığıyla erişmek istiyorum git@gogs.mydomain.com:org/repo ama bu mevcut kurulum ile çalışmıyor. Bu işi yapmanın bir yolu limanı bağlamaktı. 22 konteyner limanına 0.0.0.0:8022 ev sahibi, ve sonra git ssh url gibi bir şey olabilir git@gogs.mydomain.com:8022/repo.

(Bu işe yaramaz gibi gözüküyor, uri gibi bir kökene bastığımda, git kullanıcı için parola istiyor git üzerinde gogs.mydomain.com - yerine gogs.mydomain.com:8022 - ama muhtemelen bu soru için yanlış yaptığım ve kapsam dışı olduğum bir şey, ancak, ben de bunun için herhangi bir tanı takdir ediyorum)

Sorun

Benim asıl endişem, ssh limanını istiyorum <gogs container>:22 nginx kullanarak http portları gibi proxy yapıyorum; herhangi bir ssh bağlantısı gogs.mydomain.com konteynerin limanına geçme 22. Şimdi sahibinin ssh bağlantı noktasını ana makinenin ssh bağlantı noktasına bağlayamıyorum çünkü ana makinede çalışan bir sshd var. Ayrıca, bu herhangi bir bağlantı anlamına gelir *.mydomain.com İçindekiler sshd'ye geçilir.


Herhangi bir ssh bağlantısı istiyorum:

  • mydomain.com  host.mydomain.com veya mydomain'in IP adresi kabul edilir ve ana bilgisayardaki sshd'ye yönlendirilir
  • gogs.mydomain.com veya git.mydomain.com kabul edilmek için gogs kapsayıcısındaki sshd'ye iletildi
  • *.mydomain.com (nerede * reddedilmek için yukarıdaki olasılıklardan başka bir şey değildir

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


(Ayrıca bir uzvun dışına çıkmak ve sormak isterim: Bunu başarmak için bir yol var mı herhangi Genel olarak tcp servisi?)

Burada yapmaya çalıştığım herhangi bir anlayış da hoş karşılanır. Ne yapmaya çalıştığımı söylemek aptalca aptalca.


Zaten aklımda olan şey:

Belki sshd soketini ev sahibi olarak kapsayıcı olarak paylaşabilirim ro hacim? Bu, kabın içindeki sshd'nin tüm bağlantıları alabileceği anlamına gelir *.mydomain.com. Sshd'yi konteynerin içine yerleştirmenin bir yolu olabilir mi reddetmek dışındaki tüm bağlantılar gogs.mydomain.com veya git.mydomain.com? Ancak, ana bilgisayardaki sshd, tüm bağlantıları *.mydomain.com yine de dahil olmak üzere gogs.mydomain.com; bu yüzden bir çatışma olurdu. Bilmiyorum, aslında denemedim. Meli Onu deniyorum?


9
2018-04-13 03:28


Menşei




Cevaplar:


Bunu "hostname ile" yapmak, ssh kapsamı içinde değildir. Ssh protokolünün kendisi isim tabanlı sanal barındırma özelliğini desteklememektedir (aslında HTTP, buradaki kuralın istisnasıdır).

Alıcı tarafındaki SSHd, bu bilginin protokolün içinden geçmediği için istemcinizin bağlanmasını istediğiniz konak adının ne olduğunu asla bilemez.

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

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

Bu şekilde ssh, sunucunuza bir ssh oturumu açacak ve çağrı yapacak olan proxy komutunu çağırır. netcat Konteynerinize bağlantı kurmak için Bu sayede kaplarınızın ssh portunu dışarıdaki dünyaya göstermeniz gerekmez.


2
2017-07-28 14:22





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

ssh -J proxyuser@jumphost user@target

0
2017-08-23 06:40