ऑन-डिमांड SSH सॉकेट-एक्टिवेशन के साथ सिस्टमड यूजर यूनिट के माध्यम से प्रॉक्सी को कामना के रूप में पुनरारंभ नहीं करता है


14

एक अलग नेटवर्क तक पहुँचने के लिए मैं -D उपयोग करता हूँ ।

हर बार जब मैंने उन्हें इसमें जोड़ा तो विवरण टाइप करने से बचने के लिए ~/.ssh/config:

$ awk '/Host socks-proxy/' RS= ~/.ssh/config
Host socks-proxy
  Hostname pcit
  BatchMode yes
  RequestTTY no
  Compression yes
  DynamicForward localhost:9118

फिर मैंने एक सेवा इकाई परिभाषा फ़ाइल बनाई :

$ cat ~/.config/systemd/user/SocksProxy.service 
[Unit]
Description=SocksProxy Over Bridge Host

[Service]
ExecStart=/usr/bin/ssh -Nk socks-proxy

[Install]
WantedBy=default.target

मैंने डेमॉन को नई सेवा परिभाषाओं को फिर से लोड करने दिया, नई सेवा को सक्षम किया, इसे शुरू किया, इसकी स्थिति की जांच की, और सत्यापित किया, कि यह सुन रहा है:

$ systemctl --user daemon-reload
$ systemctl --user list-unit-files | grep SocksP
SocksProxy.service   disabled

$ systemctl --user enable SocksProxy.service
Created symlink from ~/.config/systemd/user/default.target.wants/SocksProxy.service to ~/.config/systemd/user/SocksProxy.service.

$ systemctl --user start SocksProxy.service 
$ systemctl --user status SocksProxy.service 
● SocksProxy.service - SocksProxy Over Bridge Host
   Loaded: loaded (/home/alex/.config/systemd/user/SocksProxy.service; enabled)
   Active: active (running) since Thu 2017-08-03 10:45:29 CEST; 2s ago
 Main PID: 26490 (ssh)
   CGroup: /user.slice/user-1000.slice/user@1000.service/SocksProxy.service
           └─26490 /usr/bin/ssh -Nk socks-proxy

$ netstat -tnlp | grep 118
tcp     0    0 127.0.0.1:9118        0.0.0.0:*             LISTEN     
tcp6    0    0 ::1:9118              :::*                  LISTEN

यह इच्छानुसार काम करता है। तब मैं, मैन्युअल रूप से सेवा शुरू करने के लिए हो रही है या के साथ स्थायी रूप से इसे चलाने से बचना चाहते थे , का उपयोग करके पर मांग (पुनः) को उत्पन्न करने के लिए। यह काम नहीं किया, मुझे लगता है कि (मेरा संस्करण) sshसॉकेट फ़ाइल-डिस्क्रिप्टर प्राप्त नहीं कर सकता है।

मैंने प्रलेखन ( 1 , 2 ), और -tool का उपयोग करने के लिए 2 "आवरण" सेवाओं, एक "सेवा" और एक "सॉकेट" बनाने के लिए एक उदाहरण पाया systemd-socket-proxyd:

$ cat ~/.config/systemd/user/SocksProxyHelper.socket 
[Unit]
Description=On Demand Socks proxy into Work

[Socket]
ListenStream=8118
#BindToDevice=lo
#Accept=yes

[Install]
WantedBy=sockets.target

$ cat ~/.config/systemd/user/SocksProxyHelper.service 
[Unit]
Description=On demand Work Socks tunnel
After=network.target SocksProxyHelper.socket
Requires=SocksProxyHelper.socket SocksProxy.service
After=SocksProxy.service

[Service]
#Type=simple
#Accept=false
ExecStart=/lib/systemd/systemd-socket-proxyd 127.0.0.1:9118
TimeoutStopSec=5

[Install]
WantedBy=multi-user.target

$ systemctl --user daemon-reload

यह लगता है काम करने के लिए, जब तक sshमौत या मारे गए हो जाता है। तब यह अगले कनेक्शन के प्रयास में फिर से नहीं होगा जब यह होना चाहिए।

प्रशन:

  1. क्या usr / usr / bin / ssh वास्तव में सिस्टमड-पास सॉकेट्स को स्वीकार नहीं कर सकता है? या केवल नए संस्करण? मेरा एक up2date डेबियन 8.9 से है
  2. क्या केवल रूट की इकाइयां ही BindTodeviceविकल्प का उपयोग कर सकती हैं ?
  3. पुरानी सुरंग के मरने के बाद पहले नए कनेक्शन पर मेरी प्रॉक्सी सेवा सही ढंग से क्यों नहीं चल रही है?
  4. क्या यह "ऑन-डिमांड ssh मोज़े प्रॉक्सी" सेट करने का सही तरीका है? यदि नहीं, तो आप इसे कैसे करते हैं?

autosshकनेक्शन विफल होने की स्थिति में फिर से जोड़ने का ख्याल रखना चाहिए (हालांकि यह सिस्टम-वे नहीं है)।
जकुज 12

@Jakuje: टिप्पणी के लिए Thx, लेकिन मैं नहीं चाहता कि कनेक्शन स्थायी हो। मैं चाहता हूं कि जब मैं इसका उपयोग करूं, तो इसे स्पैन किया जाए और फिर (आदर्श रूप से नो-डेटा-भेजे-इन-एक्स-मिनट टाइमआउट के बाद) सेल्फ-टर्मिनेट हो। इसके अलावा, मेरे पिछले समाधान का इस्तेमाल किया autossh
एलेक्स स्ट्रैगीज़ 12

जवाबों:


4
  • क्या usr / usr / bin / ssh वास्तव में सिस्टमड-पास सॉकेट्स को स्वीकार नहीं कर सकता है?

मुझे लगता है कि यह बहुत आश्चर्य की बात नहीं है:

  • ओपनएसएसएच एक ओपनबीएसडी परियोजना है
  • systemd केवल Linux कर्नेल का समर्थन करता है
  • systemd के समर्थन को OpenSSH में एक वैकल्पिक / बिल्ड-टाइम निर्भरता के रूप में स्पष्ट रूप से जोड़ा जाना आवश्यक है, इसलिए यह संभवतः एक कठिन बिक्री होगी।

  • क्या केवल रूट की इकाइयां ही BindTodeviceविकल्प का उपयोग कर सकती हैं ?

उपयोगकर्ता प्रणाली के उदाहरण आम तौर पर बहुत अलग-थलग होते हैं, और उदाहरण के लिए मुख्य pid-0 उदाहरण के साथ संवाद नहीं कर सकते हैं। उपयोगकर्ता इकाई फ़ाइलों से सिस्टम इकाइयों के आधार पर चीजें संभव नहीं हैं।

BindToDeviceउल्लेख के लिए प्रलेखन :

ध्यान दें कि इस पैरामीटर को सेट करने से यूनिट पर अतिरिक्त निर्भरता हो सकती है (ऊपर देखें)।

उपर्युक्त प्रतिबंध के कारण, हम इसका अर्थ यह लगा सकते हैं कि उपयोगकर्ता सिस्टमड इंस्टेंसेस से विकल्प काम नहीं करता है।


  • पुरानी सुरंग के मरने के बाद पहले नए कनेक्शन पर मेरी प्रॉक्सी सेवा सही ढंग से क्यों नहीं चल रही है?

जैसा कि मैं समझता हूं, घटनाओं की श्रृंखला इस प्रकार है:

  • SocksProxyHelper.socket शुरू हो गया।
  • SOCKS क्लाइंट लोकलहोस्ट से कनेक्ट होता है: 8118।
  • शुरू होता है SocksProxyHelper.service
  • की निर्भरता के रूप में SocksProxyHelper.service, systemd भी शुरू होता है SocksProxy.service
  • systemd-socket-proxydSystemd सॉकेट को स्वीकार करता है, और इसके डेटा को आगे करता है ssh
  • ssh मर जाता है या मार दिया जाता है।
  • systemd नोटिस, और SocksProxy.serviceएक निष्क्रिय स्थिति में रखता है, लेकिन कुछ भी नहीं करता है।
  • SocksProxyHelper.serviceकनेक्शन चलाना और स्वीकार करना जारी रखता है, लेकिन कनेक्ट करने में विफल रहता है ssh, क्योंकि यह अब नहीं चल रहा है।

फिक्स को जोड़ना BindsTo=SocksProxy.serviceहै SocksProxyHelper.service। इसके प्रलेखन का उद्धरण (जोर दिया गया):

आवश्यकता निर्भरता को कॉन्फ़िगर करता है, शैली में बहुत समान है Requires=। हालांकि, यह निर्भरता प्रकार अधिक मजबूत है: इसके प्रभाव के अलावा Requires=यह घोषणा करता है कि यदि इकाई को बाध्य किया जाता है, तो इस इकाई को भी रोक दिया जाएगा । इसका मतलब यह है कि किसी अन्य इकाई से जुड़ी एक इकाई जो अचानक निष्क्रिय अवस्था में प्रवेश करती है, उसे भी रोक दिया जाएगा। इकाइयाँ अलग-अलग कारणों से अचानक अप्रत्याशित रूप से निष्क्रिय अवस्था में प्रवेश कर सकती हैं: एक सेवा इकाई की मुख्य प्रक्रिया अपनी पसंद के आधार पर समाप्त हो सकती है , एक उपकरण इकाई की बैकिंग डिवाइस अनप्लग हो सकती है या एक माउंट यूनिट का माउंट प्वाइंट बिना किसी संशोधन के अनमाउंट हो सकता है। सिस्टम और सेवा प्रबंधक।

जब After=एक ही इकाई के साथ संयोजन में उपयोग किया जाता है तो इसका व्यवहार और BindsTo=भी मजबूत होता है। इस मामले में, इस इकाई के लिए कड़ाई से बाध्य इकाई को सक्रिय अवस्था में होना चाहिए । यह न केवल एक इकाई एक और इकाई है कि अचानक निष्क्रिय अवस्था में प्रवेश करने के लिए बाध्य का मतलब है, लेकिन यह भी एक है कि एक असफल हालत की जांच करने की वजह से एक और इकाई हो जाता है कि छोड़ दिया करने के लिए बाध्य किया जाता है (जैसे ConditionPathExists=, ConditionPathIsSymbolicLink=... - नीचे देखें) रोक दिया जाएगा, यह होना चाहिए दौड़ते रहो। इसलिए, कई मामलों में इसके BindsTo=साथ गठबंधन करना सबसे अच्छा है After=


  • क्या यह "ऑन-डिमांड ssh मोज़े प्रॉक्सी" सेट करने का सही तरीका है? यदि नहीं, तो आप इसे कैसे करते हैं?

शायद कोई "सही तरीका" नहीं है। इस पद्धति के अपने फायदे हैं (सब कुछ "ऑन-डिमांड") और नुकसान (सिस्टमड पर निर्भरता, पहले कनेक्शन के माध्यम से नहीं मिल रहा है क्योंकि एसएचएस ने अभी तक सुनना शुरू नहीं किया है)। शायद autossh में systemd सॉकेट सक्रियण समर्थन को लागू करना एक बेहतर समाधान होगा।


मैंने लाइन के बाद, BindsTo=SocksProxy.serviceफ़ाइल के यूनिट सेक्शन में जोड़ा है । SocksProxy सेवा को मैन्युअल रूप से पुनरारंभ करना अब आवश्यक नहीं है, जब SSH मर जाता है / get_killed। क्या प्रारंभिक कनेक्शन को व्यवस्थित करने का एक तरीका है, ताकि उसे टीसीपी रीसेट न मिले? ~/.config/systemd/user/SocksProxyHelper.serviceAfter=SocksProxy.service
एलेक्स स्ट्रैगीज़

@ व्लादिमीर पैंटेलेव एक बिंदु मैं स्पष्ट करना चाहूंगा: सिस्टमड सॉकेट सक्रियण के लिए समर्थन $LISTEN_FDSपर निर्भरता जोड़े बिना पार्सिंग द्वारा अपेक्षाकृत आसानी से लागू किया जा सकता है sd_listen_fds(), इसलिए यह अभी भी एक कठिन बिक्री हो सकती है, लेकिन बहुत कठिन नहीं है।
आमिर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.