특정 서버를 통해 호스트에 연결하려면 ProxyJump
ssh 구성의 명령을 사용하거나 터미널에서 다음 명령을 사용하여 직접 연결할 수 있습니다.
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
이것이 귀하의 사용 사례에 맞지 않으면 언제든지 자세한 내용을 제공해주십시오.