알아채다:내가 사용하는 OpenSSH 클라이언트는 다음 위치에 있습니다.버전 7.2, 그래서 작동하지 않습니다RemoteCommand
쓸 수 있는.
다음 설정을 가정합니다.
- 머신은
foo
점프 호스트이며bar
이를 통해 호스트에 대한 액세스가 제공됩니다.localhost:10022
bar
rdp
호스트에 액세스 하고 RDP 포트(3389)에 액세스 할 수 있는 네트워크 내부에 있습니다 . 실제로 명령줄과 config 에 IP를 제공하고 있지만rdp
이름 조회가 작동하는 한 해당 이름을 사용하는 것이 합법적이라고 생각합니다. 간결함을 위해rdp
.
이제 목표는 rdp:3389
호스트 연결을 점프하여 액세스를 얻고 이를 내가 호출하는 로컬 시스템으로 전달하는 것입니다.bar
foo
localhost:33389
ssh bar
[local:33389] --> {foo} --> {bar} --> [rdp:3389]
삽화
PuTTY를 사용하기 전에 다음과 같이 이 문제를 해결했습니다.
- 에 대한 연결을 만들고
foo
로컬 전달을 구성하여-L 33389:localhost:33389
로컬localhost:33389
컴퓨터를 에 바인딩localhost:33389
합니다foo
. - 다음 원격 명령을 사용하여 해당 포트를 해당 포트가 있는 네트워크
bar
로 전달하십시오ssh -L 33389:rdp:3389 -A bar
. Host bar
구성된존재하다foo
.ssh/config
localhost: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
하도록 구성된 경우 :foo
localhost:10022
foo
ssh -L 33389:localhost:33389 foo ssh -t -L 33389:rdp:3389 bar
이것으로 작업이 완료되는 것 같습니다.
물론 이 정도는 타이핑하기엔 충분하고, 적어주시면 더 깔끔할 것 같아요모두구성 파일로 이동하여 ssh bar
로컬 컴퓨터에 입력하면 됩니다.
그리고 RemoteCommand
OpenSSH 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
있으므로 이것이 작동할 것으로 기대합니다.LocalForward
bar
내가 뭘 잘못했나요?
목표는 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
여기에서 사용됨)을 가리킵니다.