फॉरवर्ड स्थानीय पोर्ट या सॉकेट फ़ाइल को दूरस्थ सॉकेट फ़ाइल में अग्रेषित करें


24

त्वरित प्रश्न - मैं दो लिनक्स बॉक्स चलाता हूं, एक मेरा खुद का डेस्कटॉप और दूसरा मेरा वीपीएस। VPS अंत में सुरक्षा कारणों से मैंने MySQL ( /var/run/mysqld/mysql.sock) को सॉकेट कनेक्शन के लिए चुना । मुझे पता है कि मैं इस तरह से सुरंग बना सकता हूं: ssh -L 3307:127.0.0.1:3306 user@site.comअगर मैं कुछ बंदरगाह पर सुनने के लिए दूरस्थ sql सर्वर स्थापित करता हूं, लेकिन जो मैं जानना चाहता हूं क्या मैं कुछ ऐसा कर सकता हूं: ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.sockजिससे दो बंदरगाहों के विपरीत, दो सॉकेट को टनल करना है ?

एक पूरी तरह से स्वीकार्य समाधान भी एक स्थानीय पोर्ट को दूरस्थ सॉकेट फ़ाइल को अग्रेषित करना होगा, लेकिन जहां संभव हो मैं कोशिश कर रहा हूं कि रिमोट बॉक्स पर tcp सर्वर न चलें।

(और हाँ, मुझे पता है कि tcp आसान होगा)।


यदि आप mySQL बॉक्स पर टीसीपी का उपयोग नहीं करना चाहते हैं, तो सुरक्षा चिंताओं (यानी रिमोट अटैक आदि) के कारण आप या तो इसे फायरवॉल कर सकते हैं, और यदि यह पर्याप्त अच्छा नहीं है, तो mySQL केवल 127.0.0.1 पर सुनें इसके टीसीपी कनेक्शन के लिए, फिर आप एसएसएच के माध्यम से आसानी से सुरंग बना सकते हैं। यदि नहीं, तो मैं नीचे दिए गए समाज समाधान का समर्थन करता हूं।
मैटियस अहेनबर्ग

lwn.net/Articles/609321 ओपनएसएसएच 6.7 सॉकेट फॉरवर्डिंग लाएगा
ह्यूबर्टस

@Hubbitus यह सुविधा अभी उपलब्ध है, यदि हां, तो क्या आप एक उदाहरण उत्तर दे सकते हैं?
CMCDragonkai

वह टिप्पणी उत्तर रूप में थी, लेकिन किसी व्यक्ति द्वारा टिप्पणी में बदल दी गई। और मैं देख रहा हूं कि अब आप पहले से ही नीचे दिए गए उत्तर का सुझाव देते हैं।
हबबिटस

जवाबों:


35

मांग पर एक स्थानीय सॉकेट को अग्रेषित करें

  • SSH सार्वजनिक कुंजी प्रमाणीकरण सेट करें
  • socatदोनों सिरों पर स्थापित करें
  • अन्य उपयोगकर्ताओं के लिए दुर्गम, आपकी सॉकेट के लिए स्थानीय रूप से एक निर्देशिका बनाएं।
export SOCKET_DIR=~/.remote-sockets
mkdir -p $SOCKET_DIR
socat "UNIX-LISTEN:$SOCKET_DIR/mysqld.sock,reuseaddr,fork" \
EXEC:'ssh user@server socat STDIO UNIX-CONNECT\:/var/run/mysqld/mysqld.sock'

फिर

mysql -S $SOCKET_DIR/mysqld.sock -u mysqluser -p

six और सोसाइट के साथ यूनिक्स डोमेन सॉकेट्स को अग्रेषित करने से चोरी


यह कमाल है और इसका स्वीकृत जवाब होना चाहिए।
जॉन स्मिथ वैकल्पिक 21

32

उस समय, जब सवाल पूछा गया था, यह वास्तव में असंभव था, लेकिन आजकल यह संभव है।

आप दोनों को कर सकते हैं: UNIX => टीसीपी और UNIX => UNIX अग्रेषण।

उदाहरण के लिए:

ssh \
  -R/var/run/mysql.sock:/var/run/mysql.sock \
  -R127.0.0.1:3306:/var/run/mysql.sock \
  somehost

यह ओपनएसएसएच 6.7 के बाद से संभव है।


1
मैं दूरस्थ सर्वर सॉकेट के लिए अपने स्थानीय सॉकेट को आगे बढ़ाने में कामयाब रहा और ऊपर से डॉक क्लाइंट को दूरस्थ रूप से चलाएं (यह सीधे ssh द्वारा किया जा सकता है, लेकिन इसमें मज़ा कहाँ है :)ssh -L /home/user/docker.sock:/var/run/docker.sock dockerhost -N
sdkks

11

मैंने ऐसा नहीं किया है, लेकिन मैं समाज के साथ प्रयास करूंगा । शायद कुछ इस तरह:

ssh xxx@yyy.zzz -L 9999:localhost:9999 "socat TCP-LISTEN:localhost:9999 UNIX-CONNECT:/var/run/mysqld/mysql.sock"
socat UNIX-LISTEN:/path/to/local/socket TCP:localhost:9999

फिर, मैंने कभी ऐसा कुछ नहीं किया।


मैं इसे जाने दूंगा और आपको बता दूंगा कि यह कैसे जाता है। मैं tcp- आधारित कार्यान्वयन का उपयोग कर रहा हूं।

मैं इस समय काम करने के लिए नहीं मिल सकता, लेकिन विचार के लिए वैसे भी +1, मुझे पसंद है। यदि आप इसे ठीक करते हैं तो मैं आपको बता दूंगा।

+1 उपयोगी उपयोगिता की तरह दिखता है।
वार्नर

5

6.7 ssh के बाद से अधिक सोसाइटी की आवश्यकता नहीं है। आप यूनिक्स डोमेन सॉकेट को सीधे अग्रेषित कर सकते हैं जैसे:

ssh -nNT -L $(pwd)/docker.sock:/var/run/docker.sock user@someremote

अधिक जानकारी: https://medium.com/@dperny/forwarding-the-docker-socket-over-ssh-e6567cfab160


मैंने इसे एक अलग उपयोगकर्ता के रूप में एक स्थानीय सॉकेट से कनेक्ट करने के लिए भी उपयोगी पाया। यह मुझे एक सर्वर प्रक्रिया के खिलाफ क्लाइंट प्रोग्राम चलाने देता है जो कुछ उपयोगकर्ता आईडी (अपने स्वयं के नौकरी धावकों से आने वाले कनेक्शन) को डिस्कनेक्ट करता है।
वारबो

एक सॉकेट को एक ही मशीन में अग्रेषित करना, लेकिन एक अलग उपयोगकर्ता द्वारा नियंत्रित विभिन्न निर्देशिका, एक्सेस को प्रमाणित करने के लिए sshd का उपयोग कर रही है? आपका usecase क्या है?
CMCDragonkai

निर्देशिका अनुमतियाँ / पहुँच कोई समस्या नहीं है। बल्कि, एक विशेष डेमॉन एक निश्चित समूह में उपयोगकर्ताओं द्वारा किए गए किसी भी कनेक्शन के प्रयासों को छोड़ देता है (माना जाता है कि नए शौक को भ्रमित करने से रोकने के लिए)। Ssh का उपयोग करने से उन उपयोगकर्ताओं को (ट्यून किए गए सॉकेट के माध्यम से) कनेक्ट करने की अनुमति मिलती है जैसे कि वे एक उपयोगकर्ता थे जो उस समूह में नहीं थे, और इसलिए डिस्कनेक्ट नहीं हुए।
वॉरबो

दिलचस्प, मज़ेदार है कि आप निक्स-डेमन से कैसे मतलब रखते हैं, मैं उस से संबंधित मुद्दों से भी निपट रहा हूं। मैं सोच रहा हूं कि निक्स-डेमन एक निश्चित समूह में उपयोगकर्ताओं के लिए कनेक्शन क्यों छोड़ रहा है? क्या यह सुरक्षा कॉन्फ़िगरेशन की बात है? या इससे संबंधित: nixos.org/nix/manual/#idm140737318362784 ?
CMCDragonkai

प्रतिबद्ध संदेश के अनुसार यह "आकस्मिक" उपयोग को रोकने के लिए है। मैं इसे यहाँ
वारबो

2

@Mpontes '/ @ जेवियर के जवाब का एक और संशोधन

ssh user@remoteserver -L 9999:localhost:9999 'socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'

सफाई वाला

ssh user@remoteserver -L 9999:localhost:9999 '
  socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock&
  pid=$!
  trap "kill $pid" 0
  while echo -ne " \b"; do
    sleep 5
  done
'

पेशेवरों

  1. खुलने का समय पहले की तुलना में 6.7 (सेंटोस 7 की तरह)
  2. दूरस्थ सर्वर में पुनः ssh करने के बजाय ssh समाप्ति पर सोसाइटी को मारता है
  3. गैर-सार्वजनिक ssh लॉगिन (ijk समाधान के विपरीत) की अनुमति देता है

फ़ीचर

  1. चूंकि -fविकल्प का उपयोग नहीं किया गया है, आप या तो एक सार्वजनिक कुंजी का उपयोग कर सकते हैं और पृष्ठभूमि के माध्यम से चला &सकते हैं या आप अंतःक्रियात्मक रूप से लॉग इन कर सकते हैं और Ctrl + Z का उपयोग $!कर सकते हैं और पीआईडी ​​को स्टोर करने के लिए उसी का उपयोग कर सकते हैं ।

कान्स

  1. आप आसानी से -fssh विकल्प का उपयोग नहीं कर सकते , क्योंकि आप ssh के रास्ते को खो देंगे। यह विधि अग्रभूमि में चलने और मारने के लिए Ctrl + C पर निर्भर करती है।
  2. अधिक जटिल

व्याख्या

  • socat ...& - दूरस्थ सर्वर पर पृष्ठभूमि में समाज चलाएं
  • pid=$! - पिड स्टोर करें
  • trap kill\ $pid 0- kill $pidबैश समाप्ति पर चलाएं
  • while :; sleep... - एक अनंत लूप में बैठो
  • echo -ne \ \b- इको स्पेस बैकस्पेस द्वारा पीछा किया। जैसे ही ssh डिस्कनेक्ट होता है, वह विफल हो जाता है। ए के साथ sleep 5, इसका मतलब है कि socatssh के बाद 5 सेकंड तक चल सकता है

नोट: असल में डोकर, बंदरगाह का उपयोग कर परीक्षण किया 2375, /var/run/docker.sockऔर वातावरण चर DOCKER_HOST='tcp://localhost:2375', लेकिन mysql सभी एक ही के लिए काम करना चाहिए

अद्यतन करें

SSH नियंत्रणों का उपयोग करते हुए , आप -fमेरे तरीके का उपयोग करके ध्वज का उपयोग कर सकते हैं , बस निम्नलिखित झंडे जोड़ें

-f -o ControlPath=~/.ssh/%C -o ControlMaster=auto

और आपको मिलेगा

ssh -f -o ControlPath=~/.ssh/%C -o ControlMaster=auto user@remoteserver -L 9999:localhost:9999 'set -m; socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock& pid=$!; trap "kill $pid" 0; while echo -ne " \b"; do sleep 5; done'

अब आप सभी नियंत्रित सत्रों का उपयोग करके समाप्त कर सकते हैं

ssh -o ControlPath=~/.ssh/%C -O exit remoteserver

-oविकल्प आपके में बचाया जा सकता है .ssh/configफ़ाइल, या आप एस के बजाय का उपयोग कर सकते हैं (लेकिन आप अभी भी आवश्यकता होगी -o ControlMaster)


मैं अन्य मेजबानों के लिए कोड को तैनात करने के लिए एक डॉकर कंटेनर के अंदर स्क्रिप्ट का उपयोग कर रहा हूं। आपका कनेक्शन तर्क अद्भुत है, लेकिन बैश सत्र समाप्त होने पर समाप्त होता है। इसके docker run ... connect.shबाद सुरंग को सेटअप करने के लिए मुझे कॉल करने से रोकता है docker run ... deploy.sh। मैंने कोशिश की nohup, &और disownलेकिन वे socatबंद करने stdoutऔर ट्रिगर करने से टूटने लगते हैं kill। इस मामले का समर्थन करने के लिए tweaks के लिए कोई भी विचार (यानी अभी भी करीब है जब SSH करता है लेकिन एक बच जाता है)?
क्लेडटंड

ठीक है। यह वास्तव में (w / ठीक काम करता है -fऔर & disown) एक टर्मिनल में। जाहिर है कि मुद्दा "रैपर" स्क्रिप्ट द्वारा बनाया गया है। मैं इनपुट का स्वागत करता हूं, लेकिन अब मैं और अधिक उपयुक्त प्रश्नोत्तर देख रहा हूं।
claytond

@ क्लैटटॉन्ड निश्चित रूप से निश्चित नहीं है कि आप क्या कर रहे हैं, लेकिन हां, अन्य सभी कमांड तब समाप्त हो जाते हैं जब एक कंटेनर के 1 पिड समाप्त हो जाता है। मैं आमतौर पर आपकी तैनाती स्क्रिप्ट परिदृश्य में क्या करूंगा "कमांड" का उपयोग करें और मेरे कंटेनर के लिए एक प्रविष्टि लिखें छवि जो कहेगी "अगर $ 1 (कमांड) == फिर से देखें" ssh कमांड चलाएँ, और तैनाती कमांड, और फिर अंत करें, जो ssh कनेक्शन को बंद कर देगा। आप भी कर सकते हैं docker run ... connect.sh, और docker exec {container name/id} deploy.sh, इसलिए वे एक साथ खेलते हैं।
एंडी

आप सही हे। मैं वास्तव में execपहले से ही runकंटेनर का उपयोग कर रहा हूं और execसमाप्त होने के बाद एसएसएच पाइप कायम नहीं था । मैंने स्पष्ट किया कि यह एक क्विक के कारण है जिस तरह से स्क्रिप्ट निष्पादित होती है। अगर मैंने कॉल को अपनी स्क्रिप्ट में स्थानांतरित कर दिया और कॉल किया nohup <script.sh> & disown, तो यह पूरा होने से बच गया exec
क्ले क् टोंड

1

जेवियर के जवाब पर विस्तार से, यह मेरे लिए काम करता है:

ssh -f xxx@yyy.zzz -L 9999:localhost:9999 "socat TCP-LISTEN:9999,fork,bind=localhost UNIX-CONNECT:/var/run/mysqld/mysql.sock"

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

इसके बाद, localhost:9999सामान्य रूप से कनेक्ट करें जैसा कि आप करेंगे। फिर सुरंग को तोड़ने के लिए:

ssh -f xxx@yyy.zzz "killall socat"

(या कुछ इसी तरह, आप अधिक विस्तृत बातें कर सकते हैं जिसमें सोसाइटी के पीआईडी ​​को रखना शामिल है)


1

हां, आप सोसैट का उपयोग कर सकते हैं।

पहले एसएसएच के साथ टीसीपी सुरंग करें। फिर इस तरह सोसाइटी का उपयोग करें:

सोसाइटी यूनिक्स-सुनो: /var/run/mysqld/mysqld.sock,fork,unlink-early tcp: 127.0.0.1: 3306

फिर नए बनाए गए सॉकेट को अनुमति दें (chmod 777 हो सकता है)


ओपनएसएसएच 6.6 के बाद से यह संभव है।
ysdx 18

3
chmod 777: नहीं नहीं नहीं नहीं नहीं! कभी चला नहीं chmod 777। यह व्यावहारिक रूप से कभी आवश्यक नहीं है! "परीक्षण प्रयोजनों" के लिए भी नहीं। यदि फ़ाइल पठनीय है, तो यह पठनीय है। यदि यह इसके द्वारा लिखने योग्य है userया groupइसे लिखने की आवश्यकता है, तो यह लिखने योग्य है। हर किसी को लिखने की अनुमति देने के लिए बिल्कुल शून्य की आवश्यकता होती है, और chmodइसे कुछ समझकर वापस करने की आवश्यकता होती है कि वास्तव में बहुराष्ट्रीय कंपनियों को हैक कैसे किया जाता है। बस यह मत करो। कभी। मैंने यूनिक्स अनुमतियों का परिचय लिखा । कृपया इसे पढ़ें!
मार्टिन टूरनोइज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.