여러 호스트 주소/포트/등에 대해 동일한 SSH 별칭을 사용하는 방법은 무엇입니까?

여러 호스트 주소/포트/등에 대해 동일한 SSH 별칭을 사용하는 방법은 무엇입니까?

문제는 이것이다: 나는 적어도 3개의 서로 다른 네트워크(때로는 직접, 때로는 프록시를 통해)에서 액세스할 수 있는 시스템에 서로 다른 시간에 SSH를 통해 액세스하려고 합니다.

직접 연결은 중간 호스트를 통해 연결하는 것보다 빠르고 안정적이며, 이는 일반 인터넷을 통해 연결하는 것보다 빠르고 안정적이므로 SSH가 우선 순위에 따라 3가지 다른 방법으로 연결을 시도하고 첫 번째 방법을 선택하도록 합니다. 그게 성공합니다.

분명히 그들은 모두 동일한 시스템이므로 연결 위치에 따라 3개의 다른 별칭 중에서 수동으로 선택하고 싶지 않습니다.

그러나 이 문제를 해결할 수 있는 메커니즘을 찾을 수 없습니다. 심지어 이런 일이 가능합니까?

그렇지 않다면, 사람들은 일반적으로 이 상황에서 무엇을 합니까?

답변1

별칭을 사용하여 연결하지 마세요 ssh! 올바른 것을 사용하세요 ssh_config. ~/.ssh/config정말 강력한 기능이 있습니다.

현재 어느 네트워크에 있는지 식별할 수 있다고 가정합니다. 예를 들어 IP를 사용하여 다음 hostname -I과 같은 구성을 작성해 보겠습니다.

# in network1 I am getting ip from "10.168.*.*" and I need to connect through proxy
Match Host myalias Exec "hostname -I | grep 10\.168\."
  Hostname real-host-IP
  ProxyCommand ssh -W %h:%p proxy-server

# in network2 I am getting IP from "192.168.*.*" and I do not need a proxy
Match Host myalias Exec "hostname -I | grep 192\.168\."
  Hostname real-host-IP

# in network3 I am getting something else

답변2

.bashrc셸의 구성 파일이나 다른 구성 파일에 셸 별칭이나 함수를 저장할 수 있습니다. 예를 들어 Bash 별칭의 경우:

alias my_ssh="
ssh mehrdad@"IP1 ||
ssh tomas@IP2 ||
ssh tomas@IP3
"

그런 다음 별칭을 호출합니다.

 my_ssh

IP1이 실패하면 ||두 번째 명령을 실행합니다. 이제 IP3가 다시 나타납니다.

나는 이것을 테스트하지 않았지만 괜찮을 것입니다. 아니면 적어도 방법을 보여주었습니다.

프록시와 같은 SSH 옵션을 참조하세요 man ssh.

답변3

보안 영향이나 인프라(알 수 없음) 제한을 무시하고 다른 솔루션보다 나은 솔루션이 여러 개 있을 수 있습니다.

  • SSH 역방향 터널을 수행합니다(추악한 해킹).
  • OSPF 또는 BGP의 도움으로 애니캐스트를 설정하고 애니캐스트 VIP에 SSH로 연결합니다.
  • 원격 컴퓨터에 대한 IPsec 터널 설정 - 프록시가 필요하지 않습니다.
  • Tor를 통해 통신
  • 사이트/페이지/Redis/MySQL 서버를 현재 주소로 업데이트하고 ssh 스크립트를 사용하여 이를 가져옵니다.
  • HAProxy를 사용하세요.
  • 동적 DNS.

답변4

이 기능이 작동할 수도 있지만 Thomas의 별칭이 작동한다면 이것이 더 나은 솔루션이라고 생각합니다.

autossh () {

  publicip="11.11.11.11"
  privateip="10.10.10.100"
  proxyhost="10.10.10.10"
  proxyport="9001"
  ssh -o ConnectTimeout=10 $1@$privateip 2> /dev/null && exit 0
  if [ $? -ge 1 ]; then
    ssh -o ConnectTimeout=10 $1@$publicip -o "ProxyCommand=nc -X connect -x $proxyhost:$proxyport %h %p" 2> /dev/null && exit 0
    if [ $? -ge 1 ]; then
      ssh -o ConnectTimeout=10 $1@$publicip 2> /dev/null && exit 0
      if [ $? -ge 1 ]; then
        echo "I think your node is down"
      fi
    fi
  fi

}

관련 정보