স্থানীয় পোর্ট বা সকেট ফাইলকে দূরবর্তী সকেট ফাইলে ফরোয়ার্ড করুন


24

দ্রুত প্রশ্ন - আমি দুটি লিনাক্স বাক্স চালাচ্ছি, একটি নিজস্ব ডেস্কটপ এবং অন্যটি আমার ভিপিএস। ভিপিএস শেষের সুরক্ষার কারণে আমি মাইএসকিউএল ( /var/run/mysqld/mysql.sock) এ সকেট সংযোগ বেছে নিয়েছি । আমি জানি যে আমি এটির মতো সুড়ঙ্গ করতে পারি: ssh -L 3307:127.0.0.1:3306 user@site.comযদি আমি কোনও বন্দরটিতে শোনার জন্য দূরবর্তী এসকিএল সার্ভারটি সেট আপ করি তবে আমি যা জানতে চাই তা হল আমি এর মতো কিছু করতে পারি: ssh -L /path/to/myremotesqlserver.sock:/var/run/mysqld/mysql.sockযার ফলে দুটি বন্দরগুলির বিপরীতে দুটি সকেট টানেলিং করা যায়?

একটি সম্পূর্ণ গ্রহণযোগ্য সমাধান হ'ল স্থানীয় বন্দরটি দূরবর্তী সকেট ফাইলে ফরোয়ার্ড করা, তবে যেখানেই সম্ভব আমি চেষ্টা করছি টিসিপি সার্ভারগুলি দূরবর্তী বাক্সে চলমান না।

(এবং হ্যাঁ, আমি জানি tcp আরও সহজ হবে)।


আপনি যদি মাইএসকিউএল বাক্সে টিসিপি ব্যবহার না করতে চান তবে সুরক্ষা উদ্বেগের কারণে (যেমন দূরবর্তী আক্রমণ, ইত্যাদি) আপনি এটি ফায়ারওয়ালটি অবশ্যই বন্ধ করতে পারেন, এবং যদি এটি যথেষ্ট ভাল না হয় তবে কেবল মাইএসকিউএলকে কেবল 127.0.0.1 শোনার জন্য করুন এটির টিসিপি সংযোগগুলির জন্য, তবে আপনি এসএসএইচ দিয়ে খুব সহজে টানেল করতে পারেন। যদি তা না হয় তবে আমি নীচের সকেট সমাধানটি সমর্থন করি।
ম্যাটিয়াস অহনবার্গ

lwn.net/Articles/609321 ওপেনএসএইচ 6.7 সকেট ফরোয়ার্ডিং
এনেছে

@ হবিটাস এখন এই বৈশিষ্ট্যটি উপলব্ধ, যদি তাই হয় তবে আপনি একটি উদাহরণ উত্তর দিতে পারেন?
সিএমসিডিগ্রাগনকাই

সেই মন্তব্যটি উত্তর ফর্মে ছিল, তবে কারও মন্তব্যে রূপান্তরিত হয়েছিল। এবং আমি এখন দেখছি আপনি ইতিমধ্যে নীচের উত্তর প্রস্তাব।
হুবিটাস

উত্তর:


35

চাহিদা অনুযায়ী স্থানীয় সকেট ফরোয়ার্ড করুন

  • এসএসএইচ পাবলিক কী প্রমাণীকরণ সেটআপ করুন
  • 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

ssh এবং সকেট সহ ইউনিক্স ডোমেন সকেট ফরোয়ার্ড করা থেকে চুরি


এটি দুর্দান্ত এবং এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
জন স্মিথ

32

পর্যাপ্ত পরিমাণে যখন প্রশ্ন জিজ্ঞাসা করা হয়েছিল, এটি সত্যিই অসম্ভব, তবে আজকাল এটি সম্ভব is

আপনি উভয়কেই করতে পারেন: UNIX => TCP এবং 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 -L /home/user/docker.sock:/var/run/docker.sock dockerhost -N
এসএসএসের মাধ্যমেই

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

আবার আমি এর আগে কখনও কিছু করি নি।


আমি এটি দিয়ে যাব এবং আপনাকে কীভাবে তা জানাতে দেব। আমি টিসিপি-ভিত্তিক বাস্তবায়ন ব্যবহার করছি।

আমি এই মুহুর্তে এটি কাজ করতে পারি না তবে ধারণার জন্য +1 যাইহোক, আমি এটি পছন্দ করি। আমি ঠিক করেছি কিনা আমি আপনাকে জানাতে হবে।

+1 একটি দরকারী ইউটিলিটির মতো দেখায়।
ওয়ার্নার

5

এসএসএস since.7 এর পরে আর কোনও সাকার প্রয়োজন নেই। আপনি সরাসরি ইউনিক্স ডোমেন সকেটগুলি ফরোয়ার্ড করতে পারেন:

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

আরও তথ্য: https://medium.com/@dperny/forwarding-the-docker-sket-over-ssh-e6567cfab160


আমি পৃথক ব্যবহারকারী হিসাবে স্থানীয় সকেটে সংযোগের জন্য এই দরকারীটিও পেয়েছি। এটি আমাকে এমন একটি সার্ভার প্রক্রিয়াটির বিরুদ্ধে ক্লায়েন্ট প্রোগ্রামগুলি চালিত করতে দেয় যা নির্দিষ্ট ব্যবহারকারী আইডি সংযোগ বিচ্ছিন্ন করে (তার নিজের কাজ চালকদের কাছ থেকে আসা সংযোগগুলি)।
ওয়ারবো

অ্যাক্সেসের প্রমাণীকরণের জন্য sshd ব্যবহার করে একই মেশিনে সকেট ফরোয়ার্ড করা হচ্ছে, তবে ভিন্ন ব্যবহারকারী দ্বারা নিয়ন্ত্রিত বিভিন্ন ডিরেক্টরি? আপনার ইউসকেস কি?
সিএমসিডিগ্রাগনকাই

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

মজার, মজার বিষয় আপনি কীভাবে নিক্স-ডেমনকে বোঝাতে চাইছেন, আমি সে সম্পর্কিত সমস্যাগুলিও ডিল করছি। আমি ভাবছি কেন নিক্স-ডেমন একটি নির্দিষ্ট গোষ্ঠীর ব্যবহারকারীদের সাথে সংযোগগুলি বাদ দিচ্ছে? এটি কি সুরক্ষা কনফিগারেশন জিনিস? বা সম্পর্কিত: nixos.org/nix/manual/#idm140737318362784 ?
সিএমসিডিগ্রাগনকাই

প্রতিশ্রুতিবদ্ধ বার্তা অনুসারে এটি "দুর্ঘটনাজনক" ব্যবহার রোধ করা। আমি এটিকে এখানে
ওয়ারবো

2

@ মম্পন্টস / @ জাভিরের উত্তরটির আরও একটি পরিবর্তন

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. Ss.7 এর আগে ওপেনশে কাজ করে (সেন্টস OS এর মতো)
  2. রিমোট সার্ভারে পুনরায় চাপ দেওয়ার পরিবর্তে এসএসটি সমাপ্তিতে সস্যাটকে হত্যা করে
  3. অ-পাবলিক ssh লগইনকে অনুমতি দেয় (আইজকের সমাধানের বিপরীতে)

বৈশিষ্ট্য

  1. যেহেতু -fবিকল্পটি ব্যবহার করা হয়নি, আপনি পাবলিক কী ব্যবহার করতে পারেন এবং পটভূমিতে চলতে &পারেন বা ইন্টারেক্টিভভাবে লগ ইন করতে এবং Ctrl + Z ব্যবহার করতে পারেন $!এবং পিড সংরক্ষণের জন্য এটি ব্যবহার করতে পারেন ।

CONS

  1. -fSsh বিকল্পটি সহজেই ব্যবহার করতে পারবেন না , কারণ আপনি সেইভাবে ssh এর পিড হারাবেন। এই পদ্ধতিটি অগ্রভাগে দৌড়ানোর উপর নির্ভর করে এবং হত্যা করতে Ctrl + C।
  2. আরও জটিল

ব্যাখ্যা

  • socat ...& - দূরবর্তী সার্ভারে ব্যাকগ্রাউন্ডে সোকাট চালান
  • pid=$! - পিড সংরক্ষণ করুন
  • trap kill\ $pid 0- kill $pidবাশ অবসান চালানো
  • while :; sleep... - অসীম লুপে বসুন
  • echo -ne \ \b- ব্যাকস্পেসের পরে ইকো স্পেস। Ssh সংযোগ বিচ্ছিন্ন হওয়ার সাথে সাথে এটি ব্যর্থ হয়। একটি সহ sleep 5, এর অর্থ এই যে socatssh এর পরে 5 সেকেন্ড পর্যন্ত চলতে পারে

নোট: আসলে Docker, পোর্ট ব্যবহার পরীক্ষিত 2375, /var/run/docker.sockএবং এনভায়রনমেন্ট ভেরিয়েবল DOCKER_HOST='tcp://localhost:2375'কিন্তু মাইএসকিউএল সব একই জন্য কাজ করা উচিত

হালনাগাদ

এসএসএইচ নিয়ন্ত্রণগুলি ব্যবহার করে , আপনি -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ফাইল, অথবা আপনি -S পরিবর্তে ব্যবহার করতে পারেন (কিন্তু আপনি এখনও প্রয়োজন হবে -o ControlMaster)


আমি অন্যান্য হোস্টে কোড স্থাপন করতে একটি ডকারের ধারকের ভিতরে স্ক্রিপ্ট ব্যবহার করছি। আপনার সংযোগ যুক্তিটি আশ্চর্যজনক তবে বাশ সেশন শেষ হওয়ার পরে শেষ হয়। এটি আমার docker run ... connect.shপরে সুরক্ষা স্থাপনের জন্য কল করতে বাধা দেয় docker run ... deploy.sh। আমি চেষ্টা nohup, &এবং disownতারা ভঙ্গ বলে মনে হচ্ছে socatবন্ধ করে stdoutএবং triggering kill। এই কেসটিকে সমর্থন করার জন্য টুইটগুলির জন্য কোনও ধারণা (যেমন এসএসএইচ যখন অস্বীকার করে বেঁচে থাকে তখনও কাছে থাকে)?
মৃত্তিকাণ্ড

ঠিক আছে. এটি আসলে টার্মিনালে সূক্ষ্ম (ডাব্লু / -fএবং & disown) কাজ করে । স্পষ্টতই বিষয়টি স্ক্রিপ্ট "র‍্যাপার" দ্বারা তৈরি করা হয়েছে। আমি ইনপুটকে স্বাগত জানাই তবে এখনকার মতো আরও উপযুক্ত প্রশ্নোত্তর দেখছি।
ক্লেটন্ড

@ ক্লেটন্ড আপনি ঠিক কী করছেন তা নিশ্চিত নন, তবে হ্যাঁ, পাত্রে 1 পিড ​​শেষ হয়ে গেলে অন্যান্য সমস্ত কমান্ড বন্ধ হয়ে যায় I আমি সাধারণত আপনার মোতায়েনের স্ক্রিপ্ট দৃশ্যে যা করবো তা হল "স্থাপনা" কমান্ডটি ব্যবহার করুন এবং আমার ধারকটির জন্য একটি এন্ট্রিপয়েন্ট লিখুন চিত্রটি বলবে "যদি if 1 (কমান্ড) == মোতায়েন করুন তবে" 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অনুক্রমে মৃতু্য একবার আপনাকে প্রথমে সংযোগ বন্ধ socat ছাড়া একাধিক বার সংযোগ করতে সক্ষম হতে হবে। এছাড়াও, সকেট যেভাবে আপনাকে কোনও ঠিকানা বাঁধার জন্য নির্দিষ্ট করতে দেয় সেটি 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

3
chmod 777: না না না না না! কখনও চালাও না chmod 777। এটি ব্যবহারিকভাবে কখনও প্রয়োজন হয় না! এমনকি "পরীক্ষার উদ্দেশ্যে" নয়। ফাইলটি যদি পঠনযোগ্য হয় তবে এটি পঠনযোগ্য। যদি এটি লিখিত হয় userবা groupএটিতে এটি লেখার প্রয়োজন হয়, তবে এটি লিখনযোগ্য। প্রত্যেককে লেখার অনুমতি দেওয়ার একদম শূন্য দরকার, এবং chmodএটিকে ভুলে যাওয়ার মতো কিছু বোঝার পক্ষে হ'ল বহুজাতিক কীভাবে হ্যাক হয়। শুধু এটা করবেন না। কখনো। আমি ইউনিক্স অনুমতিগুলির একটি ভূমিকা লিখেছিলাম । দয়া করে এটি পড়ুন!
মার্টিন টর্নোইজ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.