~ / .Ssh / config içinde Koşullu ProxyCommand?


14

Benim var ~/.ssh/configfirmamız VPN sırasında veya SSH vekil sunucu üzerinden ya erişilebilir çeşitli bilgisayarlar ile yapılandırılmış.

Şu anda sadece

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

Dahili ağdayım, ancak dahili ip'e doğrudan erişebilirim, bu nedenle harici sunucu üzerinden proxy yapmak yalnızca bağlantıya bir gecikme ekler.

Dahili ip erişilemiyorsa geçici olarak proxy yapabileceğim ve başka türlü doğrudan bağlanabileceğim bir yol var mı?

Yanıtlar:


8

Genellikle böyle bir şey kurarım. Ara ana bilgisayarın adı çözümleyebileceğini varsayar.

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

Bu yüzden beğenmek için bağlanırdım ssh blah%homeproxy.


Google-fu'm beni başarısız ediyor. Bunu daha fazla açıklayabilir misiniz? Bu *% sözdizimini daha önce hiç görmedim.
fukawi2

3
%Karakter hakkında özel bir şey yok . Gerçekten her şeyi kullanabilirsiniz. Yüzde, bir ana bilgisayar adında veya kullanıcı adında geçerli olmadığından kullanılır. cutProxyCommand withing komutu kullanan %hostname dışarı çekmek için ayırıcı olarak.
Zoredache

1
Bu iyidir, ancak ssh takma adı yerine tam ana bilgisayar adını hecelemek zorunda olduğum anlamına gelir.
alt

@mobiusnz Aslında, her farklı bağlantı aracı için farklı bir isme ihtiyacınız olduğu anlamına gelir . Benim durumumda, örneğin, eğer evdeysem, evden hedefssh targetH anlamına gelir . Yerel bir ağda hedeflemek için, basitçe . Yine de bu sorunun cevabında daha açık bir şekilde ifade edilmesi güzel olurdu. ssh target
Rubens

4

Match'i kullanarak farklı bir yöntem kullanıyorum. Benim durumumda, çalışıyorsa ya da çalışmıyorsa yerel bir proxy kullanmak istiyorum. Aşağıdaki yönerge bunu iyi bir şekilde yerine getirmektedir:

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

Her ssh girişimiyle eşleşir ve proxy'imin nc1086'da çalışıp çalışmadığını görmek için hızlı bir denetim gerçekleştirir (bu durumda, nchatasız çıkar). Bu durumda, ProxyCommand değerini ayarlar.


2

On yıl önce bu tür bir senaryo için bir proxy komutu yazdım . Kullanım durumunda benim proxy komutu şu şekilde kullanılabilir:

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

Birkaç uyarı: IPv6'yı işlemediğini ve ana bilgisayar adı başına yalnızca tek bir IP adresi deneyeceğini itiraf etmek biraz utanıyorum. Ayrıca, sunucu başlığı gönderilmeden önce istemci başlığını sunucuya aktarmaz. Ancak bunun sorun yaratması pek olası değildir.


2

@ Till'nin cevabı için teşekkürler , bana çok ilham verdi.

İle bağlantınızı zorla yeniden yönlendirebileceğinizi buldum ProxyCommand nc dst dst-port.

Örneğin, Sen aslında bağlanacak B.comkullanırsanız

ssh A.com -o ProxyCommand="nc B.com 22"

Ancak UserKnownHostsFileyine deA.com

Böylece, sitenize "otomatik" 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'

Ben yerini nc -w 1 %h %pile (timeout 0.1 nc -z %h %p) && nc %h %pdaha az sonra 100ms iç-sunucu ulaşabilir eğer daha hızlı olacaktır.

Veya yerine geçebilirsiniz ping, ancak gibi bir TCP tabanlı proxy kullanıyorsanız proxychainsveya sunucu bir ICMP yankısına izin vermiyorsa, bu kötü bilgileri gösterebilir .

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)Dahili sunucuda olup olmadığınızı algılayan herhangi bir şeyle değiştirebilirsiniz .

Birden fazla aday IP'niz varsa, bunu bile kullanabilirsiniz:

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'

Bağlanmaya çalışır 1.1.1.1, başarısız olursa bağlanmaya çalışır 2.2.2.2ve sonra 3.3.3.3.


0

Bu, küçük bir ek 0.1 saniye gecikmeyle biraz daha otomatik olarak çalışır:

Host proxyhost.example.com
ProxyCommand none

Host *.example.com
ProxyCommand sh -c "socat 2>/dev/null - tcp4:%h:%p,connect-timeout=0.1 || exec ssh -W  %h:%p proxyhost.example.com"

0

Genellikle böyle bir şey başka bir giriş oluşturmak istiyorum -

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

Host myVM-np
    User ubuntu

Ardından, geçerli proxy ortamınıza bağlı olarak istediğinizi çağırmanız yeterlidir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.