`ssh foo.bar`가 `foo.internal.bar`에 연결되도록 ~/.ssh/config를 어떻게 구성합니까?

`ssh foo.bar`가 `foo.internal.bar`에 연결되도록 ~/.ssh/config를 어떻게 구성합니까?

공개된 시스템이 있습니다(예: server1.foo.bar) 개인적으로 구문 분석할 수 있습니다(예: server1.내부.foo.bar) DNS 이름. SSH 연결은 개인 IP를 통해서만 가능하지만 저는 항상 공개 이름을 기반으로 이러한 호스트를 고려합니다.

제 생각에는:

  • *.internal.bar패턴 사용을 기억하는지 여부에 관계없이 올바른 IP에 연결합니다.
  • 키 입력 저장

알아요대체 태그이는 %h명령줄에 제공된 호스트 이름을 수정하는 데 사용할 수 있습니다.

Host foo
    Hostname %h.some.other.domain

내가 찾고 있는 행동은 다음과 같습니다.

Host *.foo.bar
    Hostname %m.internal.foo.bar

여기서 %m주어진 호스트 이름으로 부분만 대체됩니다.첫 번째 지점까지. 나도 man 5 ssh_config읽었다https://man.openbsd.org/ssh_config그리고 답을 찾을 수 없습니다(존재하는 경우). 저는 macOS 10.15.4를 사용하고 있습니다:

$ ssh -V
OpenSSH_8.1p1, LibreSSL 2.7.3

답변1

나는 일하는 방법을 알아 냈습니다. 조금 추악하지만 작동합니다. 이는 ProxyCommand지시문 을 사용합니다 (참조:맨페이지) 작은 bash 도우미 스크립트와 결합되었습니다.

  1. 다음과 같은 섹션을 추가하세요.~/.ssh/config— 다시 매핑하려는 각 도메인당 하나씩:
Match final host="!*.corp.foo.com,*.foo.com"
    ProxyCommand ssh_ext2int %h %p

Match final host="*.quux.biz"
    ProxyCommand ssh_ext2int %h %p
  1. $PATH어딘가에 저장하세요 .ssh_ext2int——그리고 chmod u+x그것은:
#!/usr/bin/env bash

[ $# -eq 2 ] || exit 1
typeset -A dmap
dmap=(
  [foo.com]=corp.foo.com
  [quux.biz]=internal.qux.lan
)

d=${1#*.}
h=${1%%.*}
nd=${dmap[$d]:-$d}

/usr/bin/nc -w 120 $h.$nd $2 2>/dev/null

이제 ssh server158247.quux.biz다음으로 연결됩니다.server158247.internal.qux.lan

답변2

귀하가 요구하는 특정 사항은 OpenSSH에서는 불가능합니다. 이러한 구성은 실제로 사용자가 요청하는 복잡한 대체가 아닌 간단한 별칭에 대해서만 작동합니다. 이러한 서버가 특정 형식을 갖고 있는 경우 별칭으로 만들 수 있습니다(도메인 이름 없음).

Host server*
    Hostname %h.internal.foo.bar

좀 더 복잡한 별칭 일치가 필요한 경우(모든 호스트가 포함된 파일이 있다고 가정합니다. 수동으로 생성하거나 DNS에서 자동으로 업데이트할 수 있음) 다음과 같은 것을 사용할 수 있습니다.

Match exec "grep %h %d/.ssh/internal_hosts"
    Hostname %h.internal.foo.bar

마지막 수단은 위의 목록/DNS에서 ssh_config를 생성하는 것입니다. 여기에는 모든 호스트에 대해 하드코딩된 전체 항목이 포함됩니다. 기본 프로필일 필요는 없으며 일부 프로필만 포함하면 됩니다. 구성 파일은 실제로는 단순한 텍스트 파일입니다.

관련 정보