간혹 외부에서 접근할 수 없는 내부망에 서버가 구축된 경우가 있다. 이 서버에 접속하기 위해서는 외부를 향해 열려 있는 서버에 ssh 접속 후 다시 해당 서버로 접속하여야 한다. ProxyCommand를 사용하면 이런 불편함을 해소할 수 있다.

ProxyCommand

이미지로 보면 다음과 같다.

위의 예 중에서 가장 간단한 상황이 바로 컨테이너 호스트 서버 안에 있는 컨테이너 ssh를 통해 바로 접속하고 싶을 경우다.

커맨드는 다음과 같다.

$ ssh -t -o ProxyCommand="ssh -W %h:%p SERVER_B_USERNAME@SERVER_B_IP" SERVER_C_USERNAME@SERVER_C_IP

위와 같은 커맨드를 사용했을 때, B를 중계 서버로 사용하여 C로 접속할 수 있게 되며, 서버 B는 단순히 중계 역할만 한다. -W 옵션의 경우 다음과 같은 설명이 있는데,

      -W host:port
              Requests that standard input and output on the client be forwarded to host on port over the secure channel.
              Implies -N, -T, ExitOnForwardFailure and ClearAllForwardings.

클라이언트로부터의 Input/Output 요청을 secure channel을 통해 전달한다고 되어 있다.

예제: 컨테이너 호스트를 거쳐 바로 컨테이너에 접속하기

컨테이너 호스트에 도커를 설치한 후 컨테이너를 실행하자. 별다른 설정이 없었을 경우 컨테이너는 172.17.0.2의 IP를 할당받는데, 바로 이 컨테이너에 접속하도록 하자.

컨테이너 호스트

유저를 하나 추가하자. 해당 유저는 직접 로그인이 불가능하며 오로지 컨테이너로의 접속에 중계인 역할만 할 것이다. 이름을 broker로 하여 새로 추가하였다. 이 유저의 정보는 [[linux:passwd|/etc/passwd]]에서 다음과 같이 보인다.

...
broker:x:1001:1001::/home/broker:/usr/sbin/nologin
...

해당 유저의 홈 디렉토리에 .ssh/authorized_keys에 임의로 생성한 공개키 containers_host.pem.pub를 등록하였다.

컨테이너

컨테이너에는 openssh-server를 설치하고, .ssh/hauthorized_keys에 임의로 생성한 공개키 containers.pem.pub를 등록하였다.

접속

다음과 같은 커맨드를 사용하여 컨테이너에 접속할 수 있다.

$ ssh -t -o ProxyCommand="ssh -W %h:%p broker@SERVER_B_IP -i containers_host.pem" root@SERVER_C_IP -i containers.pem