সকেট-অ্যাক্টিভেশন সহ সিস্টেমড ব্যবহারকারী ইউনিটগুলির মাধ্যমে অন-ডিমান্ড এসএসএইচ মোজা প্রক্সিটি ইচ্ছামত পুনরায় আরম্ভ হবে না


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 ), এবং 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 / বিন / ssh সত্যিই systemd- পাস সকেট গ্রহণ করতে পারবেন না? না শুধুমাত্র নতুন সংস্করণগুলি? আমার 2 বছর বয়সী ডেবিয়ান 8.9 থেকে এক
  2. কেবলমাত্র রুটের ইউনিটগুলি BindTodeviceকী বিকল্পটি ব্যবহার করতে পারে ?
  3. পুরানো টানেলটি মারা যাওয়ার পরে কেন আমার প্রক্সি পরিষেবাটি প্রথম নতুন সংযোগে সঠিকভাবে শ্বাস ছাড়ছে না?
  4. এটি কোনও "অন-ডিমান্ড এসএস মোজা প্রক্সি" সেট আপ করার সঠিক উপায়? যদি না হয় তবে কীভাবে করবেন?

autosshসংযোগটি ব্যর্থ হলে পুনরায় সংযোগের যত্ন নেওয়া উচিত (যদিও এটি সিস্টেম-পদ্ধতি নয়)।
জাকুজে

@ জাকুজে: মন্তব্যের জন্য ধন্যবাদ, তবে আমি চাই না যে সংযোগটি স্থায়ী হোক। আমি এটি ব্যবহার করার পরে এটি তৈরি করা চাই এবং তারপরে (আদর্শভাবে কোনও ডেটা-প্রেরিত-এক্স-মিনিটের সময়সীমা পেরিয়ে যাওয়ার পরে) স্ব-সমাপ্তি। এছাড়াও, আমার আগের সমাধান ব্যবহার করা হয়েছে autossh
অ্যালেক্স স্ট্রিজি 3:58

উত্তর:


4
  • / Usr / বিন / ssh সত্যিই systemd- পাস সকেট গ্রহণ করতে পারবেন না?

আমি মনে করি এটি খুব আশ্চর্যজনক নয়, বিবেচনা করে:

  • ওপেনএসএসএইচ একটি ওপেনবিএসডি প্রকল্প
  • systemd কেবল লিনাক্স কার্নেল সমর্থন করে
  • dচ্ছিক / বিল্ড-টাইম নির্ভরতা হিসাবে সিস্টেমড সমর্থনটি ওপেনএসএইচ-তে স্পষ্টভাবে যুক্ত করা দরকার, সুতরাং এটি সম্ভবত একটি শক্ত বিক্রয় হবে।

  • কেবলমাত্র রুটের ইউনিটগুলি BindTodeviceকী বিকল্পটি ব্যবহার করতে পারে ?

ব্যবহারকারী সিস্টেমযুক্ত উদাহরণগুলি সাধারণত বেশ বিচ্ছিন্ন এবং উদাহরণস্বরূপ মূল পিড -0 উদাহরণের সাথে যোগাযোগ করতে পারে না। ব্যবহারকারী ইউনিট ফাইলগুলি থেকে সিস্টেম ইউনিটের উপর নির্ভর করার মতো জিনিসগুলি সম্ভব নয়।

BindToDeviceউল্লেখ করার জন্য ডকুমেন্টেশন :

নোট করুন যে এই প্যারামিটারটি সেট করার ফলে ইউনিটে অতিরিক্ত নির্ভরতা যুক্ত হতে পারে (উপরে দেখুন)।

উপরে বর্ণিত বিধিনিষেধের কারণে আমরা বোঝাতে পারি যে ব্যবহারকারীর সিস্টেমযুক্ত উদাহরণগুলি থেকে বিকল্পটি কাজ করে না।


  • পুরানো টানেলটি মারা যাওয়ার পরে কেন আমার প্রক্সি পরিষেবাটি প্রথম নতুন সংযোগে সঠিকভাবে শ্বাস ছাড়ছে না?

আমি যেমন বুঝতে পেরেছি, ঘটনাগুলির শৃঙ্খলাটি নিম্নরূপ:

  • SocksProxyHelper.socket শুরু হয়েছে
  • একটি SOCKS ক্লায়েন্ট লোকালহোস্টের সাথে সংযুক্ত: 8118।
  • systemd শুরু হয় SocksProxyHelper.service
  • এর নির্ভরতা হিসাবে SocksProxyHelper.service, সিস্টেমডও শুরু হয় SocksProxy.service
  • systemd-socket-proxydসিস্টেমযুক্ত সকেট গ্রহণ করে এবং এর ডেটাতে ফরওয়ার্ড করে ssh
  • ssh মারা যায় বা হত্যা করা হয়
  • সিস্টেমযুক্ত বিজ্ঞপ্তিগুলি এবং SocksProxy.serviceএকটি নিষ্ক্রিয় অবস্থায় রাখে, কিন্তু কিছুই করে না।
  • SocksProxyHelper.serviceচলমান এবং সংযোগগুলি গ্রহণ করে রাখে, তবে সংযোগ করতে ব্যর্থ হয় ssh, কারণ এটি আর চলছে না।

ফিক্সটি যোগ BindsTo=SocksProxy.serviceকরতে হয় SocksProxyHelper.service। এর ডকুমেন্টেশন উদ্ধৃত (জোর দেওয়া):

শৈলীতে অনুরূপ প্রয়োজনীয়তা নির্ভরতাগুলি কনফিগার করে Requires=। যাইহোক, এই নির্ভরতা প্রকারটি আরও শক্তিশালী: এর প্রভাব ছাড়াও Requires=এটি ঘোষণা করে যে আবদ্ধ ইউনিটটি বন্ধ করা থাকলে এই ইউনিটটিও বন্ধ হয়ে যাবে । এর অর্থ অন্য ইউনিটে আবদ্ধ একটি ইউনিট যা হঠাৎ নিষ্ক্রিয় অবস্থায় প্রবেশ করে তাও বন্ধ হয়ে যাবে। ইউনিটগুলি হঠাৎ করে, বিভিন্ন কারণে অপ্রত্যাশিতভাবে নিষ্ক্রিয় অবস্থায় প্রবেশ করতে পারে: কোনও পরিষেবা ইউনিটের মূল প্রক্রিয়া তার নিজের পছন্দ অনুযায়ী শেষ হতে পারে, কোনও ডিভাইস ইউনিটের ব্যাকিং ডিভাইসটি আনপ্লাগড করা হতে পারে বা মাউন্ট ইউনিটের মাউন্ট পয়েন্টটি জড়িত না করে আনমাউন্ট করা হতে পারে সিস্টেম এবং পরিষেবা পরিচালক।

After=একই ইউনিটের সাথে যখন ব্যবহার করা হয় তখন এর ব্যবহার BindsTo=আরও দৃ is় হয়। এই ক্ষেত্রে, কঠোরভাবে আবদ্ধ ইউনিটটি এই ইউনিটটি সক্রিয় অবস্থায় থাকার জন্য সক্রিয় অবস্থায় থাকতে হবে । এটি শুধুমাত্র একটি ইউনিট অন্য ইউনিটের যে হঠাৎ নিষ্ক্রিয় রাষ্ট্র প্রবেশ করে আবদ্ধ মানে, কিন্তু এক যে একটি ব্যর্থ শর্ত চেক কারণে অন্য ইউনিট পায় এড়ানো আবদ্ধ হয় (যেমন ConditionPathExists=, ConditionPathIsSymbolicLink=, ... - নিচে দেখুন) বন্ধ হবে, এটি করা উচিত চলমান হতে। তাই, অনেক ক্ষেত্রে এটা ভাল একত্রিত হয় BindsTo=সঙ্গে After=


  • এটি কোনও "অন-ডিমান্ড এসএস মোজা প্রক্সি" সেট আপ করার সঠিক উপায়? যদি না হয় তবে কীভাবে করবেন?

সম্ভবত কোনও "সঠিক উপায়" নেই। এই পদ্ধতির সুবিধাগুলি (সবকিছুই "অন ডিমান্ড" হচ্ছে) এবং অসুবিধাগুলি (সিস্টেমেডের উপর নির্ভরতা, প্রথম সংযোগটি পাচ্ছে না কারণ এসএসএস এখনও শুনতে শোনেনি)। সম্ভবত অটোশগুলিতে সিস্টেমেড সকেট অ্যাক্টিভেশন সমর্থন প্রয়োগ করা আরও ভাল সমাধান হতে পারে।


আমি লাইনের পরে BindsTo=SocksProxy.serviceফাইলটির ইউনিট বিভাগে যুক্ত করেছি । এসএসএইচ মারা / যখন_কিল্ড হয়ে যায় তখন ম্যানুয়ালি সক্সপ্রক্সি পরিষেবাটি পুনরায় চালু করার দরকার নেই। সিস্টেমডিকে প্রাথমিক সংযোগটি "ধরে" রাখার কোনও উপায় আছে, যাতে এটি টিসিপি পুনরায় সেট না করে? ~/.config/systemd/user/SocksProxyHelper.serviceAfter=SocksProxy.service
অ্যালেক্স স্ট্রিজি

@ ভ্লাদিমির প্যান্তলিভের একটি বিষয় আমি স্পষ্ট করে বলতে চাই: সিস্টেমড সকেট অ্যাক্টিভেশনের জন্য সমর্থন $LISTEN_FDSনির্ভরতা যুক্ত না করে পার্স করে তুলনামূলকভাবে সহজেই প্রয়োগ করা যেতে পারে sd_listen_fds(), সুতরাং এটি এখনও শক্ত বিক্রয় হতে পারে, তবে খুব শক্ত নয়।
আমির
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.