점프 호스트, ssh_config 파일 및 "ssh targethost"를 통한 SSH 포트 전달

점프 호스트, ssh_config 파일 및 "ssh targethost"를 통한 SSH 포트 전달

알아채다:내가 사용하는 OpenSSH 클라이언트는 다음 위치에 있습니다.버전 7.2, 그래서 작동하지 않습니다RemoteCommand쓸 수 있는.

다음 설정을 가정합니다.

  1. 머신은 foo점프 호스트이며 bar이를 통해 호스트에 대한 액세스가 제공됩니다.localhost:10022
  2. barrdp호스트에 액세스 하고 RDP 포트(3389)에 액세스 할 수 있는 네트워크 내부에 있습니다 . 실제로 명령줄과 config 에 IP를 제공하고 있지만 rdp이름 조회가 작동하는 한 해당 이름을 사용하는 것이 합법적이라고 생각합니다. 간결함을 위해 rdp.

이제 목표는 rdp:3389호스트 연결을 점프하여 액세스를 얻고 이를 내가 호출하는 로컬 시스템으로 전달하는 것입니다.barfoolocalhost:33389ssh bar

[local:33389] --> {foo} --> {bar} --> [rdp:3389]

삽화

PuTTY를 사용하기 전에 다음과 같이 이 문제를 해결했습니다.

  1. 에 대한 연결을 만들고 foo로컬 전달을 구성하여 -L 33389:localhost:33389로컬 localhost:33389컴퓨터를 에 바인딩 localhost:33389합니다 foo.
  2. 다음 원격 명령을 사용하여 해당 포트를 해당 포트가 있는 네트워크 bar로 전달하십시오 ssh -L 33389:rdp:3389 -A bar.
  3. Host bar구성된존재하다 foo.ssh/configlocalhost:10022점프 호스트에 연결하고 궁극적으로 종료됩니다.bar

PuTTY 구성은 매력적으로 작동하지만 실행을 위해 원격 명령을 사용합니다. 쉘 별칭은 이 문제를 해결하는 한 가지 방법이지만 ssh_config(5)클라이언트가 사용하는 모든 것을 내부적으로 유지할 수 있는 방법이 있는지 궁금합니다 ProxyCommand.


위의 PuTTY 구성과 대략적으로 동등한 것은 다음과 같습니다.

ssh -L 33389:localhost:33389 foo ssh -t -L 33389:rdp:3389 -p 10022 localhost

또는 다음을 수행 Host bar하도록 구성된 경우 :foolocalhost:10022foo

ssh -L 33389:localhost:33389 foo ssh -t -L 33389:rdp:3389 bar

이것으로 작업이 완료되는 것 같습니다.

물론 이 정도는 타이핑하기엔 충분하고, 적어주시면 더 깔끔할 것 같아요모두구성 파일로 이동하여 ssh bar로컬 컴퓨터에 입력하면 됩니다.

그리고 RemoteCommandOpenSSH 7.6에 도입된 것처럼 이는 매우 간단해 보입니다.

Host bar
    HostName foo
    RemoteCommand ssh -L 33389:rdp:3389 -A -p 10022 localhost
    LocalForward 33389 localhost:33389

ssh... 위에 표시된 호출 로 대략 변환되어야 합니다 . 하지만 앞서 언급했듯이 저는 이 섹션을 지원하지 않는 이전(패키지) 버전의 OpenSSH를 사용하고 있습니다 RemoteCommand.

이것이 내가 이루고 싶은 것에 가장 가까운 시도인 것 같다.

Host bar
    HostName localhost
    Port 10022
    ProxyCommand ssh -L 33389:localhost:33389 -W %h:%p foo
    LocalForward 33389 rdp:3389

내 로컬 컴퓨터 에서는 간단히 ssh bar. 내 로컬 컴퓨터 bar에서 sudo lsof -i|grep 3389다음을 제공합니다.

ssh       15271        accden    6u  IPv6 7933201      0t0  TCP localhost:33389 (LISTEN)
ssh       15271        accden    7u  IPv4 7933202      0t0  TCP localhost:33389 (LISTEN)

점프 호스트에는 include가 전혀 표시되지 않습니다 3389.

ProxyCommand에 대한 연결이 설정되었고 에 대한 연결을 제공하고 foo있으므로 이것이 작동할 것으로 기대합니다.LocalForwardbar

내가 뭘 잘못했나요?


목표는 ssh bar로컬 컴퓨터에 연결 bar하고 동시에 rdp:3389로컬 컴퓨터에서 사용할 수 있는 것입니다 localhost:33389. ssh_config(5)로컬 컴퓨터의 파일을 조정할 수 있습니다 . foo그러나 원격 명령을 전달하는 것은 유효한 대답이 아닙니다.

답변1

먼저, 설정에 따라회의작업 요구 사항그래도두 개의 SSH:

Host foo
    LocalForward 10022:bar:22

Host bar
    Hostname localhost
    Port 10022
    LocalForward 33389 rdp:3389

term1$ ssh foo # or use ssh -f -N -o ExitOnForwardFailure=yes foo for background task
term2$ ssh bar

실제로 필요한 것은 RemoteCommand가 아니라 구성을 진정으로 단순화하고 목표를 달성하는 ProxyJump입니다.오직그리고:

ssh -L 33389:rdp:3389 -J foo bar

또는 동등한(고유한) 구성:

Host bar
    ProxyJump foo
    LocalForward 33389 rdp:3389

중간 포트가 필요하지 않습니다.

불행히도 ProxyJump는 openssh 7.3부터만 사용할 수 있습니다.

하지만 그것은쉽게 대체 ProxyCommand/ -W결합당신은 이전에 그것을 사용했습니다.

ssh -L 33389:rdp:3389 -o 'ProxyCommand=ssh foo -W %h:%p' bar 

또는 구성 파일로:

Host bar
    ProxyCommand ssh -W %h:%p foo
    LocalForward 33389 rdp:3389

여전히 두 개의 SSH가 실행 중입니다. 숨겨진 SSH는 ProxyCommand여전히 로컬 호스트에서 실행 중이며 추가 TCP 포트 대신 파이프 쌍을 사용하여 기본 SSH에 연결됩니다. 포트 전달에 중간 호스트를 포함시키려는 시도는 안전하지 않거나 충돌을 일으킬 수 있으며(foo의 다른 사용자는 터널에 액세스하거나 동일한 포트를 사용할 수 있음) 오류가 발생하기 쉽습니다. 가능하다면 모든 제어를 위해 터널 끝은 항상 클라이언트 호스트에 남아 있어야 합니다. 중간 터널이 존재하지 않거나 다음 SSH 진입점( -W여기에서 사용됨)을 가리킵니다.

관련 정보