ssh -L একাধিক পোর্ট ফরওয়ার্ড করুন


129

আমি বর্তমানে একটি গুচ্ছ চালাচ্ছি:

sudo ssh -L PORT:IP:PORT root@IP

যেখানে আইপি একটি সুরক্ষিত মেশিনের লক্ষ্য, এবং পোর্টটি যে পোর্টগুলি আমি পাঠাচ্ছি তার প্রতিনিধিত্ব করে।

এটি কারণ আমি প্রচুর অ্যাপ্লিকেশন ব্যবহার করি যা আমি এই ফরোয়ার্ডিং ছাড়া অ্যাক্সেস করতে পারি না। এটি সম্পাদন করার পরে, আমি এর মাধ্যমে অ্যাক্সেস করতে পারি localhost:PORT

মূল সমস্যাটি এখন ঘটেছে যে আমার কাছে এই চারটি বন্দর রয়েছে যা আমাকে ফরোয়ার্ড করতে হবে।

আমার সমাধানটি হ'ল 4 টি শেল খোলা এবং ক্রমাগত আমার পোর্টগুলি ফরোয়ার্ড করা দরকার কিনা তা অনুসন্ধান করার জন্য আমার ইতিহাসটি ক্রমাগত পিছনে সন্ধান করা এবং তারপরে এই কমান্ডটি চালান - প্রতিটি শেলের মধ্যে একটি (পাসওয়ার্ড ইত্যাদি পূরণ করা)।

যদি কেবল আমি কিছু করতে পারতাম:

sudo ssh -L PORT1+PORT2+PORT+3:IP:PORT+PORT2+PORT3 root@IP

তাহলে এটি ইতিমধ্যে সত্যই সহায়তা করবে।

এটি করা সহজ করার কোনও উপায় আছে?

উত্তর:


195

-Lবিকল্প একই কমান্ড মধ্যে একাধিক বার নির্দিষ্ট করা যেতে পারে। প্রতিবার বিভিন্ন বন্দর দিয়ে।


20
প্রথমে আমি এই উত্তরটি বুঝতে পারি নি। সুতরাং যে কেউ একইরকম ভোগেন সে ক্ষেত্রে এখানে উদাহরণ পোস্ট করা। লেখকটির অর্থ "ssh -L পোর্ট0: আইপি: পোর্ট0-এল পোর্ট 1: আইপি: পোর্ট 1 ..."
মং এইচ এনজি

96

ঠিক কীভাবে এনএএন উত্তর দিয়েছে, আপনি একাধিক-এল আর্গুমেন্ট নির্দিষ্ট করেছেন। আমি সব সময় এটা করি। এখানে মাল্টি পোর্ট ফরওয়ার্ডিংয়ের একটি উদাহরণ রয়েছে:

ssh remote-host -L 8822:REMOTE_IP_1:22 -L 9922:REMOTE_IP_2:22

দ্রষ্টব্য : এটি -L localhost:8822:REMOTE_IP_1:22নির্দিষ্ট যেমন আপনি নির্দিষ্ট না করে localhost

এখন এটির সাহায্যে আপনি এখন (অন্য টার্মিনাল থেকে) করতে পারেন:

ssh localhost -p 8822

REMOTE_IP_1বন্দরে সংযোগ করতে22

এবং একইভাবে

ssh localhost -p 9922

REMOTE_IP_2বন্দরে সংযোগ করতে22

অবশ্যই আপনাকে এটিকে কোনও স্ক্রিপ্টে আবৃত করা বা স্বয়ংক্রিয়ভাবে আটকাতে বাধা দেওয়ার কিছুই নেই যদি আপনার কাছে বিভিন্ন নির্দিষ্ট হোস্ট / পোর্ট ফরওয়ার্ড করার জন্য এবং নির্দিষ্ট কিছু নির্দিষ্ট করে থাকে।

আশাকরি এটা সাহায্য করবে.


নান এর উত্তরের পরিপূরক। ধন্যবাদ।
এএফপি_৫৫৫

1
এ সম্পর্কে সতর্কতা অবলম্বন করুন: "দ্রষ্টব্য: এটি লোকালহোস্ট: 8822: REMOTE_IP_1: 22 এর মতোই যদি আপনি লোকালহোস্ট নির্দিষ্ট না করেন।" এটি কেবলমাত্র সত্য যদি গেটওয়েপোর্টস সেটিংটি 'না' হয় তবে এটি স্বীকৃতভাবে ডিফল্ট। তবে এর প্রভাবগুলি যদি তা না হয় তবে তা বিবেচনা করে আপনার সেটিংটি যাচাই করা উচিত বা আরও ভাল, স্পষ্ট হওয়া উচিত এবং "-L লোকালহোস্ট: 8822 ..." ব্যবহার করুন।
ডেভিড

আমি @ By default, anyone (even on different machines) can connect to the specified port on the SSH client machine. However, this can be restricted to programs on the same host by supplying a bind address: ssh -L 127.0.0.1:80:intra.example.com:80 gw.example.com ডেভিড
কার্ল পোকাস

24

আপনি নিম্নলিখিত বাশ ফাংশনটি ব্যবহার করতে পারেন (কেবল এটিতে আপনার যুক্ত করুন ~/.bashrc):

function pfwd {
  for i in ${@:2}
  do
    echo Forwarding port $i
    ssh -N -L $i:localhost:$i $1 &
  done  
}

ব্যবহারের উদাহরণ:

pfwd hostname {6000..6009}

2
-fপটভূমিতে চালানোর জন্য ব্যবহার করুন
কার্ল পোকাস

এহহম্মম ... তুমি কেন এমনভাবে করতে চাও?
আন্তন বেসনভ

14

একই হোস্টের মাধ্যমে একাধিক পোর্ট ফরওয়ার্ড করা লোকেরা তাদের ~ / .ssh / কনফিগারেশনে এর মতো কিছু সেটআপ করতে পারেন

Host all-port-forwards Hostname 10.122.0.3 User username LocalForward PORT_1 IP:PORT_1 LocalForward PORT_2 IP:PORT_2 LocalForward PORT_3 IP:PORT_3 LocalForward PORT_4 IP:PORT_4

এবং এটি একটি সরল ssh all-port-forwardsদূরে হয়ে যায়।


আমি এই পদ্ধতির পছন্দ।
বিএমডাব্লু

8

jbchichoko এবং yuval এর व्यवहार्य সমাধান দিয়েছে। তবে জেবিচোকোর উত্তর কোনও ফাংশন হিসাবে নমনীয় উত্তর নয় এবং যুবালের উত্তর দ্বারা খোলা টানেলগুলি বন্ধ করা যায় না ctrl+cকারণ এটি ব্যাকগ্রাউন্ডে চলে। আমি উভয় ত্রুটিগুলি সমাধান করার জন্য আমার সমাধানটি নীচে দিচ্ছি:

এখানে ~/.bashrcবা~/.zshrc :

# fsshmap multiple ports
function fsshmap() {
  echo -n "-L 1$1:127.0.0.1:$1 " > $HOME/sh/sshports.txt
  for ((i=($1+1);i<$2;i++))
  do
    echo -n "-L 1$i:127.0.0.1:$i " >> $HOME/sh/sshports.txt
  done
  line=$(head -n 1 $HOME/sh/sshports.txt)
  cline="ssh "$3" "$line
  echo $cline
  eval $cline
}

ফাংশনটি চালানোর একটি উদাহরণ:

fsshmap 6000 6010 hostname

এই উদাহরণের ফলাফল:

আপনি 127.0.0.1:16000~16009একই হিসাবে অ্যাক্সেস করতে পারেনhostname:6000~6009


3

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

পরিস্থিতি ১. হোস্ট-এ নামের স্থানীয় একটি মেশিন (যেমন আপনার নিজস্ব ল্যাপটপ) থেকে হোস্ট-বি নামে একটি রিমোট ওয়ার্ক মেশিনে লগইন করুন।

ssh user@Host-B -L port_A:localhost:port_B
jupyter notebook --NotebookApp.token='' --no-browser --port=port_B

তারপরে আপনি একটি ব্রাউজার খুলুন এবং প্রবেশ করতে পারেন: http: // লোকালহোস্ট: পোর্ট_এ / হোস্ট-বিতে আপনার কাজ করতে পারেন তবে এটি হোস্ট-এ দেখুন।

পরিস্থিতি ২. হোস্ট-এ নামের স্থানীয় মেশিন থেকে হোস্ট-বি নামে একটি দূরবর্তী লগইন মেশিনে লগইন করুন এবং সেখান থেকে হোস্ট-সি নামের রিমোট ওয়ার্ক মেশিনে লগইন করুন। এটি সাধারণত বিশ্ববিদ্যালয়গুলির মধ্যে বেশিরভাগ বিশ্লেষণমূলক সার্ভারের ক্ষেত্রে হয় এবং দুটি ssh -Lসংযুক্ত ব্যবহার করে অর্জন করা যায় -t

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C
jupyter notebook --NotebookApp.token='' --no-browser --port=port_C

তারপরে আপনি একটি ব্রাউজার খুলুন এবং হোস্ট-সিতে আপনার কাজটি করতে HTTP: // লোকালহস্ট: পোর্ট_এ / লিখতে পারেন তবে এটি হোস্ট-এ দেখুন see

পরিস্থিতি ৩. হোস্ট-এ নামের স্থানীয় মেশিন থেকে হোস্ট-এ নামের একটি দূরবর্তী লগইন মেশিনে লগইন করুন এবং সেখান থেকে হোস্ট-সি নামের রিমোট ওয়ার্ক মেশিনে লগইন করুন এবং শেষ পর্যন্ত রিমোট ওয়ার্ক মেশিনে লগইন করুন হোস্ট- ডি এটি সাধারণত এটি হয় না তবে এটি কখনও কখনও ঘটতে পারে। এটি সিচুয়েশন 2 এর এক্সটেনশন এবং একই যুক্তি আরও মেশিনে প্রয়োগ করা যেতে পারে।

ssh -L port_A:localhost:port_B user@Host-B -t ssh -L port_B:localhost:port_C user@Host-C -t ssh -L port_C:localhost:port_D user@Host-D
jupyter notebook --NotebookApp.token='' --no-browser --port=port_D

তারপরে আপনি একটি ব্রাউজার খুলতে এবং হোস্ট-ডিতে আপনার কাজটি করতে http: // লোকালহস্ট: পোর্ট_এ / লিখতে পারেন তবে এটি হোস্ট-এতে দেখতে পারেন।

নোট করুন যে পোর্ট_এ, পোর্ট_বি, পোর্ট_সি, পোর্ট_ডি এখানে তালিকাভুক্ত সাধারণ পোর্ট নম্বর বাদে এলোমেলো সংখ্যা হতে পারে । পরিস্থিতি 1 এ, পোর্ট_এ এবং পোর্ট_বি পদ্ধতিটি সহজ করার জন্য একই হতে পারে।


একটি অনুস্মারক, বিভিন্ন সার্ভারে একই পোর্ট বিভিন্ন পোর্ট। সুতরাং এটি অভিন্ন পোর্ট নম্বর নির্দিষ্ট করে জিনিসগুলিকে সর্বদা সহজ করে তুলতে পারে!
ফি ইয়াও

3

আমার সংস্থায় আমি এবং আমার দলের উভয়কেই একটি অ-অ্যাক্সেসযোগ্য "টার্গেট" সার্ভারের 3 টি বন্দরটিতে অ্যাক্সেসের প্রয়োজন আছে তাই আমি একটি স্থায়ী টানেল তৈরি করেছি (এটি এমন একটি টানেল যা অনির্দিষ্টকালের জন্য পটভূমিতে চলতে পারে, প্যারামগুলি দেখুন -fএবং -N) একটি অ্যাক্সেসযোগ্য সার্ভার থেকে লক্ষ্য এক। পৌঁছতে পারা যায় এমন সার্ভারের কমান্ড লাইনে:

ssh root@reachableIP -f -N  -L *:8822:targetIP:22  -L *:9006:targetIP:9006  -L *:9100:targetIP:9100

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

এখন পৌঁছনীয় মেশিনের 8822 পোর্টটি লক্ষ্যমাত্রার 22 টি (ssh / PuTTY / WinSCP এর জন্য) এর সাথে সামঞ্জস্য করে এবং পৌঁছনীয় মেশিনে 9006 এবং 9100 বন্দরগুলি লক্ষ্যমাত্রার একই পোর্টের সাথে সামঞ্জস্য করে (তারা আমার ক্ষেত্রে দুটি ওয়েব পরিষেবাদি হোস্ট করে) )।


1

আমি এসএস ফরওয়ার্ডিংয়ে সাহায্যের জন্য লোকো তৈরি করেছি । এটি একই বন্দরগুলিতে স্থানীয়ভাবে দূরবর্তীতে 5000 এবং 7000 বন্দরগুলি ভাগ করতে ব্যবহার করা যেতে পারে:

pip install loco

loco listen SSHINFO -r 5000 -r 7000

1

আপনি যদি এমন একটি সহজ সমাধান চান যা পটভূমিতে চলে এবং এটি হত্যা করা সহজ - একটি নিয়ন্ত্রণ সকেট ব্যবহার করুন

# start
$ ssh -f -N -M -S $SOCKET -L localhost:9200:localhost:9200 $HOST
# stop
$ ssh -S $SOCKET -O exit $HOST

1

যুয়াল আটজমন থেকে উত্সাহিত একটি সমাধান এখানে।

প্রাথমিক সমাধানের তুলনায় এর কয়েকটি সুবিধা রয়েছে:

  • প্রথমে এটি একটি একক পটভূমি প্রক্রিয়া তৈরি করে প্রতি বন্দর প্রতি এক নয়
  • এটি এমন উপকরণ তৈরি করে যা আপনাকে আপনার টানেলগুলি মারতে দেয়
  • এটি কেবল 127.0.0.1 এ আবদ্ধ হয় যা কিছুটা বেশি সুরক্ষিত

আপনি এটি হিসাবে ব্যবহার করতে পারেন:

  • tnl your.remote.com 1234
  • tnl your.remote.com {1234,1235}
  • tnl your.remote.com {1234..1236}

এবং সবশেষে তাদের হত্যা tnlkill

function tnl {
  TUNNEL="ssh -N "
  echo Port forwarding for ports:
  for i in ${@:2}
  do
    echo " - $i"
    TUNNEL="$TUNNEL -L 127.0.0.1:$i:localhost:$i"
  done
  TUNNEL="$TUNNEL $1"
  $TUNNEL &
  PID=$!
  alias tnlkill="kill $PID && unalias tnlkill"
}

-1

আপনি এই zsh ফাংশনটি ব্যবহার করতে পারেন (সম্ভবত ব্যাশের সাথেও কাজ করে) (এটি রাখুন ~/.zshrc):

ashL () {
    local a=() i
    for i in "$@[2,-1]"
    do
        a+=(-L "${i}:localhost:${i}")
    done
    autossh -M 0 -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -NT "$1" "$a[@]"
}

উদাহরণ:

ashL db@114.39.161.24 6480 7690 7477

ashL db@114.39.161.24 {6000..6050} # Forwards the whole range. This is simply shell syntax sugar.

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.