개념

개념

특정 서버를 통해 호스트에 연결하려면 ProxyJumpssh 구성의 명령을 사용하거나 터미널에서 다음 명령을 사용하여 직접 연결할 수 있습니다.

ssh -J user@server user@target-host

매뉴얼에는 건너뛸 첫 번째 프록시가 있고 처음에 뛰어든 네트워크로 보호되는 다른 서브넷이 있는 경우 여러 서버를 건너뛸 수도 있다고 명시되어 있습니다. 여러 점프 서버를 제공하면 간단히 이 작업을 수행할 수 있습니다.

ssh -J user@server1,user@server2  user@target-host

...그래서 server1먼저 기본 네트워크로 이동한 다음 다시 server2보호된 서브넷으로 이동합니다.

그러나 지금까지는 대체 점프 서버(예: 유지 관리를 위해 메인 서버가 다운된 경우)에 대한 정보를 매뉴얼에서 찾을 수 없습니다.

target-host연결하려는 항목이 있고 중복성 이유로 항목이 여러 개 있다고 가정합니다 (예 main-server1: main-server2, main-server3, ...). 그중에서 이동할 항목을 선택할 수 있습니다.

main-server1유지보수 또는 기타 이유로 다운타임이 발생하는 경우에도 main-server2, , ...을 통해 main-server3연결할 수 있습니다.

ssh먼저 연결을 시도했지만 main-server1실패하고 작업을 취소하지 않고 다음 사용 가능한 서버를 통해 계속 연결을 시도하도록 자동으로 구성할 수 있는 방법이 있습니까 ?

답변1

나는 우연히 우연히 발견했다이 블로그 게시물~에서오스틴 밀른그는 SSH 구성에서 자동 폴백 동작을 구현하는 방법을 자세히 설명합니다. 다음 제안은 그의 게시물을 기반으로 합니다. 자세한 내용은 언제든지 참조하거나 여기에 의견을 남겨주세요.

개념

SSH Config Match지시문을 사용하면 특정 호스트에 연결하기 전에 명령을 실행할 수 있습니다.SSH 구성 매뉴얼 페이지:

     Match   Restricts the following declarations (up to the next Host
             or Match keyword) to be used only when the conditions
             following the Match keyword are satisfied.  Match

이를 사용하여 특정 IP에서 실행 중인 서비스를 확인할 수 있습니다. 예를 들면 다음과 같습니다.

Match host mycomputer exec "nc -G 1 -z 192.168.1.11 %p"
Match host mycomputer exec "ping 192.168.1.11"

mycomputer그런 다음 지정된 명령이 성공한 경우에만 연결하십시오.

귀하의 경우 두 가지 구성 블록을 구현할 수 있습니다.

  • target-server액세스 권한이 있으면 일치하고 직접 연결하세요.
  • target-server액세스 권한이 없는 경우 점프 호스트에 프록시를 사용하여 일치시킵니다.

여기서 한 가지 문제는 현재 네트워크에 유사한 기능을 가진 다른 서버가 있지만 예상과 다른 경우 target-server알 수 없는 서버에 직접 연결을 시도하기 때문에 스크립트가 실패한다는 것입니다(이것이 잠재적인 행위를 포함하여 악의적인 행위자인 경우). 위험)

더 나아가

연결을 시도하기 전에 신원을 확인하려면 호스트 키를 사용하고 target-server이를 클레임에서 예상한 키와 Match비교할 수 있습니다.

연결되면 원하는 서버에 호환되는 호스트 키가 있는지 확인할 수 있습니다.

  • 그렇다면 이것은 귀하의 target-server것이며 직접 연결을 시도할 수 있습니다
  • 그렇지 않은 경우 점프 호스트를 사용한 대체 연결이 사용됩니다.

Match한 줄 명령만 허용됩니다. 가독성을 위해 쉘 스크립트를 사용하고 Match명령에서 실행합니다.

예를 들어 추가할 스크립트는 ~/.ssh/scripts/check-host-fingerprints.sh다음과 같습니다.

#!/bin/bash

tmpfile=$(mktemp /tmp/check-host-fingerprints.tmp.XXXXXX)
ssh-keyscan $1 2>/dev/null > $tmpfile
fingerprints=$(ssh-keygen -lf $tmpfile | awk '{print $2}')

for fingerprint in $fingerprints
do
    if [ "$fingerprint" == "$2" ];
    then
        exit 0
    fi
done

exit 1

참고: Austin은 자신의 블로그 게시물에서 Windows용 스크립트와 구성도 제공합니다.

그런 다음 IP 주소가 필요하고 target-server(참고) 다음 명령을 실행하십시오.

ssh -v <target-server>

그리고 다음과 같이 HOST_KEY를 꺼냅니다.debug1: Server host key ssh-xxxxxx <HOST_KEY(SHA256:.*)>

이제 SSH 구성에 다음 줄을 추가하여 자동 장애 조치를 활성화할 수 있습니다 ~/.ssh/config.

Match host auto-failover exec "/bin/bash %d/.ssh/scripts/check-host-fingerprint.sh <TARGET-SERVER-IP> <TARGET-SERVER-HOST-KEY>"
        <DIRECT-CONFIG>

Host auto-failover
        <JUMPHOST-CONFIG>

<TARGET-SERVER-IP><TARGET-SERVER-HOST-KEY>이전에 수집한 값으로 교체

DIRECT-CONFIG호스트에 직접 연결하는 데 사용하는 구성입니다(즉, 로컬 시스템 간의 직접 연결이 target-server가능한 경우).

JUMPHOST-CONFIG점프 호스트 연결을 통해 접속해야 할 때 사용되는 구성입니다.target-server

이것이 귀하의 사용 사례에 맞지 않으면 언제든지 자세한 내용을 제공해주십시오.

관련 정보