SSH 터널을 통해 SSH 연결에 대한 바로 가기를 구성하는 방법


22

내 회사 프로덕션 서버 (FOO, BAR ...)는 두 게이트웨이 서버 (A, B) 뒤에 있습니다. 서버 FOO에 연결하려면 사용자 이름 JOHNDOE를 사용하여 서버 A 또는 B와의 ssh 연결을 열어야합니다. 그런 다음 A (또는 B)에서 표준 사용자 이름으로 SSH 연결을 여는 모든 프로덕션 서버에 액세스 할 수 있습니다 (전화하겠습니다) WEBBY).

따라서 매번 다음과 같은 작업을 수행해야합니다.

ssh johndoe@a
...
ssh webby@foo
...
# now I can work on the server

아시다시피, 사용해야 할 때 scp또는 여러 연결을 빠르게 열어야 할 경우 번거 롭습니다 .

ssh 키를 구성했으며 일부 바로 가기에 .ssh / config를 사용하고 있습니다.

입력하기 위해 일종의 ssh 구성을 만들 수 있는지 궁금합니다.

ssh foo

SSH가 나를 위해 모든 연결을 열거 나 전달하도록하십시오. 가능합니까?

편집하다

womble의 대답은 내가 찾던 것과 정확히 같지만 현재 게이트웨이 서버에 설치되지 않았기 때문에 netcat을 사용할 수없는 것 같습니다.

weppos:~ weppos$ ssh foo -vv
OpenSSH_5.1p1, OpenSSL 0.9.7l 28 Sep 2006
debug1: Reading configuration data /Users/xyz/.ssh/config
debug1: Applying options for foo
debug1: Reading configuration data /etc/ssh_config
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh a nc -w 3 foo 22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/xyz/.ssh/identity type -1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_rsa type 1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_dsa type 2
bash: nc: command not found
ssh_exchange_identification: Connection closed by remote host

답변:


36

Kyle의 대답에 대한보다 구체적인 버전으로 ~/.ssh/config파일 에 넣고 싶은 것은 다음과 같습니다.

host foo
  User webby
  ProxyCommand ssh a nc -w 3 %h %p

host a
  User johndoe

그런 다음 "ssh foo"를 실행하면 SSH는 SSH to johndoe@a을 실행 netcat( nc) 한 다음 webby@foo이 터널 을 통해 SSH를 수행합니다 . 마법!

물론이를 위해서는 게이트웨이 서버에 netcat을 설치해야합니다. 이 패키지는 모든 주요 배포 및 OS에 사용할 수 있습니다.


우수한! 나는 그것을 알아 내려고 노력했다. 나는 결코 그 정확한 상황에 처한 적이 없었다. 앞으로 덜 구체적인 상황에 처한 다른 사람에게 도움이 될 수 있도록 대답을 계속하겠습니다.
Kyle Brandt

내 연결의 자세한 출력을 포함하여 원래 질문을 업데이트했습니다. netcat을 사용할 수없는 것 같습니다. 기본적으로 사용 가능해야합니까?
Simone Carletti

항상 그런 것은 아닙니다. 설치할 힘이 있습니까? 텔넷으로도이 작업을 수행 할 수있을 것입니다. 시도한 적이 없습니다 ...
Kyle Brandt

netcat을 홈 디렉토리로 다운로드하여 컴파일 할 수도 있습니다. 프록시 명령에서 전체 경로를 사용할 수 있습니다. 예 : / home / userName / bin / nc
Kyle Brandt

방금 시스템 설정을 확인했습니다. 우분투에서 netcat은 기본적으로 사용 가능한 것으로 보이지만 불행히도 게이트웨이 서버는 OpenSUSE에 의해 구동됩니다. 게이트웨이 서버에도 netcat을 설치하는 것을 고려할 것입니다.
Simone Carletti

7

netcat을 릴레이로 사용하기 위해 ~ / .ssh / config 파일에서 ProxyCommand 지시문을 사용할 수 있습니다.

host server2
    ProxyCommand ssh server1 nc server2 22

당신은 'ssh server2'를 사용할 것입니다. 이 지시어에 대한 매뉴얼 페이지 정보는 'man ssh_config'에 있습니다.


5

게이트웨이 서버에 대해 사전 인증 된 터널을 유지 관리하는 다른 접근 방식을 선호합니다. 에서 ~/.ssh/config:

Host a
    ControlMaster auto
    ControlPath ~/.ssh/control-master/%r@%h:%p

그런 다음 .bashrc:

s () {
        if ( ssh -O check a 2>&1 > /dev/null 2>&1 )
        then
                ssh -t a ssh $1
        else
                if [[ -S ~/.ssh/control-master/insyte@a:22 ]]
                then
                        echo "Deleting stale socket..."
                        rm ~/.ssh/control-master/insyte@a:22
                fi
                echo "Opening master session..."
                if ssh -Nf a
                then
                         ssh -t a ssh $1
                fi
        fi
 }

따라서 foo에 연결하려면 다음을 수행하십시오.

s foo

처음 연결하면 "a"에 대해 사용자를 인증하고 지속적인 배경 ssh 터널을 엽니 다. "s"에 대한 후속 호출은 사전 인증 된 터널을 통해 거의 즉시 열립니다.

잘 작동합니다.


2

이 유형의 기능은 최신 버전의 OpenSSH에 있으며 다음을 수행하여 사용할 수 있습니다.

ssh -W server2 server1

server2목적지는 어디 이며 server1프록시 호스트는 어디 입니까? ProxyCommandssh 설정 의 옵션 을 사용하면 다음과 같이 쉽게 할 수 있습니다 .

host = *.example.com
user = packs
port = 22
ProxyCommand ssh -W %h:%p server1

이것이 작동하려면 데스크탑, 중개자, 목적지의 세 위치 모두에서 OpenSSH 5.4+가 필요합니다. (첫째, 마지막).
Steve Bennett

@SteveBennett : 나는이 방법을 한동안 사용 해 왔으며 꽤 잘 작동합니다. 두 개의 RHEL5 시스템에서 netcat 방법으로 되돌려 야했는데, 이는 성가신 일이었습니다.
Scott Pack

2

netcat프록시에 사용할 수없는,이 트릭을 시도 :

host foo
  User webby      
  ProxyCommand ssh a 'exec 3<>/dev/tcp/foo/22; cat <&3 & cat >&3;kill $!'

host a
  User johndoe

그럼 당신은 할 수 있어야합니다 ssh foo.

또한 최신 버전의 ssh가있는 경우 (예 : -W표준 입력 및 출력 전달 명령으로) 다음을 사용할 수 있습니다.

host foo
  User webby
  ProxyCommand ssh -W foo:%p a

host a
  User johndoe

마지막으로, 사용자 이름 차이로 인해 특정 경우에는 작동하지 않기 때문에 멋지다는 사실 때문에 친구의 블로그 게시물 은 이러한 종류의 일을 동적이고 재귀 적으로 SSH 프록시를 체인화하는 방법을 지적합니다 (일부 것들과 함께) 잘 작동하지 않습니다) :

host */*
  ProxyCommand ssh ${$(dirname %h)/\%%/@} nc ${$(basename %h)#*%%} %p

그리고 터널을 통과 ssh machine1/machine2하여 쉘을 주어야합니다 .machine2machine1

사용자 정의 사용하는 경우 궁금 sed명령 대신을 dirname하고 basename다른 사용자 이름으로 문제를 해결할 수 있는가?


2

이 작업을 수행하여 수행 할 수 있습니다 ssh -At johndoe@a ssh webby@foo. 이 -A명령은 ssh 에이전트를 전달하므로 (프록시에서 다시 인증하지 않아도 됨) -t터미널이 프록시에 있는지 확인하십시오. 다음 bash 함수가 유용 할 수 있습니다.

ssh-bounce () {
    local cmd=""
    for i in "$@"; do
        cmd+="ssh -At $i "
    done
    $cmd
}

이것이 가장 간단한 해결책입니다. 이제 또 다른 35 개의 투표가 필요합니다. (Btw the -A는 나를 위해 아무것도하지 않습니다.)
Steve Bennett

0
weppos:~ weppos$ ssh foo -vv
[..]
bash: nc: command not found

에 Netcat이 설치되어 있지 않습니다 a. 당신이 실행하면 ssh host "command arg", command에 실행 host하지 로컬 컴퓨터에.


예, 알아요 이것은 내가 울퉁불퉁 한 대답에 대한 의견으로보고 한 것입니다. :)
Simone Carletti

0

OpenSSH 7.3 (2016-08-01) 이후 하나 이상의 SSH 요새 또는 "점프 호스트"를 통해보다 간단한 간접 지정을 허용하기 위해 ProxyJump옵션 및 해당 -J명령 행 플래그를 사용할 수 있습니다.

Womble의 솔루션nc 에서 찾은 외부 명령 에 대한 의존성을 제거합니다 .

ssh -J johndoe@a webby@foo 

a사용자 johndoe로 워크 스테이션에서 게이트웨이 서버 로 SSH 연결을 설정 하고 SSH 세션을 터널링하여 사용자 Webby의 foo를 호스트하십시오.

이를 단순화하기 위해 귀하 ~/.ssh/config와 귀하 모두에 대한 호스트 정의를 작성 하면됩니다.ssh foo

Host a
    User johndoe

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