सशर्त ProxyCommand ~ / .ssh / config में?


14

मेरे पास ~/.ssh/configविभिन्न होस्ट्स के साथ कॉन्फ़िगर किया गया है जो हमारी कंपनी वीपीएन या एसएसएच प्रॉक्सी सर्वर के माध्यम से सुलभ हैं।

फिलहाल मेरे पास बस है

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

हालांकि अगर मैं आंतरिक नेटवर्क में हूं तो मैं सीधे आंतरिक आईपी तक पहुंच सकता हूं, इसलिए बाहरी सर्वर के माध्यम से संपर्क करना बस कनेक्ट करने में देरी जोड़ता है।

क्या कोई तरीका है कि मैं अनंतिम रूप से प्रॉक्सी कर सकता हूं अगर आंतरिक आईपी पहुंच योग्य नहीं है, और सीधे कनेक्ट करें अन्यथा?

जवाबों:


8

मैं आमतौर पर कुछ इस तरह से सेटअप करता हूं। यह मानता है कि मध्यवर्ती होस्ट नाम का समाधान करने में सक्षम होगा।

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

तो मैं पसंद करने के लिए कनेक्ट होगा ssh blah%homeproxy


मेरा google-fu मुझे फेल कर रहा है। क्या आप इसे और अधिक समझा सकते हैं? मैंने यह *% सिंटैक्स पहले कभी नहीं देखा है।
fukawi2

3
%चरित्र के बारे में कुछ खास नहीं है । आप वास्तव में कुछ भी उपयोग कर सकते हैं। किसी होस्टनाम, या उपयोगकर्ता नाम में मान्य नहीं होने के बाद से प्रतिशत का उपयोग किया जाता है। cutआदेश ProxyCommand के भीतर का उपयोग करता है %एक परिसीमक होस्ट नाम बाहर निकलने के लिए के रूप में।
ज़ॉडेचेस

1
यह अच्छा है, हालांकि इसका मतलब यह है कि मुझे ssh उर्फ ​​के बजाय पूर्ण होस्टनाम को बाहर करना होगा।
alt

@mobiusnz यह वास्तव में बस का मतलब है कि आप कनेक्ट करने के प्रत्येक विभिन्न साधनों के लिए एक अलग नाम की जरूरत है । मेरे मामले में, उदाहरण के लिए, अगर मैं घर पर हूँ, मैं का उपयोग करें ssh targetH, जिसका अर्थ है घर से लक्ष्य । अगर एक स्थानीय नेटवर्क को लक्षित करने के लिए, बस ssh target। हालांकि यह सीधे उत्तर में अधिक स्पष्ट रूप से कहा गया है अच्छा लगा।
रुबेंस

4

मैं मैच का उपयोग करके एक अलग विधि का उपयोग करता हूं। मेरे मामले में, मैं स्थानीय प्रॉक्सी का उपयोग करना चाहता हूं अगर यह चल रहा है, या नहीं, अगर यह नहीं है। निम्नलिखित निर्देश इसे अच्छी तरह से पूरा करता है:

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

एक दशक पहले मैंने इस तरह के परिदृश्य के लिए एक प्रॉक्सी कमांड लिखा था । आपके उपयोग के मामले में मेरी प्रॉक्सी कमांड का उपयोग इस तरह किया जा सकता है:

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

कैविट्स के एक जोड़े: मैं यह स्वीकार करने के लिए थोड़ा शर्मिंदा हूं, कि यह आईपीवी 6 को संभालता नहीं है, और यह केवल होस्टनाम प्रति एकल आईपी पते की कोशिश करेगा। इसके अलावा, यह सर्वर बैनर भेजे जाने से पहले क्लाइंट बैनर को सर्वर पर स्थानांतरित नहीं करेगा। लेकिन इससे समस्याएं पैदा होने की संभावना नहीं है।


2

@ उत्तर के लिए धन्यवाद , इसने मुझे बहुत प्रेरित किया।

मैंने पाया कि आप अपने कनेक्शन को जबरन रीडायरेक्ट कर सकते हैं 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, लेकिन यदि आप टीसीपी आधारित प्रॉक्सी का उपयोग करते हैं 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

यह एक छोटे से अधिक स्वचालित रूप से काम करता है एक छोटे से अतिरिक्त 0.1 s देरी के साथ:

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

मैं आम तौर पर इस तरह की एक और प्रविष्टि बनाऊंगा -

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

Host myVM-np
    User ubuntu

फिर अपने वर्तमान प्रॉक्सी वातावरण के आधार पर, जो आप चाहते हैं, उसे लागू करें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.