এসএসএইচ প্রতি হোস্ট প্রতি দুটি পৃথক আইপি ঠিকানা ব্যবহার করুন


23

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

এই মুহুর্তে, আমি তাদের দুটি পৃথক এন্ট্রিগুলিতে বিভক্ত করেছি ~/.ssh/conf

Host gamma-local
        HostName 192.168.1.100
        Port 22
        User andreas

Host gamma-remote
        HostName 55.22.33.99
        Port 12345
        User andreas

সুতরাং, আমি যদি কর্মস্থলে থাকি তবে আমাকে যা টাইপ করতে হবে তা হ'ল ssh gamma-localএবং আমি ভিতরে আছি; আমি যদি বাড়িতে (বা বিশ্বের অন্য কোথাও) থেকে থাকি তবে আমি দৌড়ে যাই ssh gamma-remote

সার্ভারের সাথে সংযোগ করার সময়, আমি যেখানে আছি তার উপর নির্ভর করে কোনও আলাদা নাম লিখতে হবে না, বরং সেই অংশটি স্বয়ংক্রিয়ভাবে সম্পন্ন হবে; উদাহরণস্বরূপ, কিছু ক্ষেত্রে আমার কাছে স্বয়ংক্রিয় স্ক্রিপ্ট রয়েছে যা আমার সাথে যোগাযোগ করে যারা আমি কোথায়।

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

এটি অর্জনের কোনও বিকল্প উপায় আছে যা বাশ স্ক্রিপ্টগুলির ব্যবহারের উপর নির্ভর করে না বা সংযোগটি প্রথম কাজ করে কিনা তা দেখার জন্য "পরীক্ষা" করে না?


আমি যা জানার চেষ্টা করছি তা হ'ল যদি কেউ এটি /etc/hostsঅর্জনের জন্য এসএসএইচ কনফিগারেশন ফাইলের সাথে ফিট করতে পারেন ? অথবা সম্ভবত আপনি কোন ল্যানে সংযুক্ত আছেন তা "সনাক্তকরণ" এর কোনও উপায়?
IQAndreas

আপনার অফিস নেটওয়ার্কের দ্বারা ব্যবহারকারীর আলাদা আলাদা সেট রয়েছে?
শ্রী

@ শ্রী আহ, আমি দেখতে পাচ্ছি আপনি কোথায় চলেছেন; চালাক! আমরা এই মুহুর্তে নেমসার্ভারটি চালাচ্ছি না, তবে আমি অবশ্যই মেশিনগুলির একটিতে একটিতে রূপান্তর করতে পারি।
আইকিউআন্দ্রিয়াস

@ শ্রী আপনার বিবরণে নির্দ্বিধায় অনুভব করুন এবং এটিকে যুক্ত করুন যা "আপনার অফিসের নেটওয়ার্কে যদি একটি নেমসার্ভার থাকে ..."
আইকিউআন্ড্রিয়াস

ওটা করেছিলাম. আপ / ডাউন ভোট নির্দ্বিধায় অনুভব করুন :)
শ্রী 14

উত্তর:


28

আপনি কোন নেটওয়ার্কটি চালু আছেন তা যদি জানার উপায় থাকে তবে আপনি যা চান তা করতে আপনি Matchকীওয়ার্ডটি ব্যবহার ~/.ssh/configকরতে পারেন। এর জন্য ওপেনএসএইচ ≥6.5 প্রয়োজন।

আমি কিছু অনুরূপ ব্যবহার

Match originalhost gamma exec "[ x$(/sbin/iwgetid --scheme) != xMyHomeESSID ]"
  HostName 192.168.1.100
  Port 22

Host gamma
  User andreas
  Port 12345
  HostName 55.22.33.99

সুতরাং আমি এসএসএইচ সংযোগের উদ্দেশ্যে বাসায় আছি কিনা তা নির্ধারণের জন্য আমি ব্যবহৃত ওয়াইফাই নেটওয়ার্কের শনাক্তকারী ব্যবহার করছি, তবে আপনাকে কম্পিউটারে নির্ধারিত আইপি ঠিকানা বা দুটি নেটওয়ার্কের পার্থক্যযুক্ত অন্য যে কোনও কিছুই ব্যবহার করা যেতে পারে ।


+1 এর চতুর ব্যবহার Match, ধন্যবাদ! শূন্য বা শূন্য-বহির্গমন প্রস্থান স্থিতির সাথে উপস্থিত একটি স্ক্রিপ্টে সনাক্তকরণটি মোড়ানো একটি ভাল ধারণা হতে পারে, যেহেতু এটি পুনরায় ব্যবহারযোগ্য করে তুলবে।
পিটার্ফ

@ পেটার্ফ এটি অবশ্যই বাহ্যিক স্ক্রিপ্টে বিমূর্ত হতে পারে, তবে আমার এখন পর্যন্ত কেবল এক জায়গায় প্রয়োজন ছিল, সুতরাং তিনটির বিধি এখনও চালু হয়নি ic
মিচা পলিটোভস্কি

আপনি যদি কর্মস্থলে থাকতেন তবে কী ঘটবে তবে আপনি আসলে অন্য কোনও মেশিনে সংযোগ স্থাপন করতে চান? আপনি নিজের হোমসাইডের সাথে ওয়াইফাইতে না থাকায় এবং তার ফলে হোস্টনামটি 192.168.1.100 এ সেট করেছেন তাই নির্বাহী বিবৃতি মিলবে না?
গেছে

@ গেছি আমি প্রশ্নটি বুঝতে পারি না। ম্যাচটিও লক্ষ্য হোস্টে।
মিশা পলিটোভস্কি

1
@typelogic সহজেই না, যতদূর আমি জানি। আপনি ব্যবহার করার চেষ্টা করতে পারেন ProxyCommand nc $address ssh, কিন্তু তারপর যেমন। সমস্ত ডিভাইসে কি একই হোস্ট কী রয়েছে? বিজ্ঞাপনটি যদি আপনাকে যাইহোক পরিবেশের পরিবর্তনশীল সেট করতে হয়, কেবল ঠিক যুক্তি হিসাবে সরাসরি সংযোগ করার জন্য ঠিকানাটি দেওয়া কি সহজ হবে না ssh?
মিশা পলিটোভস্কি

5

আপনার যদি কর্মক্ষেত্রে একটি প্রাইভেট নেমসার্ভার থাকে এবং আপনি যদি অফিস এবং বাসা থেকে একই ল্যাপটপ ব্যবহার করেন তবে আপনি এটি অর্জন করতে সেটির সুবিধা নিতে পারেন:

  1. nsswitch.confপ্রথমে ডিএনএসে চেক করতে আপনার মেশিনে আপনার পরিবর্তন করুন
  2. gammaঅফিসে আপনার ব্যক্তিগত ডিএনএসে 192.168.1.100 সমাধান করার জন্য একটি ডিএনএস এন্ট্রি তৈরি করুন ।
  3. gamma55.22.33.99 এ সমাধান করার জন্য আপনার মেশিনের / ইত্যাদি / হোস্ট ফাইলগুলিতে একটি এন্ট্রি তৈরি করুন ।

এইভাবে, আপনি যখন ssh gammaঅফিস থেকে আসবেন তখন এটি অফিস ডিএনএস থেকে 192.168.1.100 তে সমাধান হবে এবং আপনি যখন বাড়ি থেকে সংযোগ করবেন তখন এটি আপনার হোস্ট ফাইল থেকে 55.22.33.99 এ সমাধান হবে।

পিএস : এই উত্তরটি ধরে নিয়েছে যে আপনি গামার পাবলিক ডিএনএস এন্ট্রি করতে চান না। এছাড়াও, যদি আপনি একটি উইন্ডোজ মেশিন থেকে আপনার সার্ভারে এসএসএইচিং করে থাকেন তবে আমি মনে করি হোস্ট ফাইলের এন্ট্রিগুলিকে ওভাররাইড করার জন্য এনএসএসউইচ কোডফ ফাইলের সমতুল্য কিছু জায়গা থাকা উচিত।


আছে - এটি হোস্ট ফাইল file এবং ঠিক এটি আমি কীভাবে করি - বাড়িতে যখন আমার সর্বজনীন ডোমেনটি আমার স্থানীয় আইপি-তে সমাধান হয়। দুর্দান্ত উত্তর - এটি প্রথম জিনিস যা আমি খুব ভেবেছিলাম। আচ্ছা ... আজকে, যখন আমি কয়েক বছর আগে এটি সেট আপ করেছি তখন সমাধানের জন্য আমাকে অনেকগুলি গুগল করতে হয়েছিল।
মাইক্রজারভ

2

আমি জানি না যে এটির মাধ্যমে এটি করা সম্ভব কিনা ~/.ssh/configতবে অন্য একটি পন্থা হ'ল আপনার বাহ্যিক আইপি ঠিকানার ভিত্তিতে একটি বা অন্যটির সাথে সংযোগ স্থাপন করা। যেহেতু, সম্ভবতঃ, আপনি যখন কর্মস্থলে থাকবেন তখন আপনার আইপি হবে 55.22.33.NNN, আপনি এর মতো কিছু চালাতে পারেন:

[[ $(wget -qO - http://wtfismyip.com/text) =~ ^'55.22.33.' ]] && 
    ssh 192.168.1.100 ||
    ssh -p 12345 55.22.33.99

একটি এমনকি সহজ পদ্ধতির আপনার অভ্যন্তরীণ আইপি ব্যবহার করা হয়। আপনার দুটি নেটওয়ার্ক কীভাবে সেট আপ করা হয়েছে তা আমি জানি না তবে আপনি যদি আইপি এর মাধ্যমে কর্মরত আছেন কিনা তা নির্ধারণ করা যদি সহজ হয় (উদাহরণস্বরূপ, যদি আপনার কর্মক্ষেত্রে একটি নির্দিষ্ট আইপি থাকে, যেমন 192.168.1.12) তবে আপনি করতে পারেন ( eth0আপনার নেটওয়ার্ক কার্ডের নাম যাই হোক না কেন এতে পরিবর্তন করুন ):

[[ $(ip address show dev eth0 | grep -Po 'inet \K[\d.]+') = '192.168.1.12' ]] && 
    ssh 192.168.1.100 ||
    ssh -p 12345 55.22.33.99

আপনি যে কোনওটি ব্যবহারের সিদ্ধান্ত নেন না কেন, আপনি এটিকে আপনার শেলের একটি উপাধি হিসাবে যুক্ত করতে পারেন ( ~/.bashrcযদি আপনি ব্যবহার করেন তবে আপনার শেলের সূচনা ফাইলটিতে এই লাইনটি যুক্ত করুন bash):

alias gamma="[[ $(wget -qO - http://wtfismyip.com/text) =~ ^'55.22.33.' ]] && ssh 192.168.1.100 || ssh -p 12345 55.22.33.99

আপনি যদি অন্য স্ক্রিপ্টগুলিতে অ্যাক্সেস পেতে চান তবে আপনি এটি কোনও স্ক্রিপ্টেও তৈরি করতে পারেন ( .bashrcকোনও স্ক্রিপ্ট চলাকালীন উপকরণগুলি পড়া হয় না)।


2

~/.ssh/configহোস্টের নাম হিসাবে আইপি ঠিকানা ব্যবহার করার সময় আপনি এটি অর্জন করতে পারবেন না । অতিরিক্ত জটিলতা এই সত্য দ্বারা প্রবর্তিত হয় যে আপনি কেবল বিভিন্ন আইপি ঠিকানাগুলির সাথে সংযোগ করছেন না বরং বিভিন্ন পোর্টও বানাচ্ছেন, যেহেতু এটি আপনার ডিএনএস রেজলভারের কোনও টুইটকে নিষ্ক্রিয় করে দেয়।

আমি সংশোধন করেছি - আপনি ব্যবহার করতে পারেন Match originalhost ... exec ...মধ্যে কম্বো ~/.ssh/config- দেখুন @ MichałPolitowski এর উত্তর । তবে এটি ওপেনএসএইচ-এর জন্য পুরোপুরি সূক্ষ্মভাবে কাজ করবে, আপনি অন্য এসএসএইচ ক্লায়েন্টগুলিতে অগত্যা অনুরূপ কার্যকারিতাটি খুঁজে পাবেন না।

আপনি একটি সাধারণ মোড়কের সাহায্যে সমস্যার সমাধান করতে পারেন (শেল ফাংশন বা কোনও স্ক্রিপ্ট যদি আপনাকে বিভিন্ন শেল থেকে এটি ব্যবহার করার প্রয়োজন হয়) এর জন্য ssh, যা আপনি কোন নেটওয়ার্কে আছেন তা পরীক্ষা করে যথাযথ Hostএন্ট্রি ব্যবহার করবে । বড় প্রশ্ন হ'ল আপনি কী নেটওয়ার্কটিতে আছেন তা নির্ভরযোগ্যভাবে কীভাবে সনাক্ত করা যায়। স্থানীয় আইপি ঠিকানা মাথায় আসে, তবে এটি নির্ভরযোগ্য নয়, যেহেতু আপনি পাশাপাশি কোনও ল্যান থেকে সংযুক্ত হতে পারেন যা আপনার কাজের নেটওয়ার্কের মতো একই সাবনেট ব্যবহার করে।

আপনার যদি স্থানীয় এবং দূরবর্তী উভয় নেটওয়ার্কের জন্য একই বন্দর থাকতে পারে তবে আপনি /etc/resolv.confযে নেটওয়ার্কটি করছেন তার উপর নির্ভর করে আপনার সম্পাদনা করতে পারেন - অবশ্যই এটি স্বয়ংক্রিয়ভাবে সম্পন্ন করতে হবে (সম্ভবত আপনার ডিএইচসিপি ক্লায়েন্টের একটি হুক স্ক্রিপ্ট থেকে)। অথবা - আরও ভাল - স্থানীয় নাম সার্ভার চালান (উদাহরণস্বরূপ dnsmasq) এবং যথাযথ কনফিগারেশন সরবরাহ করুন। যদিও এই প্রশ্নের ক্ষেত্র অতিক্রম করে।

আরেকটি বিকল্প - আপনি শুধুমাত্র ইন্টারেক্টিভ সংযোগ করতে হবে - ব্যবহার কমান্ড সমাপ্তির যে স্ক্যান করবে ~/.ssh/config। এটি আপনাকে কিছু টাইপিং সাশ্রয় করবে (বিশেষত যদি আপনার পর্যাপ্ত Hostএন্ট্রি পৃথক করে থাকে )। এরকম কিছু ( bashসূচনা করার জন্য ):

# complete session names for ssh
declare -g _ssh_complete_hostlist 2> /dev/null
function _ssh_complete_init () {
    _ssh_complete_hostlist=$( \
        sed -nr '/^\s*Host\s*=/{s/^[^=]+= *//;s/ /\n/g;p}' ~/.ssh/config \
        | sort )
}
_ssh_complete_init

function _ssh_complete () {
    local match=${COMP_WORDS[${COMP_CWORD}]}
    local hosts=
    local default=
    for h in $_ssh_complete_hostlist; do
        if [[ $h =~ ^$match ]]; then
            hosts="$hosts $h"
        fi
    done
    if ! (( ${COMP_CWORD} == ${#COMP_WORDS[@]}-1 )); then
        default=$( compgen -f ${COMP_WORDS[${COMP_CWORD}]} )
    fi
    COMPREPLY=($hosts $default)
}
complete -F _ssh_complete ssh

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

এই সমস্ত বলেছে, এই সমস্যার কাছে যাওয়ার সঠিক উপায়টি একটি ভিপিএন এর মাধ্যমে ওয়ার্ক নেটওয়ার্কের সাথে সংযোগ স্থাপন করা এবং এইভাবে স্থানীয় অফিসের আইপি ঠিকানাটি অ্যাক্সেসযোগ্য যাতে আপনি অফিসে ছিলেন। : তারপর আপনি হার্ড টেলিগ্রাম যাই হোক না কেন যেটা স্তর আপনি পছন্দ মধ্যে সুরাহা করতে পারেন ~/.ssh/config, /etc/resolv.confঅথবা (এই প্রোগ্রামটিতে সবচেয়ে ভাল বিকল্প) অফিস নাম সার্ভার।


বন্দরগুলি পাথরে সেট করা নেই। আমি যদি স্থানীয় এসএসএইচ বন্দরটি gammaসহজেই দূরবর্তী বন্দরটির সাথে মেলাতে পরিবর্তন করতে পারি তবে যদি বিষয়গুলি আরও সহজ হয়।
আইকিউআন্দ্রিয়াস

2

কয়েক বছর আগে, আমি একই উদ্দেশ্যে একটি প্রোগ্রাম লিখেছিলাম । এটি আপনার প্রয়োজন স্যুট হতে পারে। সেই প্রোগ্রামটির সাথে এসএসএস কনফিগারেশনটি দেখতে দেখতে এটি দেখতে পেত:

Host gamma
    ProxyCommand ssh-multipath-proxy 192.168.1.100:22 55.22.33.99:12345
    User andreas

1

তবুও আরেকটি সমাধান হ'ল এসএসএইচের জন্য দুটি পৃথক কনফিগারেশন ফাইল ব্যবহার করা। আপনি একটি কনফিগার ফাইলে সমস্ত কিছু রাখার চেয়ে এটি সামান্য কম মার্জিত হিসাবে বিবেচনা করতে পারেন তবে এটি বজায় রাখা আরও সহজ।

আপনি যে কনফিগারেশন ফাইলটি ব্যবহার করতে চান তা নির্বাচন করুন -F <configfile>


ধন্যবাদ। আমি -Fবিকল্পটি পছন্দ করি।
টাইপলজিক

0

আংশিক উত্তর:

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

function identifyConnection {
    gatewayIP=$(route -n | grep -e '^0\.0\.0\.0' | tr -s ' ' | cut -d ' ' -f 2)

    if [[ ! -z "$gatewayIP" ]]
    then
        # Identify the gateway by its MAC (uniqueness...)
        log "Gateway IP address=$gatewayIP"
        log "Obtaining corresponding gateway MAC address"
        gatewayData=($(arp -n $gatewayIP | grep -e $gatewayIP | tr -s ' '))
        if [[ "${gatewayData[1]}" == "(incomplete)" ]]
        then
            log "Status of gateway $gatewayIP "incomplete""
            echo ""
        elif [[ "${gatewayData[2]}" == "--" ]]
        then 
            log "No MAC address found for $gatewayIP"
            echo ""
        else
            log "Gateway MAC address=[${gatewayData[2]}]"
            echo "${gatewayData[2]}"
        fi
    fi
}

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

আমার ক্ষেত্রে, স্ক্রিপ্টটি প্লাজমা ডেস্কটপ বিজ্ঞপ্তিগুলি ব্যবহার করে চালানো হয়, তাই সবকিছুই ইউজারল্যান্ডে রয়েছে।

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