Teruskan koneksi ssh ke wadah buruh pelabuhan berdasarkan nama host

10

Saya telah memasuki situasi yang sangat spesifik dan walaupun ada cara lain untuk melakukan ini, saya agak terobsesi dengan ini dan ingin mencari cara untuk melakukannya persis seperti ini:

Latar Belakang

Katakanlah saya memiliki server yang menjalankan beberapa layanan yang tersimpan dalam wadah buruh pelabuhan yang terisolasi. Karena sebagian besar layanan tersebut adalah http, saya menggunakan proxy nginx untuk mengekspos subdomain spesifik untuk setiap layanan. Sebagai contoh, sebuah server simpul berjalan pada wadah buruh pelabuhan dengan port 80terikat ke 127.0.0.1:8000host. Aku akan membuat vhost di nginx bahwa proxy semua permintaan untuk myapp.mydomain.comke http://127.0.0.1:8000. Dengan begitu, wadah buruh pelabuhan tidak dapat diakses dari luar, kecuali melalui myapp.mydomain.com.

Sekarang saya ingin memulai gogs buruh pelabuhan kontainer sedemikian rupa sehingga gogs.mydomain.compoin ke wadah gogs. Jadi saya mulai wadah gogs ini dengan port 8000terikat 127.0.0.1:8001pada tuan rumah. Dan permintaan proxy situs nginx gogs.mydomain.comke http://127.0.0.1:8001dan berfungsi dengan baik ...

Namun, gog menjadi wadah git, saya juga ingin mengakses repo seperti melaluinya [email protected]:org/repotetapi itu tidak berfungsi dengan pengaturan saat ini. Salah satu cara untuk membuatnya bekerja adalah dengan mengikat port 22wadah ke port 0.0.0.0:8022pada host, dan kemudian git ssh url dapat berupa sesuatu [email protected]:8022/repo.

(Itu tampaknya tidak bekerja, ketika saya mendorong ke asal dengan uri seperti itu, git menuntut password untuk pengguna gitdi gogs.mydomain.com- bukan gogs.mydomain.com:8022- tapi itu mungkin sesuatu yang saya lakukan salah dan keluar dari ruang lingkup untuk pertanyaan ini, bagaimanapun, Saya sangat menghargai diagnosis apa pun untuk itu)

Masalah

Perhatian utama saya adalah, bahwa saya ingin port ssh <gogs container>:22diproksikan seperti halnya saya memproxy port http menggunakan nginx; yaitu setiap koneksi ssh untuk gogs.mydomain.comditeruskan ke port kontainer 22. Sekarang saya tidak dapat mengikat port ssh kontainer ke port ssh host karena sudah ada sshd berjalan pada host. Juga, itu berarti bahwa setiap koneksi untuk *.mydomain.comditeruskan ke sshd wadah.


Saya ingin koneksi ssh ke:

  • mydomain.com host.mydomain.com atau alamat IP mydomain untuk diterima dan diteruskan ke sshd pada host
  • gogs.mydomain.comatau git.mydomain.comuntuk diterima diteruskan ke sshd pada wadah gogs
  • *.mydomain.com(Di mana *ada selain kemungkinan di atas) untuk ditolak

Jika itu http, saya bisa dengan mudah membuatnya bekerja melalui nginx. Apakah ada cara untuk melakukan itu untuk ssh?


(Juga ingin pergi keluar pada tungkai dan bertanya: apakah ada cara untuk mencapai itu dengan setiap layanan tcp secara umum?)

Setiap wawasan tentang cara saya mencoba melakukannya di sini, juga diterima. Saya tidak keberatan diberi tahu ketika apa yang saya coba lakukan benar-benar bodoh.


Apa yang sudah ada dalam pikiran saya:

Mungkin saya bisa berbagi soket sshd di host dengan wadah sebagai rovolume? Itu berarti sshd di dalam wadah dapat mengambil semua koneksi *.mydomain.com. Mungkinkah ada cara untuk membuat sshd di dalam wadah menolak semua koneksi selain gogs.mydomain.comatau git.mydomain.com? Namun, sshd pada host akan mengambil semua koneksi untuk *.mydomain.comtetap termasuk gogs.mydomain.com; jadi akan ada konflik. Saya tidak tahu, saya belum benar-benar mencobanya. Haruskah saya mencobanya?

Zia Ur Rehman
sumber

Jawaban:

2

Melakukan ini "dengan nama host" sama sekali tidak di dalam ruang lingkup ssh. Protokol ssh itu sendiri tidak mendukung hosting virtual berbasis nama (sebenarnya HTTP adalah pengecualian dari aturan di sini).

SSHd di sisi penerima tidak pernah tahu nama host apa yang Anda minta agar terhubung ke klien Anda karena informasi ini tidak diteruskan di dalam protokol.

Jika Anda hanya perlu beberapa klien untuk bekerja dengan ini, Anda dapat mengkonfigurasi setiap klien untuk terhubung ke server Anda dan kemudian melompat ke wadah buruh pelabuhan seperti berikut:

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

Dengan cara ini ssh akan menjalankan perintah proxy yang akan membuka sesi ssh ke host Anda dan memanggil netcatuntuk membuat koneksi ke wadah Anda. Dengan cara ini Anda tidak benar-benar perlu mengekspos wadah Anda ssh port ke dunia luar.

Andreas Rogge
sumber
0

Versi OpenSSH terbaru memiliki petunjuk ProxyJump dan flag -J:

ssh -J proxyuser@jumphost user@target
PTman
sumber