중간 시스템을 통해 SSH 트래픽 전달


110

SSH 터널링은 매우 혼란 스럽습니다. Linux 에서이 작업을 수행 할 수 있는지 궁금합니다.

나는 3 대의 기계를 가지고있다 ..

A. My local machine at home.
B. Machine at work that I can SSH into (middle man).
C. My desktop at work that I can only SSH into from machine B.

따라서 A-> B 및 B-> C에서 SSH를 사용할 수 있지만 A-> C에서는 SSH를 사용할 수 없습니다.

A에서 B까지 SSH 터널을 설정하는 방법이 있습니까? 따라서 다른 SSH 명령을 실행할 때 로컬 시스템 A에서 작동합니까? 기본적으로 직장에서 집으로 git repo를 복제하려고합니다 (시스템 B에 git을 설치할 수 없습니다).

또한 설정이 완료되면 어떻게 설정을 해제합니까?


어딘가에 중복 질문이 있다고 생각하지만 오늘 검색 부가 약합니다.
quack quixote



머신 A에서 Linux를 실행중인 경우 sshuttle이라는 도구를 사용하십시오.이 툴을 사용하면 A-> B 터널을 통해 C에 대한 모든 트래픽을 선택적으로 전달할 수 있습니다 (C가 B에서 보인다고 가정).
joat

답변:


128

이를 .ssh/confighostA 의 파일에 저장하십시오 (자세한 내용은 man 5 ssh_config 참조).

# .ssh/config on hostA:
Host hostC
    ProxyCommand ssh hostB -W %h:%p

이제 다음 명령은 hostB를 자동으로 터널링합니다.

hostA:~$ ssh hostC

당신은 같은 옵션을 추가 할 수 있습니다 -oCiphers=arcfour-oClearAllForwardings=yes포장부터, 일을 속도를 ssh내 것이 ssh좀 더 계산 비용과 여분의 노력과 래퍼가 터널링 이미 암호화 된 트래픽 때와 같은 보안 할 필요는 없습니다.


5.3 이전의 OpenSSH를 사용중인 경우이 -W옵션을 사용할 수 없습니다. 이 경우 netcat ( nc)을 사용하여 위를 구현할 수 있습니다 .

ProxyCommand ssh hostB nc %h %p  # or netcat or whatever you have on hostB

1
훌륭합니다! 감사합니다. 이것은 지난 2 일 동안 나를 먹는 문제를 해결합니다 .hostC는 방화벽 뒤에 앉아서 전 세계 어디에서나 사용할 수있는 랩톱 인 hostA에서 액세스하려는 데이터가 있습니다. hostB는 또한 hostC와 동일한 방화벽 뒤에 있지만 SSH 포트가 전세계에 열려 있습니다. 따라서 hostC-> hostB에서 ssh를 사용할 수 있습니다. hostC와 hostB간에 역방향 SSH 터널을 설정 했으므로 hostB-> hostC (localhost를 통해 전달)에서 ssh를 수행 할 수도 있습니다. 당신의 트릭으로 나는 hostA-> hostC에서 갈 수 있습니다! OSX에서 SCP & Fugu와 완벽하게 작동합니다! 감사합니다!
AndyL

-W옵션 대신 사용해야합니다 nc옵션을 선택합니다.
vy32

어떤 SSH를 지원해야합니까 -W(hostA (원점) 또는 hostB (중간 시스템))?
gioele

참고로, 여러 개의 호스트가있는 경우 same을 통해 도달해야하는 경우 중간 서버를 통해 여러 호스트에 쉽게 액세스 할 수 있도록 hostB여러 Host hostC줄 을 선언 ProxyCommand할 수 있습니다.
fduff

7

편집 : 이것은 잘못된 접근법입니다. 참조 ephemient의 답변을 대신. 이 답변은 효과가 있지만 잠재적으로 덜 안전하고 확실하지 않습니다.

다음과 같은 솔루션을 원하는 것처럼 들립니다.

ssh -L localhost:22:machinec:22 machineb

이것은 당신에게 쉘을 얻을 것이다 machineb. 이것을 내버려 두십시오. 터미널 창을 최소화하십시오.

당신이 ssh 연결을 할 때마다 이제 localhost, 당신은 실제로 연결됩니다 machinec통해 machineb. 터널 작업이 끝나면 위 명령을 실행 한 터미널을 닫으십시오.

명령을 실행하려면 수퍼 유저 권한이 필요합니다.


웨슬리 +1 감사합니다. 이것은 실제 ssh 터널링 답변입니다. 여기에 대한 기사가 있습니다 : securityfocus.com/infocus/1816
Larry K

3
전체적으로 이것은 악한 일이지만 ... 이전 버전의 OpenSSH 또는 다른 ssh 클라이언트를 사용 하여이 작업을 수행해야했습니다. 8022와 같은 높은 포트를 선택할 수 있습니다. 이렇게하면 localhost의 ssh 서비스를 방해하지 않으며 루트로 실행할 필요가 없습니다. -p 8022ssh 명령에 추가 하십시오. 그리고 git을 사용하면 쉽게 두뇌를 잃을 수 있습니다 : URI 사용 ssh://localhost:8022/path/to/repo.git.
ephemient

3

C에서 ssh를 발생시키는 A의 쉘 별명을 원하는 것처럼 들립니다.

  1. 나는 A에서 ssh me @ b "ssh me @ c hostname"을 입력하고 "C"를 다시 얻을 수 있다고 가정합니다.
  2. sshc foo를 ssh me @ b "ssh me @ c foo"로 확장하는 별명 sshc를 작성하십시오.
  3. 별칭 생성에 대한 정확한 구문은 superuser.com을 참조하십시오.

1
-t대화식 쉘을 원할 경우 외부 ssh의 옵션 에 추가해야 할 수도 있습니다 . 명령이 제공되는지 ssh가정 -T하기 때문입니다.
ephemient

1

대화식 쉘의 경우 다음과 같은 간단한 명령을 사용할 수 있습니다.

ssh -J <user>@<hostB> <user>@<hostC>

-J 옵션은 jump 입니다.


0

고용주가 VPN을 제공하는 경우 대신 VPN을 사용하는 것이 좋습니다.

이렇게하면 응용 프로그램을 특별히 구성 할 필요가 없으며 (ssh 포함) 방화벽 뒤의 시스템을 볼 수 있습니다. 또한 모든 트래픽은 VPN 소프트웨어에 의해 암호화되어 의도하지 않거나 의도적으로 암호화되지 않은 트래픽에 보안을 추가합니다.


6
때로는 VPN이 이러한 트릭이 필요한 이유입니다.
Louis

0

YASS 또 다른 간단한 솔루션

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost
  • 첫 번째 명령에 ssh 연결 열고 호스트 B를 하고 말할 호스트 B를 연결을 전달하는 로컬 호스트 : 2222HostC : 22 .
  • -f연결이 설정되면 매개 변수는 백그라운드로 이동 SSH에게
  • 두 번째 명령은 단순히 로컬 호스트에 대한 클라이언트 연결을 엽니 다 :
  • HostKeyAlias 옵션 은 필요하지 않지만 잘못된 호스트에 대한 연결을 방지하는 데 도움이 될 수 있습니다
  • 참고 : sleep 10두 번째 ssh 명령이 전달 포트를 사용할 때까지 연결을 유지하려면 명령 이 필요합니다. 그런 다음 첫 번째 ssh 는 두 번째 ssh 가 전달 포트를 떠날 때 닫힙니다 .

이제 후속 ssh 세션을 실행할 수 있습니다.

ssh -o HostKeyAlias=HostC -p 2222 userOnC@localhost

다른:

ssh -f -L 2222:HostC_IP_or_Name:22 userOnB@hostB sleep 10 &&
    ssh -M -S ~/.ssh/ssh_HostC22userOnC.sock -o HostKeyAlias=HostC -p 2222 userOnC@localhost

다음을 실행하여 후속 ssh 세션을 열 수 있습니다.

ssh -S ~/.ssh/ssh_HostC22userOnC.sock userOnC@localhost

-M 및 -S 매개 변수를 사용하는 주요 이점은 HostA에서 HostC 로의 연결이 하나만 열려 후속 세션이 다시 인증되지 않고 훨씬 빠르게 실행된다는 것입니다.


0

특수한 경우, 혼합 nix 플랫폼 :

  hostA (linux)-> HostB (solaris)-> HostC (linux)

hostC에 X 응용 프로그램이 필요하고 중간 홉이 Solaris 상자에있는 경우 ...이 경우 ProxyCommand에 필요한 netcat (nc)를 다음과 같이 발견했습니다.

hostA : ~ $ vi .ssh / config :

호스트 hostC
    ProxyCommand ssh hostB nc % h % p # 여기서 nc는 netcat입니다.

그런 다음 자동 터널링이 작동합니다.

hostA : ~ $ ssh hostC

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.