Docker 컨테이너 내부에 SSH 터널을 성공적으로 설정할 수 없습니다.

Docker 컨테이너 내부에 SSH 터널을 성공적으로 설정할 수 없습니다.

지금까지 홈 서버를 사용하고 있습니다.이 기술집 밖에서도 액세스할 수 있습니다.

하지만 이제 다른 요구 사항이 있어서 홈 서버 내부의 도커 컨테이너에서 이를 만들고 싶습니다. 그러나 터널에 연결하려고 하면 연결 거부 오류가 발생합니다.

그래서 이와 같은 것을 설정하기 위해 온라인 VPS와 홈 서버가 있습니다. 내 홈 서버 내부에는 컨테이너가 실행 중입니다. authorized_keys서로의 파일을 올바르게 구성하여 VPS와 컨테이너 간에 공개 키를 교환합니다 . 컨테이너를 실행하고 -p 22:22있으며 호스트의 포트 22를 사용하고 있을 수 있는 컨테이너 외부에서 실행되는 SSH 서비스가 없음을 확인했습니다 .

그런 다음 컨테이너에서 다음 명령을 실행합니다.

$ ssh -vvvfN -oStrictHostKeyChecking=no -R 20007:localhost:22 [email protected]

그런 다음 내 VPS에 이것을 입력하고 출력하십시오.

$ ssh -vvv container_user@localhost -p 20007
OpenSSH_7.2p2 Ubuntu-4ubuntu2.1, OpenSSL 1.0.2g  1 Mar 2016
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 19: Applying options for *
debug2: resolving "localhost" port 20009
debug2: ssh_connect_direct: needpriv 0
debug1: Connecting to localhost [127.0.0.1] port 20009.
debug1: Connection established.
debug1: identity file /home/raspi/.ssh/id_rsa type 1
debug1: key_load_public: No such file or directory
debug1: identity file /home/raspi/.ssh/id_rsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/raspi/.ssh/id_dsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/raspi/.ssh/id_dsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/raspi/.ssh/id_ecdsa type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/raspi/.ssh/id_ecdsa-cert type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/raspi/.ssh/id_ed25519 type -1
debug1: key_load_public: No such file or directory
debug1: identity file /home/raspi/.ssh/id_ed25519-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1
ssh_exchange_identification: Connection closed by remote host

이제 컨테이너 로그를 확인하면 다음과 같은 내용이 표시됩니다.

debug1: client_input_global_request: rtype [email protected] 
want_reply 0
debug1: remote forward success for: listen 20007, connect localhost:22
debug1: All remote forwarding requests processed
debug1: client_input_channel_open: ctype forwarded-tcpip rchan 2 win 2097152 max 32768
debug1: client_request_forwarded_tcpip: listen localhost port 20007, originator 127.0.0.1 port 60364
debug2: fd 7 setting O_NONBLOCK
debug2: fd 7 setting TCP_NODELAY
debug1: connect_next: host localhost ([::1]:22) in progress, fd=7
debug3: fd 7 is O_NONBLOCK
debug3: fd 7 is O_NONBLOCK
debug1: channel 0: new [127.0.0.1]
debug1: confirm forwarded-tcpip
debug3: channel 0: waiting for connection
debug1: channel 0: connection failed: Connection refused
debug2: fd 8 setting O_NONBLOCK
debug2: fd 8 setting TCP_NODELAY
debug1: connect_next: host localhost ([127.0.0.1]:22) in progress, fd=8
debug3: channel 0: waiting for connection
debug1: channel 0: connection failed: Connection refused
connect_to localhost port 22: failed.
debug2: channel 0: zombie
debug2: channel 0: garbage collecting
debug1: channel 0: free: 127.0.0.1, nchannels 1
debug3: channel 0: status: The following connections are open:

이 모든 단계는 컨테이너 외부에서 실행될 때 완벽하게 작동하지만, 어쨌든 컨테이너 내부에서는 VPS가 터널을 사용하여 연결을 설정할 수 없다는 점을 명심하세요.

편집하다: 컨테이너가 원격 서버와 터널을 설정하는 코드입니다.

FROM ubuntu:16.04

RUN apt-get update && apt-get install -y ssh htop nano autossh
RUN ssh-keygen -f $HOME/.ssh/id_rsa -t rsa -N '';                                             \
COPY authorized_keys $HOME/.ssh/
echo '=======SAVE THIS KEY TO ~/.ssh/authorized_keys in the Cloud Server=======';             \
cat $HOME/.ssh/id_rsa.pub;                                                                    \
echo '=========================================================================';

RUN sleep 20 # Give me time to put the key in the cloud server

RUN echo "/usr/bin/ssh -vvvfN -oStrictHostKeyChecking=no -R 20009:localhost:22 [email protected]" > $HOME/connect.sh; \
chmod 777 $HOME/connect.sh

EXPOSE 22
EXPOSE 20009
CMD ["sh", "-c", "$HOME/connect.sh"]

이 Dockerfile은 다음과 같습니다.

  • 키 쌍을 생성하고,
  • 원격 서버의 공개 키를 저장합니다.
  • 해당 키 쌍을 원격 서버의 Authorized_keys에 넣을 때까지 20초 정도 기다려 주세요.
  • 그런 다음 터널을여십시오.

오류 메시지에서 볼 수 있듯이 잘 작동하지 않습니다. 하지만 컨테이너 대신 물리적 머신에서 똑같은 단계를 수행하면 제대로 작동합니다...

관련 정보