지금까지 홈 서버를 사용하고 있습니다.이 기술집 밖에서도 액세스할 수 있습니다.
하지만 이제 다른 요구 사항이 있어서 홈 서버 내부의 도커 컨테이너에서 이를 만들고 싶습니다. 그러나 터널에 연결하려고 하면 연결 거부 오류가 발생합니다.
그래서 이와 같은 것을 설정하기 위해 온라인 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초 정도 기다려 주세요.
- 그런 다음 터널을여십시오.
오류 메시지에서 볼 수 있듯이 잘 작동하지 않습니다. 하지만 컨테이너 대신 물리적 머신에서 똑같은 단계를 수행하면 제대로 작동합니다...