Soru Koşullu ProxyCommand ~ / .ssh / config?


Benim elimde ~/.ssh/config Şirketimizde VPN'de veya bir SSH proxy sunucusu üzerinden erişilebilen çeşitli ana bilgisayarlarla yapılandırılmış.

Şu an sadece sahip olduğum

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

Ancak, iç ağdayım, iç IP'ye doğrudan erişebiliyorsam, dış sunucu üzerinden proxy yapmak sadece bağlantı için bir gecikme ekler.

Dahili ip'e ulaşılamıyorsa ve doğrudan başka şekilde bağlanamazsa geçici olarak proxy yapabileceğim bir yol var mı?


10
2017-09-03 21:00


Menşei




Cevaplar:


Genelde böyle bir şey yapıyorum. Ara sunucunun ismi çözebileceğini varsayar.

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

Yani ben gibi bağlanırdım ssh blah%homeproxy.


6
2017-09-03 23:17



Google-fu'm beni başarısız ediyor. Bunu daha fazla açıklayabilir misin? Bunu daha önce hiç görmedim *% sözdizimi. - fukawi2
Hakkında özel bir şey yok % karakter. Gerçekten her şeyi kullanabilirsin. Yüzde, bir ana makine adı veya kullanıcı adı içinde geçerli olmadığı için kullanılır. cut ProxyCommand kullanarak komutu kullanır % ana bilgisayar adını çıkarmak için bir sınırlayıcı olarak. - Zoredache
Bu iyi, ancak bu, ssh takma adı yerine tam ana bilgisayar adını hecelemek zorunda olduğum anlamına geliyor. - alt
@mobiusnz Aslında her bir farklı için farklı bir isme ihtiyacınız olduğu anlamına gelir araç Bağlanıyor. Benim durumumda, örneğin, evdeysem kullanıyorum ssh targetHanlamı evden hedef. Yerel bir ağda hedeflenecekse, sadece ssh target. Yine de bu cevabı daha açık bir şekilde belirtmek güzel olurdu. - Rubens


On yıl önce yazdım bir proxy komutu bu tür senaryolar için. Kullanım durumunuzda proxy komutum şöyle kullanılabilir:

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

Bir kaç uyarı: Ben itiraf etmek için biraz utanıyorum, IPv6 işlemez ve sadece her bir ana bilgisayar adı için tek bir IP adresi dener. Ayrıca, sunucu banner'ı gönderilmeden önce istemci banner'ını sunucuya aktarmaz. Ancak bu problemlere sebep olma ihtimali yoktur.


1
2018-03-06 11:18





İçin teşekkürler @ till'a kadarBu bana çok ilham verdi.

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

Örneğin, aslında B.com Eğer kullanırsan

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

Fakat UserKnownHostsFile hala kayıt olacak A.com

Böylece bir alan adı "auto" ekleyebilirsin. 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 değiştirdim nc -w 1 %h %p ile (timeout 0.1 nc -z %h %p) && nc %h %p 100ms daha az iç sunucuya ulaşırsanız daha hızlı olacaktır.

Veya tarafından değiştirilebilir pinggibi bir TCP tabanlı proxy kullanırsanız, ancak kötü bilgi gösterebilir proxychainsveya sunucu bir ICMP echo'ya izin vermiyor.

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'

Değiştirebilirsiniz (timeout 0.1 nc -z %h %p) Dahili sunucuda olup olmadığını algılayan bir şeyle.

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ışacak 1.1.1.1eğer başarısız olursa bağlanmayı deneyin 2.2.2.2, ve sonra 3.3.3.3.


1
2018-01-12 14:33





Bu, güvenlik duvarının arkasında değilseniz ve güvenlik duvarı reddetmiyorsa, küçük bir ek 1sn gecikme ile biraz daha otomatik olarak çalışır:

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
2018-03-06 09:58