호스트 이름으로 ssh 연결을 도커 컨테이너로 전달


10

나는 매우 구체적인 상황에 빠졌고 이것을 할 다른 방법이 있지만, 나는 이것에 사로 잡히고 정확하게 이와 같은 일을하는 방법을 찾고 싶습니다 :

배경

격리 된 도커 컨테이너에 여러 서비스를 실행하는 서버가 있다고 가정 해보십시오. 이러한 서비스의 대부분은 http이므로 nginx 프록시를 사용하여 특정 하위 도메인을 각 서비스에 노출시킵니다. 예를 들어, 노드 서버는 포트 가 호스트에 80바인딩 된 도커 컨테이너에서 실행 중입니다 127.0.0.1:8000. 그 프록시 모든 요청에의 nginx에 가상 호스트를 만듭니다 myapp.mydomain.comhttp://127.0.0.1:8000. 그렇게하면를 제외하고 외부에서 도커 컨테이너에 액세스 할 수 없습니다 myapp.mydomain.com.

이제 gogs 컨테이너 를 가리키는 방식으로 gogs docker 컨테이너 를 시작하고 싶습니다gogs.mydomain.com . 그래서이 gogs 컨테이너 를 호스트에 8000바인딩 된 포트로 시작 하십시오127.0.0.1:8001 . 그리고 nginx 사이트 프록시 요청을 gogs.mydomain.com하고 http://127.0.0.1:8001잘 작동합니다 ...

그러나 gog는 git 컨테이너이므로 repos에 같은 방식으로 액세스하고 git@gogs.mydomain.com:org/repo싶지만 현재 설정에서는 작동하지 않습니다. 이 작업을 수행하는 한 가지 방법 22은 컨테이너의 포트 0.0.0.0:8022를 호스트 의 포트 에 바인딩 한 다음 git ssh url은 다음과 같습니다 git@gogs.mydomain.com:8022/repo.

(즉, 작동하지 않는 것, 내가 그와 같은 URI를 원점으로 누를 때, 자식이 사용자의 암호를 요구 gitgogs.mydomain.com- 대신 gogs.mydomain.com:8022-하지만 그러나, 아마 내가이 질문에 대한 잘못된 범위에서하고있어 뭔가, 나는 그것에 대한 진단도 감사하겠습니다)

문제

내 주요 관심사는 <gogs container>:22nginx를 사용하여 http 포트를 프록시 처리하는 것처럼 ssh 포트 가 프록시되도록 하려는 것입니다 . 즉, 모든 ssh 연결 gogs.mydomain.com이 컨테이너의 포트로 전달됩니다 22. 이제 호스트에서 sshd가 이미 실행 중이므로 컨테이너의 ssh 포트를 호스트의 ssh 포트에 바인딩 할 수 없습니다. 또한 *.mydomain.com이는 컨테이너의 sshd로 전달 되는 모든 연결을 의미합니다 .


ssh 연결을 원합니다 :

  • mydomain.com host.mydomain.com 또는 mydomain의 IP 주소를 수락하여 호스트의 sshd로 전달
  • gogs.mydomain.com또는 git.mydomain.comgogs 컨테이너의 sshd로 전달되도록 허용됩니다.
  • *.mydomain.com( *위의 가능성 이외의 다른 곳 은 거부)

http 인 경우 nginx를 통해 쉽게 작동시킬 수 있습니다. ssh를 위해 할 수있는 방법이 있습니까?


(또한 사지에 나가서 물어보고 싶습니다으로 그 작업을 수행 할 수있는 방법이 어떤 일반적인 TCP 서비스는?)

내가 여기서하려고하는 방식에 대한 통찰력도 환영합니다. 내가하려는 일이 완전히 어리 석다는 말을 듣고 싶지 않습니다.


내가 이미 생각한 것 :

어쩌면 컨테이너의 ro볼륨 으로 호스트의 sshd 소켓을 공유 할 수 있습니까? 이는 컨테이너 내부의 sshd가에 대한 모든 연결을 선택할 수 있음을 의미합니다 *.mydomain.com. 컨테이너 내부의 sshd 가 또는 이외의 모든 연결을 거부하도록 하는 방법이 있습니까? 그러나 호스트의 sshd는 다음을 포함 하여 어쨌든 모든 연결을 선택합니다 . 그래서 갈등이 생길 것입니다. 나는 몰라, 나는 그것을 실제로 시도하지 않았습니다. 해야 내가 그것을 시도?gogs.mydomain.comgit.mydomain.com*.mydomain.comgogs.mydomain.com

답변:


2

"호스트 이름으로"이 작업을 수행하는 것은 단순히 ssh 범위 내에 있지 않습니다. ssh 프로토콜 자체는 이름 기반 가상 호스팅을 지원하지 않습니다 (사실 HTTP는 여기서 규칙의 예외입니다).

수신 측의 SSHd는이 정보가 프로토콜 내부로 전달되지 않기 때문에 클라이언트에 연결하도록 요청한 호스트 이름을 절대 알 수 없습니다.

이 작업을 위해 몇 개의 클라이언트가 필요한 경우 각 클라이언트가 서버에 연결되도록 구성한 후 다음과 같이 도커 컨테이너로 이동할 수 있습니다.

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

이 방법으로 ssh는 프록시 명령을 호출하여 호스트에 대한 ssh 세션을 열고 netcat컨테이너에 연결하도록 호출 합니다. 이렇게하면 컨테이너 ssh 포트를 외부 세계에 노출시킬 필요가 없습니다.


0

최신 OpenSSH 버전에는 ProxyJump 지시문과 -J 플래그가 있습니다.

ssh -J proxyuser@jumphost user@target
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.