Inoltra le connessioni ssh al contenitore docker in base al nome host


10

Mi sono trovato in una situazione molto specifica e, sebbene ci siano altri modi per farlo, sono diventato ossessionato da questo e vorrei scoprire un modo per farlo esattamente in questo modo:

sfondo

Supponiamo che io abbia un server che esegue diversi servizi nascosto in contenitori docker isolati. Poiché la maggior parte di questi servizi sono http, sto usando un proxy nginx per esporre sottodomini specifici a ciascun servizio. Ad esempio, un server nodo è in esecuzione su un contenitore finestra mobile con la porta 80collegata 127.0.0.1:8000all'host. Creerò un vhost in nginx che inoltra tutte le richieste myapp.mydomain.coma http://127.0.0.1:8000. In questo modo, il contenitore docker non è accessibile dall'esterno, tranne attraverso myapp.mydomain.com.

Ora voglio avviare un contenitore finestra mobile gogs in modo tale che gogs.mydomain.compunti al contenitore gogs. Quindi avvio questo contenitore gog con porta 8000associata 127.0.0.1:8001sull'host. E un sito nginx che richiede il proxy gogs.mydomain.coma http://127.0.0.1:8001e funziona bene ...

Tuttavia, essendo gog un contenitore git, vorrei anche accedere ai repository come attraverso git@gogs.mydomain.com:org/repoma ciò non funziona con la configurazione corrente. Un modo per farlo sarebbe legare la porta 22del contenitore alla porta 0.0.0.0:8022sull'host, e quindi l'URL git ssh può essere qualcosa di simile git@gogs.mydomain.com:8022/repo.

(Questo non sembra funzionare; quando spingo su un'origine con uri del genere, git richiede la password per l'utente gitsu gogs.mydomain.com- invece di gogs.mydomain.com:8022- ma è probabilmente qualcosa che sto facendo di sbagliato e fuori portata per questa domanda, tuttavia, Gradirei qualsiasi diagnosi anche per quello)

Problema

La mia preoccupazione principale è che desidero <gogs container>:22eseguire il proxy della porta ssh proprio come sto facendo il proxy delle porte http usando nginx; vale a dire qualsiasi connessione ssh da gogs.mydomain.comtrasmettere alla porta del contenitore 22. Ora non posso associare la porta ssh del contenitore alla porta ssh dell'host perché sull'host è già in esecuzione un sshd. Inoltre, ciò significherebbe che qualsiasi connessione deve *.mydomain.comessere passata al sshd del contenitore.


Voglio qualsiasi connessione ssh per:

  • mydomain.com host.mydomain.com o l'indirizzo IP di miodominio da accettare e inoltrare allo sshd sull'host
  • gogs.mydomain.como git.mydomain.comper essere accettato e trasmesso allo sshd sul contenitore di gogs
  • *.mydomain.com(dove *c'è qualcosa di diverso dalle possibilità sopra) da rifiutare

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


(Vorrei anche andare su un arto e chiedere: c'è un modo per farlo con qualsiasi servizio TCC in generale?)

Sono anche benvenute tutte le informazioni sul modo in cui sto cercando di farlo qui. Non mi dispiace che mi venga detto quando quello che sto cercando di fare è assolutamente stupido.


Quello che ho già in mente:

Forse potrei condividere il socket sshd sull'host con il contenitore come rovolume? Ciò significherebbe che l'shsh all'interno del contenitore potrebbe raccogliere tutte le connessioni *.mydomain.com. Potrebbe esserci un modo per fare in modo che sshd all'interno del contenitore rifiuti tutte le connessioni diverse da gogs.mydomain.como git.mydomain.com? Tuttavia, sshd sull'host prenderà *.mydomain.comcomunque tutte le connessioni tra cui gogs.mydomain.com; quindi ci sarebbe un conflitto. Non lo so, non l'ho ancora provato. Dovrei provarlo?

Risposte:


2

Fare questo "per nome host" semplicemente non rientra nell'ambito di ssh. Lo stesso protocollo ssh non supporta l'hosting virtuale basato sul nome (in effetti HTTP è l'eccezione alla regola qui).

L'SSHd sul lato ricevente non può mai sapere a quale nome host è stato chiesto al client di connettersi poiché queste informazioni non vengono trasmesse all'interno del protocollo.

Se hai solo bisogno di alcuni client per lavorare con questo, puoi configurare ogni client per connettersi al tuo server e poi saltare al contenitore della finestra mobile come segue:

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

In questo modo ssh invocherà il comando proxy che aprirà una sessione ssh al tuo host e chiamerà netcatper stabilire una connessione al tuo contenitore. In questo modo non è necessario esporre la porta ssh dei container al mondo esterno.


0

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

ssh -J proxyuser@jumphost user@target
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.