답변:
나는 보통 이런 식으로 설정합니다. 중간 호스트가 이름을 확인할 수 있다고 가정합니다.
Host *%homeproxy
ProxyCommand ssh user@proxyhost /bin/netcat -w 1 $(echo %h | cut -d%% -f1) 22
그래서에 연결합니다 ssh blah%homeproxy.
%캐릭터 에는 특별한 것이 없습니다 . 실제로 무엇이든 사용할 수 있습니다. 호스트 이름 또는 사용자 이름에 유효하지 않기 때문에 백분율이 사용됩니다. cutProxyCommand withing에 명령을 사용하여 %호스트 이름을 꺼내 구분자로.
ssh targetH 의미하는을 사용 합니다 . 로컬 네트워크에 타겟팅하려면 간단히 ssh target. 그래도 대답에 더 직접적으로 언급하는 것이 좋았습니다.
10 년 전에 저는 이런 종류의 시나리오에 대한 프록시 명령 을 작성 했습니다 . 사용 사례에서 내 프록시 명령을 다음과 같이 사용할 수 있습니다.
Host internal-server
ProxyCommand ssh-multipath-proxy %h:%p -- ssh -W %h:%p external-server
몇 가지주의 사항 : IPv6을 처리하지 않으며 호스트 이름 당 단일 IP 주소 만 시도한다는 점을 인정하기가 조금 당혹 스럽습니다. 또한 서버 배너가 전송되기 전에 클라이언트 배너를 서버로 전송하지 않습니다. 그러나 이것은 문제를 일으키지 않을 것입니다.
@ till 's Answer에 감사드립니다 .
와의 연결을 강제로 리디렉션 할 수 있음을 발견했습니다 ProxyCommand nc dst dst-port.
예를 들어 실제로 B.com사용하면
ssh A.com -o ProxyCommand="nc B.com 22"
그러나 UserKnownHostsFile여전히A.com
따라서 도메인에 "자동"도메인을 추가 할 수 있습니다. ssh_config
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c '(timeout 0.1 nc -z %h %p) && nc %h %p || ssh -W %h:%p external-server'
내가 교체 nc -w 1 %h %p로 (timeout 0.1 nc -z %h %p) && nc %h %p적은 다음이 100ms를 내부 서버에 도달 할 수 있다면 더 빠른 것입니다.
또는로 대체 할 수 ping있지만과 같은 TCP 기반 프록시를 사용 proxychains하거나 서버에서 ICMP 에코를 허용하지 않는 경우 잘못된 정보를 나타낼 수 있습니다 .
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c '(ping %h &>/dev/null) && nc %h %p || ssh -W %h:%p external-server'
(timeout 0.1 nc -z %h %p)내부 서버에 있는지 여부를 감지하는 것으로 바꿀 수 있습니다 .
후보 IP가 여러 개인 경우 다음을 사용할 수도 있습니다.
Host auto.internal-server
Hostname {internal-server ip or domain}
ProxyCommand bash -c 'f(){(timeout 0.1 ping -c 1 $1 &>/dev/null) && nc $1 %p;}; f 1.1.1.1 || f 2.2.2.2 || f 3.3.3.3'
그것은 연결을 시도합니다 1.1.1.1연결을 시도 실패하면 2.2.2.2다음과 3.3.3.3.
나는 일반적으로 이와 같은 다른 항목을 만들 것입니다-
Host myVM
ProxyCommand ssh -W internal.ip:22 external-server
User ubuntu
Host myVM-np
User ubuntu
그런 다음 현재 프록시 환경에 따라 원하는 것을 호출하십시오.