gamma
나는 직장에서 지속적으로 실행되는 서버를 가지고 있습니다 . 때로는 집에서 연결하는데, 이 경우에는 공용 IP 주소를 사용합니다 55.22.33.99
. 때로는 직장에서 패킷이 불필요하게 바운싱되는 대신 로컬 IP 주소를 통해 연결합니다 192.168.1.100
.
현재 나는 그것들을 두 개의 다른 항목으로 나눕니다.~/.ssh/conf
Host gamma-local
HostName 192.168.1.100
Port 22
User andreas
Host gamma-remote
HostName 55.22.33.99
Port 12345
User andreas
따라서 직장에 있는 경우에는 을 입력하고 ssh gamma-local
, 집에 있는 경우에는(또는 세계 어느 곳에서나) 을 실행합니다 ssh gamma-remote
.
서버에 연결할 때 위치에 따라 다른 이름을 입력할 필요가 없고 해당 부분이 자동으로 수행되기를 원합니다. 예를 들어 어떤 경우에는 그렇지 않은 사람들을 연결하는 자동화된 스크립트가 있습니다. 내가 어디에 있는지 알아요.
가지다이 문제를 해결하려면 Bash 스크립트를 사용하십시오.먼저 로컬로 연결을 "시도"하고, 연결할 수 없으면 원격 IP 주소에 연결해 보십시오. 이것은 괜찮지만 (1) 비효율적인 것 같습니다(특히 항상 오류를 즉시 다시 보내지는 않기 때문에 연결이 시간 초과될 때까지 "대기"해야 하는 경우가 있기 때문입니다). (2) Bash와 스크립트 드래그가 필요합니다.
Bash 스크립트를 사용하지 않거나 연결이 먼저 작동하는지 "테스트"하지 않고 이를 달성하는 또 다른 방법이 있습니까?
답변1
현재 연결된 네트워크를 식별할 수 있는 방법이 있는 경우 Match
키워드를 사용할 수 있습니다.~/.ssh/config
당신이 원하는 것을하십시오. 이를 위해서는 OpenSSH ≥6.5가 필요합니다.
나는 다음과 같은 것을 사용합니다
Match originalhost gamma exec "[ x$(/sbin/iwgetid --scheme) != xMyHomeESSID ]"
HostName 192.168.1.100
Port 22
Host gamma
User andreas
Port 12345
HostName 55.22.33.99
그래서 저는 SSH 연결을 위해 집에 있는지 확인하기 위해 사용하고 있는 Wi-Fi 네트워크의 식별자를 사용합니다. 하지만 컴퓨터에 할당된 IP 주소나 두 네트워크를 구별할 수 있는 다른 것을 확인하는 것도 사용할 수 있습니다.
답변2
직장에 개인 네임서버가 있고 직장과 집에서 동일한 노트북을 사용하는 경우 다음과 같은 목적으로 활용할 수 있습니다.
nsswitch.conf
DNS를 먼저 확인하도록 컴퓨터 를 수정하세요gamma
192.168.1.100으로 확인되도록 사무실의 개인 DNS에 DNS 항목을 만듭니다.gamma
55.22.33.99로 확인되도록 컴퓨터의 /etc/hosts 파일에 항목을 만듭니다 .
이렇게 하면 ssh gamma
사무실에 있을 때 사무실 DNS에서 192.168.1.100으로 확인되고, 집에서 연결할 때 호스트 파일에서 55.22.33.99로 확인됩니다.
폴리스티렌: 이 답변은 감마가 공개 DNS 항목을 갖는 것을 원하지 않는다고 가정합니다. 또한 Windows 시스템에서 서버로 SSH를 연결하는 경우 호스트 파일 항목을 재정의하려면 nssswitch.conf 파일과 동등한 파일이 있어야 한다고 생각합니다.
답변3
몇 년 전에 제가 쓴 적이 있어요.프로그램비슷한 목적으로. 이는 귀하의 요구에 적합할 수 있습니다. 이 프로그램을 사용하면 SSH 구성은 다음과 같습니다.
Host gamma
ProxyCommand ssh-multipath-proxy 192.168.1.100:22 55.22.33.99:12345
User andreas
답변4
~/.ssh/config
IP 주소를 호스트 이름으로 사용하는 경우에는 불가능합니다. 다른 IP 주소뿐만 아니라 다른 포트에도 연결한다는 사실은 DNS 확인자에 대한 조정을 거의 배제하므로 추가적인 복잡성을 초래합니다.
Match originalhost ... exec ...
수정했습니다 - 조합을 사용할 수 있습니다 ~/.ssh/config
- 참조@MichałPolitowski의 답변. 그러나 OpenSSH에서는 완벽하게 작동하지만 다른 SSH 클라이언트에서는 유사한 기능을 반드시 찾을 수는 없습니다.
ssh
현재 있는 네트워크를 확인하고 적절한 항목을 사용하는 간단한 래퍼(다양한 쉘에서 사용해야 하는 경우 쉘 함수 또는 스크립트)를 사용하여 이 문제를 해결할 수 있습니다 Host
. 가장 큰 문제는 현재 사용 중인 네트워크를 어떻게 안정적으로 감지할 수 있느냐는 것입니다. 로컬 IP 주소를 생각하겠지만 회사 네트워크와 동일한 서브넷을 사용하여 LAN에서 연결하고 있을 가능성이 높으므로 이는 신뢰할 수 없습니다.
로컬 및 원격 네트워크 모두에 동일한 포트를 사용할 수 있는 경우 /etc/resolv.conf
현재 사용 중인 네트워크에 맞게 편집할 수 있습니다. 물론 자동으로 수행되어야 합니다(대개 DHCP 클라이언트용 후크 스크립트를 통해). 또는 - 더 나은 - 로컬 네임서버를 실행합니다(예:dnsmasq
) 적절한 구성을 제공합니다. 그러나 이것은 이 질문의 범위를 벗어납니다.
또 다른 옵션(대화형 연결만 필요한 경우)은 스캔 가능한 명령 완성 기능을 사용하는 것입니다 ~/.ssh/config
. 이렇게 하면 입력 시간이 절약됩니다(특히 입력 내용이 충분히 많은 경우 Host
). 다음과 같은 것( bash
초기화용):
# complete session names for ssh
declare -g _ssh_complete_hostlist 2> /dev/null
function _ssh_complete_init () {
_ssh_complete_hostlist=$( \
sed -nr '/^\s*Host\s*=/{s/^[^=]+= *//;s/ /\n/g;p}' ~/.ssh/config \
| sort )
}
_ssh_complete_init
function _ssh_complete () {
local match=${COMP_WORDS[${COMP_CWORD}]}
local hosts=
local default=
for h in $_ssh_complete_hostlist; do
if [[ $h =~ ^$match ]]; then
hosts="$hosts $h"
fi
done
if ! (( ${COMP_CWORD} == ${#COMP_WORDS[@]}-1 )); then
default=$( compgen -f ${COMP_WORDS[${COMP_CWORD}]} )
fi
COMPREPLY=($hosts $default)
}
complete -F _ssh_complete ssh
첫 번째 함수는 호스트 완료 목록을 생성하고(보통 각 셸에서 한 번만 실행하면 충분함), 두 번째 함수는 비록 다소 서투른 방식이지만 실제 완료를 수행합니다. 호스트 이름이 다음과 같은 경우에만 호스트 이름을 완성합니다. 명령줄의 마지막 토큰입니다.
요약하자면, 이 문제를 해결하는 올바른 방법은 VPN을 통해 회사 네트워크에 연결하여 사무실에서와 마찬가지로 로컬 회사 IP 주소에 액세스할 수 있도록 하는 것입니다. 그런 다음 원하는 레이어 ~/.ssh/config
또는 /etc/resolv.conf
(IMHO가 가장 좋은 옵션) 사무실 이름 서버에 주소를 직접 연결할 수 있습니다.