~ / .ssh / config의 조건부 프록시 명령?


14

내 한 ~/.ssh/config우리 회사의 VPN에있는 동안, 또는 SSH 프록시 서버를 통해 중 액세스 할 수있는 다양한 호스트로 구성.

지금 막 나는

Host internal-server
    ProxyCommand ssh -W internal.ip:22 external-server

그러나 내부 네트워크에 있으면 내부 IP에 직접 액세스 할 수 있으므로 외부 서버를 통한 프록시는 연결 지연을 추가합니다.

내부 IP에 접근 할 수없는 경우 임시로 프록시 할 수있는 방법이 있습니까?

답변:


8

나는 보통 이런 식으로 설정합니다. 중간 호스트가 이름을 확인할 수 있다고 가정합니다.

Host *%homeproxy
    ProxyCommand ssh user@proxyhost /bin/netcat -w 1 $(echo %h | cut -d%% -f1) 22

그래서에 연결합니다 ssh blah%homeproxy.


내 Google Fu가 실패합니다. 이것에 대해 더 자세히 설명해 주시겠습니까? 나는이 * % 구문을 본 적이 없다.
fukawi2

3
%캐릭터 에는 특별한 것이 없습니다 . 실제로 무엇이든 사용할 수 있습니다. 호스트 이름 또는 사용자 이름에 유효하지 않기 때문에 백분율이 사용됩니다. cutProxyCommand withing에 명령을 사용하여 %호스트 이름을 꺼내 구분자로.
Zoredache

1
이것은 좋지만 ssh 별칭 대신 전체 호스트 이름을 입력해야 함을 의미합니다.
alt

@mobiusnz 실제로는 서로 다른 연결 수단 마다 다른 이름이 필요하다는 것을 의미 합니다. 예를 들어 집에있는 경우 집에서 target을ssh targetH 의미하는을 사용 합니다 . 로컬 네트워크에 타겟팅하려면 간단히 ssh target. 그래도 대답에 더 직접적으로 언급하는 것이 좋았습니다.
Rubens

4

Match를 사용하는 다른 방법을 사용합니다. 필자의 경우 로컬 프록시가 실행 중이거나 그렇지 않은 경우 로컬 프록시를 사용하고 싶습니다. 다음 지시문은 이것을 훌륭하게 수행합니다.

Match Exec "nc -z 127.0.0.1 1086"
    ProxyCommand nc -X 5 -x 127.0.0.1:1086 %h %p

모든 ssh 시도와 일치하며 빠른 nc프록시를 사용하여 프록시가 1086에서 작동하고 있는지 확인합니다 (이 경우 nc오류없이 종료). 이 경우 ProxyCommand가 설정됩니다.


2

10 년 전에 저는 이런 종류의 시나리오에 대한 프록시 명령 을 작성 했습니다 . 사용 사례에서 내 프록시 명령을 다음과 같이 사용할 수 있습니다.

Host internal-server
    ProxyCommand ssh-multipath-proxy %h:%p -- ssh -W %h:%p external-server

몇 가지주의 사항 : IPv6을 처리하지 않으며 호스트 이름 당 단일 IP 주소 만 시도한다는 점을 인정하기가 조금 당혹 스럽습니다. 또한 서버 배너가 전송되기 전에 클라이언트 배너를 서버로 전송하지 않습니다. 그러나 이것은 문제를 일으키지 않을 것입니다.


2

@ 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.


0

방화벽 뒤에 있지 않고 방화벽이 거부하지 않으면 약간의 추가 1 초 지연으로 조금 더 자동적으로 작동합니다.

Host proxyhost.example.com
ProxyCommand none

Host *.example.com
ProxyCommand sh -c "nc -w 1 %h %p || ssh -W  %h:%p proxyhost.example.com"

0

나는 일반적으로 이와 같은 다른 항목을 만들 것입니다-

Host myVM
    ProxyCommand ssh -W internal.ip:22 external-server
    User ubuntu

Host myVM-np
    User ubuntu

그런 다음 현재 프록시 환경에 따라 원하는 것을 호출하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.