Inoltrare i collegamenti ssh al contenitore docker per hostname

Sono entrato in una situazione molto specifica e, sebbene ci siano altri modi per farlo, sono stato molto ossessionato da questo e vorrei scoprire un modo per farlo esattamente come questo:

background

Dica che ho un server che esegue diversi servizi nascosti in contenitori isolati. Poiché la maggior parte di questi servizi sono http, sto utilizzando un proxy nginx per esporre i sottodomini specifici a ciascun servizio. Ad esempio, un server di nodes è in esecuzione su un contenitore docker con la sua port 80 legata a 127.0.0.1:8000 nell'host. Creo un vhost in nginx che proxy tutte le richieste a myapp.mydomain.com a http://127.0.0.1:8000 . In questo modo, il contenitore docker non può essere acceduto dall'esterno, ad exception di myapp.mydomain.com .

Ora vorrei avviare un contenitore docker per gogs in modo tale che gogs.mydomain.com punta al contenitore dei gogli. Così ho avviato questo contenitore di gogs con la port 8000 legata a 127.0.0.1:8001 sull'host. E un sito nginx che proxy le richieste a gogs.mydomain.com a http://127.0.0.1:8001 e funziona bene …

Tuttavia, i gog sono un contenitore di git, vorrei anche accedere ai repos come tramite git@gogs.mydomain.com:org/repo ma che non funziona con l'installazione corrente. Un modo per fare questo lavoro sarebbe quello di bind la port 22 del contenitore alla port 0.0.0.0:8022 sull'host e quindi l'url di git ssh può essere qualcosa di simile a git@gogs.mydomain.com:8022/repo .

(Che non sembra funzionare: quando spingo ad un'origine con uri così, git richiede la password per l'utente git su gogs.mydomain.com – anziché gogs.mydomain.com:8022 – ma è probabilmente qualcosa faccio male e fuori field per questa domanda, tuttavia, apprezzerò anche qualsiasi diagnosi per questo)

Problema

La mia preoccupazione principale è che voglio che il port ssh <gogs container>:22 essere proxied proprio come sto proxying porte http usando nginx; ovvero tutte le connessioni di ssh a gogs.mydomain.com vengono trasmesse alla port del contenitore 22 . Ora non posso associare la port ssh del contenitore alla port ssh dell'host perché c'è già un sshd in esecuzione nell'host. Inoltre, ciò significa che tutte le connessioni a *.mydomain.com vengono passate al sshd del contenitore.


Voglio che tutte le connessioni ssh per:

  • l'indirizzo IP di host.mydomain.com o il host.mydomain.com per essere accettato e inoltrato alla sshd sull'host
  • gogs.mydomain.com o git.mydomain.com per essere accettato uno passato al sshd sul contenitore gogs
  • *.mydomain.com (where * è altro che le possibilità sopra) da respingere

Se fosse http, potrei facilmente farlo lavorare attraverso nginx. C'è un modo per farlo per ssh?


(Vorrei anche uscire su un arto e chiedere: c'è un modo per realizzare questo con qualsiasi servizio di tcp in generale?)

Qualsiasi intuizione del modo in cui sto cercando di farlo qui, sono anche i benvenuti. Non mi dispiace dirlo quando quello che sto cercando di fare è assolutamente stupido.


Quello che ho già nella mia mente:

Forse potrei condividere il socket sshd sull'host con il contenitore come volume ro ? Ciò significherebbe che la sshd all'interno del contenitore potesse raccogliere tutte le connessioni a *.mydomain.com . Potrebbe essere un modo per rendere il sshd all'interno del contenitore rifiutare tutte le connessioni diverse da gogs.mydomain.com o git.mydomain.com ? Tuttavia, l'sshd sull'host raccoglierà tutte le connessioni a *.mydomain.com comunque compresi gogs.mydomain.com ; quindi ci sarebbe un conflitto. Non so, non l'ho mai provato. Devo provarlo?

  • Tunnel SSH non funziona come previsto
  • MTU sul server accidentalmente impostato su 0, non può ssh in esso?
  • Come gestisci le informazioni di SSH?
  • Problemi con block dello SCP durante la copia di file su VPN
  • Inoltra il file locale o il socket al file di socket remoto
  • ssh blocca senza richiesta di password - funziona in root o in altri account
  • Collegamento lento su ssh su Ubuntu
  • Jenkins pubblica per successo su ssh per colbind il server, ma il file messo fallito
  • 2 Solutions collect form web for “Inoltrare i collegamenti ssh al contenitore docker per hostname”

    Fare questo "per hostname" non è semplicemente all'interno del field di applicazione di ssh. Il protocollo ssh in sé non support il hosting virtuale basato sul nome (in realtà HTTP è l'exception dalla regola qui).

    L'SSHd sul lato ricevente non può mai sapere quale hostname ha richiesto al tuo client di connettersi, poiché queste informazioni non vengono trasmesse all'interno del protocollo.

    Se hai bisogno di pochi client per lavorare con questo puoi configurare each client per connettersi al tuo server e poi saltare al contenitore docker come segue:

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

    In questo modo ssh invoca il command proxy che apre una session ssh al proprio host e chiama netcat per stabilire una connessione al tuo contenitore. In questo modo non è necessario esporre la port dei container ssh al mondo esterno.

    Le versioni OpenSSH recenti hanno la direttiva ProxyJump e la -J flag:

     ssh -J proxyuser@jumphost user@target 
    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.