점프 호스트에서만 주소를 지정하고 액세스할 수 있는 서버에 SSH로 연결하는 방법은 무엇입니까?

점프 호스트에서만 주소를 지정하고 액세스할 수 있는 서버에 SSH로 연결하는 방법은 무엇입니까?

을 통해 내 로컬 컴퓨터 A에서 점프 호스트 서버 B를 SSH로 연결할 수 있습니다 ssh B.

서버 C는 주소 지정이 가능하고(주소는 C.internal임) 를 통해 B에서 액세스할 수 있습니다 ssh C.

로컬 컴퓨터에서 직접 C로 SSH를 통해 어떻게 접속하나요?

SSH 명령과 구성 파일은 어떤 모양입니까?

A의 SSH 구성:

Host B
    User userB
    HostName B.example.com
    IdentityFile ~/.ssh/keyB

B의 SSH 구성:

Host C
  HostName C.internal
  User userC
  IdentityFile ~/.ssh/keyC

~/.ssh/keyC호스트 B에서 로컬 시스템 A로 복사하지 않고도 이 작업을 수행할 수 있습니까 ?

답변1

여러 가지 옵션이 있지만 그 중 "단일 명령"은 없습니다.

C에 대해 두 번째 SSH 명령을 실행하는 B에 대한 SSH 명령을 실행할 수 있습니다. -t대화형 SSH에서 작동하도록 하려면 옵션을 추가해야 합니다 .

  • ssh -t hostB "ssh hostC"
  • ssh -t hostB "ssh -t hostC htop"
  • ssh hostB ssh hostC ls -la /etc

A에서 C로 SSH를 "직접"하는 방법을 원한다면 SSH-agent 연결을 전달하기 위한 추가 장치가 필요합니다.B에서로컬 시스템에(즉, 일반적으로 수행하는 작업과 반대 ssh -A)

  1. 호스트 B에 대해 SSH를 수행한 다음 수동으로 지정된 경로에서 ssh-agent를 시작합니다. 로컬 클라이언트가 원격 에이전트 프로세스에 액세스하도록 허용하려면 SSH "스트림 전달" 기능을 사용하십시오.

    HostA$ ssh -t -L /tmp/agent:/tmp/agent HostB \
        "ssh-agent -a /tmp/agent sh -c 'ssh-add ~/.ssh/keyC && sleep infinity'"
    

    (ssh/config 옵션은 입니다 LocalForward.)

  2. 위의 연결이 실행되는 동안 HostB에만 존재하는 키를 사용하여 일반 ProxyJump 구성을 사용하여 HostA에서 HostC로 연결할 수 있습니다.

    HostA$ export SSH_AUTH_SOCK=/tmp/agent
    HostA$ ssh -J HostB HostC
    

    (ssh/config 옵션은 IdentityAgent및 입니다 ProxyJump.)


또 다른 옵션은 keyCB에서 A로 복사하여 저장하는 것 입니다.보안 하드웨어에서TPM 칩 또는 스마트 카드(PIV 모드가 있는 Yubikey도 포함)와 같은 것입니다. 이를 통해 키를 도난당할 가능성 없이 머신 A에서 로컬로 사용할 수 있습니다.

(Linux의 TPM2.0의 경우 tpm2-pkcs11또는 중 하나를 사용할 수 ssh-tpm-agent있습니다. Windows의 TPM2.0은 PuTTY-CAC를 통해 사용할 수 있습니다. PIV가 있는 Yubikey의 경우 Windows와 Linux 모두에 대한 PKCS#11 모듈이 있습니다. 저는 Ebay의 eToken 5110 SSH에서 FIDO2 키를 사용하는 방법도 있지만 새 키를 생성해야 합니다.

답변2

/etc/ssh/ssh_configglobal 또는 user와 같은 ssh_config 파일이 필요합니다 ~/.ssh/config.

Host B
  HostName 10.0.0.1
  User username_on_B
  IdentityFile ~/.ssh/id_rsa_for_B
  ForwardAgent yes

# final destination
Host C
  HostName C.internal
  User your_username_on_C
  ProxyJump B
  IdentityFile ~/.ssh/id_rsa_for_C

이제 에서 을 A(를) 수행할 수 있습니다 ssh C.

관련 정보