একই টার্মিনাল কমান্ডটি ব্যবহার করে ল্যানের ভিতরে এবং বাইরে থেকে এসএসএইচ অ্যাক্সেস


10

আমার একটি রাস্পবেরি পাই (আরপিআই) আছে এবং আমি এসএসএস ব্যবহার করে এটিতে দূরবর্তী সংযোগগুলি করছি। আমি সঠিকভাবে এসএসএস সেট আপ করতে সক্ষম হয়েছি যাতে আমি স্থানীয় অঞ্চল নেটওয়ার্ক এবং ইন্টারনেট থেকে (আমার রাউটারে খোলা একটি নির্দিষ্ট পোর্ট ব্যবহার করে) আরপিআই অ্যাক্সেস করতে পারি।

ব্যবহারকারীর নাম johnএবং একটি আরপিআই নামক ধরে নেওয়া raspi:

ল্যান অ্যাক্সেসের ভিতরে

ssh john@192.168.2.7
ssh john@raspi
ssh raspi

ল্যান অ্যাক্সেসের বাইরে

ssh -p 1234 john@12.345.67.89
ssh -p 1234 12.345.67.89

তবে আমি কীভাবে ssh raspiআমার ল্যানের বাইরে থেকে কীভাবে পারি ? দুটি আইপি-অ্যাড্রেসগুলি, একটি ল্যানে এবং একটি ইন্টারনেটের মাধ্যমে দেখানোর জন্য রাস্পি কনফিগার করার কোনও উপায় আছে কি?

আমি মূলত যা চাই তা হ'ল আমার আরপিআইটি এককভাবে অ্যাক্সেস করা, আমি বাড়িতে বা কর্মস্থল থাকুক না কেন।


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

: এই Q & A- দেখুন unix.stackexchange.com/questions/61655/...
SLM

উত্তর:


7

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

আপনার ~/.ssh/config, যোগ করুন:

Host raspi-wan
    HostName 12.34.56.78
    User john
    Port 1234

Host raspi-lan
    HostName 192.168.1.2
    User john
    Port 22

তারপরে, আপনি ssh raspi-wanল্যানের বাইরে থেকে বা ল্যানের ssh raspi-lanভিতরে থেকে ডিএনএস সার্ভারগুলি নিয়ে ত্রুটি না করে বা /etc/hostsসমস্ত ব্যবহারকারীর জন্য সম্পাদনা , বা রুট হিসাবে কিছু করার প্রয়োজন নেই। আপনি raspiকোথায় আছেন তার উপর নির্ভর করে নামটি যদি অন্যরকমভাবে সমাধান করতে চান তবে আপনার নেটওয়ার্কটি সনাক্ত করতে এবং সেই অনুযায়ী কাজ করতে সম্ভবত কিছু শেল স্ক্রিপ্টিং ম্যাজিকের প্রয়োজন হবে।


1
ধন্যবাদ দোপগোতি, একটি -wanএবং -lanপোস্টফিক্স অন্তর্ভুক্ত করার জন্য আমি আপনার সমাধানটি দিয়ে খুব আরামদায়ক । আমার এসএসএস Usernameফিল্ডটি পছন্দ করেনি (খারাপ কনফিগারেশন বিকল্প)। এটা ছাড়া এটি ঠিক কাজ করছে।
এ্যারোনালিয়াস

2
আমি দুঃখিত, সঠিক বাক্য গঠন User john, না UserName। এটি প্রতিফলিত করার জন্য আমি আমার উত্তরটি সংশোধন করছি, এবং একবার আপনি নিজের কনফিগারটি সেট করে নিলে আপনি sshকমান্ড লাইন থেকে ব্যবহারকারীর নাম বাদ দিতে পারেন ।
ডোপঘোটি

5

ল্যান এবং ওয়ানের জন্য পৃথক উপকরণ ব্যবহার না করে বা কোনও অতিরিক্ত পোর্ট ফরওয়ার্ড তৈরি না করে এটি কেবল ssh কনফিগারেশনের মাধ্যমে পুরোপুরি কার্যকর do (তবে আপনি স্বাভাবিকভাবেই আপনার লেনের অভ্যন্তরে রয়েছেন কিনা তা সনাক্ত করার জন্য আপনার কিছু উপায় প্রয়োজন)

ইন ~/.ssh/config, আপনি এর মতো কিছু যুক্ত করতে চাইবেন:

Match host raspi exec "am_i_outside_of_my_lan"
    HostName 12.345.67.89
    Port 1234

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

hostশর্ত সম্ভবত স্বশাসিত, কিন্তু execশর্ত পরোয়ানা কিছু ব্যাখ্যা: এটা মিলে যায় শুধুমাত্র যখন প্রস্থান কোড 0, অর্থাত দিয়ে নির্দিষ্ট কমান্ড আয়। কোন ত্রুটি।

সুতরাং অন্য কথায়, এটি যা করে তা সেই host raspiঅংশটি এই নিয়মটিকে সীমাবদ্ধ করে যখন আপনি হোস্ট রাস্পির সাথে সংযোগ স্থাপন করার চেষ্টা করেন এবং পরবর্তীটি exec "am_i_outside_my_lan"এটি সীমাবদ্ধ করে তোলে যাতে আপনি কেবলমাত্র আপনার বাড়ির নেটওয়ার্কের বাইরে থেকে সংযোগ স্থাপন করার সময় এটি প্রয়োগ হয় app সুতরাং আপনার হোম নেটওয়ার্কের অভ্যন্তরে ssh user@raspiএটি সাধারণত যা হয় ঠিক ঠিক তা করে তবে এর বাইরেও নিয়ম মেলে এবং এর পরিবর্তে এর সমতুল্য হয় ssh -p 1234 user@12.345.67.89

কী স্থানে ব্যবহার করবেন am_i_outside_of_my_lanতা সম্পূর্ণ আপনার সেটআপের উপর নির্ভর করে। কমান্ডগুলি ইনলাইনটি লেখার চেষ্টা না করে আলাদা স্ক্রিপ্টে রাখার পরামর্শ দিচ্ছি, কারণ উদ্ধৃতিটি সঠিকভাবে পাওয়া কিছুটা কঠিন বলে মনে হচ্ছে।

আমি ব্যক্তিগত নেটওয়ার্কের মধ্যে আছি কিনা তা সনাক্ত করার জন্য ব্যক্তিগতভাবে আমি নীচের পাইথন স্ক্রিপ্টটি ব্যবহার করেছি: (যেহেতু আমার ডোমেনটির নামটি আমার নিজের নেটওয়ার্কের অভ্যন্তরীণ স্থানীয় আইপি তে সমাধান হয়)

#! /usr/bin/env python
import socket, sys

sys.exit(socket.gethostbyname('mydomain.com').startswith('192.168.1.'))

আপনার যদি অনুরূপ সেটআপ না থাকে তবে আপনাকে অন্য কিছু করতে হতে পারে। (উদাহরণস্বরূপ, আপনি যে ওয়্যারলেস নেটওয়ার্কটি সংযুক্ত রয়েছেন তার নামটি দেখতে পারেন বা আপনার সাথে সংযুক্ত থাকা নেটওয়ার্কের বহিরাগত আইপি পেতে কিছুটা কী- আমার-আইপি পরিষেবাটি জিজ্ঞাসা করতে পারেন)


এটা সঠিক উত্তর; অন্যের বেশি ভোট পেয়ে এটি অত্যন্ত দুঃখজনক।
জোনাথন টোমার

@ জোনাথন টোমর: ঠিক আছে, আমি এটি জিজ্ঞাসা করার 3 বছর পরে উত্তর দিয়েছি, যেখানে উচ্চতর স্কোরিং উত্তরগুলি কয়েক ঘণ্টার মধ্যে পোস্ট করা হয়েছিল, সুতরাং এটি "প্রথম পাখির কীট পেল" এর একটি ঘটনা: পি (আমারও আছে) এটি বলার জন্য যে আমি এলিস হোগের এই সাধারণ সমাধানটির নির্দিষ্ট রূপটি বেশ পছন্দ করি - আরপ ব্যবহার করা বেশ চালাক, এবং সমাধানটিকে আরও জেনারিক করে তোলে যেমন নেটওয়ার্ক সনাক্তকরণ কমান্ডে প্রতিটি নেটওয়ার্ক সেটআপের জন্য সুর করা উচিত নয়)
আলেক্সি তোড়হামো

3

আপনার কম্পিউটার (connect- উপর ING একটি), আপনার জন্য একটি হোস্ট নাম সেট করতে পারেন 12.345.67.89। আপনার /etc/hostsফাইলটি খুলুন এবং একটি ডিএনএস এন্ট্রি সেট করুন:

12.345.67.89    raspi

আপনার মেশিনটি স্থানীয় ডিএনএস সমাধানের প্রক্রিয়াটির অংশ হিসাবে "রাস্পি" কে "12.345.67.89" তে রূপান্তর করবে। আপনি যদি বেশ কয়েকটি মেশিন ব্যবহার করেন তবে তাদের প্রত্যেককেই পরিবর্তন আনতে হবে। সমস্যাটি হ'ল: সম্পাদনার জন্য এটির রুট অ্যাক্সেসের প্রয়োজন /etc/hostsএবং এটি আপনার সর্বত্র নাও থাকতে পারে।

আপনি যদি "রাস্পি" কোথাও থেকে স্বয়ংক্রিয়ভাবে স্বীকৃতি পেতে চান তবে দুঃখিত: সম্ভব নয়। এর জন্য একটি ডোমেইন নাম হিসাবে "রাস্পি" রেজিস্ট্রেশন প্রয়োজন, যা "রাস্পি" এর টিএলডি না থাকায় ঘটতে পারে না এবং এটি কোনও ডিএনএস রুট সার্ভারের উপর নির্ভর করে না। তবে, আপনি একটি ডোমেন নাম নিবন্ধন করতে পারেন (আসুন বলুন cfbaptista.meএবং এটি আপনার WAN আইপি ঠিকানার দিকে নির্দেশ করুন some কিছু পোর্ট ফরওয়ার্ডিংয়ের মাধ্যমে আপনি আপনার রাস্পবেরি পাই এর সাথে অ্যাক্সেস করতে সক্ষম হবেন:

ssh (you@)(raspi.)cfbaptista.me

(তবুও, এটি প্রায় কোনও কিছুর জন্য অর্থ ব্যয় করে ...)

বিষয়ে user@অংশ, এটা ভিন্ন মেশিনে আপনার লগইন নাম উপর নির্ভর করে। আপনার উপর একই নামের যদি সংযোগ মেশিন এবং উপর দূরবর্তী এক, তারপর নির্দিষ্ট করার কোন প্রয়োজন নেই। যদি তা না হয় তবে আপনাকে দূরবর্তী মেশিনে কারা আছেন তা নির্দিষ্ট করতে হবে ।


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

প্রকৃতপক্ষে ! এখানে একটি ছোট লিঙ্কটি দেওয়া হয়েছে: collectiveidea.com/blog/archives/2011/02/04/how-to-ssh-aliases
জন ডাব্লু এইচ স্মিথ

0

লক্ষ্য: ssh raspi ল্যানের ভিতরে এবং সর্বজনীন ইন্টারনেটে কাজ করা উচিত।

এটি করার জন্য আপনাকে নিশ্চিত করতে হবে যে নামটি ল্যানের অভ্যন্তরীণ আইপি, এবং বাইরে থেকে পাবলিক আইপিতে সমাধান হয়েছে।

প্রথমত, আপনার যেমন একটি ডোমেন নাম পাওয়া উচিত raspi.yourdomain.com। শখের ব্যবহারের জন্য নিখরচায় ডোমেনগুলির জন্য http://freedns.afraid.org/ দেখুন । আপনার সার্বজনীন আইপিতে ডোমেনটি নির্দেশ করুন

ল্যানের জন্য, আমি DNSMasq চালানোর পরামর্শ দিই। খোলা ডিডি-ডাব্লুআরটি ফার্মওয়্যারটি ডিএনএসএমস্কের সাথে দৃ D়ভাবে সংহত করে, এটি ডিএইচসিপি এবং ডিএনএসের জন্য ব্যবহার করে। আপনাকে কেবল এটি আপনার অনুসন্ধান ডোমেন ("yourdomain.com") বলতে হবে এবং এটি প্রতিটি ক্লায়েন্টের অনুরোধকৃত নামের উপর ভিত্তি করে ডিএনএস নামগুলি স্বয়ংক্রিয়ভাবে বরাদ্দ করবে। এই কাজটি করার জন্য, রাস্পির / ইত্যাদি / হোস্টনামটি পড়তে হবে raspi

এটি সেট আপ হয়ে গেলে, raspi.yourdomain.com আপনার ল্যানের স্থানীয় আইপি সমাধান করা উচিত (কেবলমাত্র আপনি আপনার সমস্ত মেশিনে স্থানীয় ডিএনএস ব্যবহার করছেন) তা নিশ্চিত করুন।

এখন, আপনি সম্ভবত 22 জন বন্দরটিকে পাবলিক ইন্টারনেটে প্রকাশ করতে চান না, কারণ আপনি এক টন স্নিফার ট্র্যাফিক পাবেন। সুতরাং আপনার রাউটারটি রাস্পি এক্সপোজিং করতে পারে: অন্য কয়েকটি বন্দর হিসাবে, 2234 বলুন public সরকারী এবং অভ্যন্তরীণ উভয় নেটওয়ার্কে একই পোর্টটি ব্যবহার করতে, আপনি একটি পোর্টকে রাস্পিতে পুনর্নির্দেশের নিয়ম যুক্ত করতে পারেন। লিনাক্সে:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 1234 -j REDIRECT --to-port 22
sudo sh -c 'iptables-save > /etc/iptables/iptables.rules'

(এথ0 পরিবর্তন করুন আপনার নেটওয়ার্ক ইন্টারফেসের নামে ip linkবা ifconfigআপনার পাবলিক পোর্টে 1234 হিসাবে দেখানো হয়েছে )

এখন আপনি ssh -p 1234 raspi.yourdomain.comসর্বজনীন এবং ল্যান উভয় থেকে করতে পারেন ।

ssh raspi@DopeGhoti দ্বারা উল্লিখিত হিসাবে আপনি এটিকে কেবল সংক্ষিপ্ত করতে আপনার ক্লায়েন্ট মেশিনে ~ / .ssh / config এ একটি এন্ট্রি যুক্ত করতে পারেন ।

আপনি যদি একই পাবলিক আইপিতে অতিরিক্ত মেশিনগুলির এসএসএইচ বন্দরগুলি প্রকাশ করতে চান তবে কেবলমাত্র অন্য ডিএনএস নাম এবং পাবলিক বন্দর দিয়ে প্রক্রিয়াটি পুনরাবৃত্তি করুন। চিয়ার্স!


0

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

আপনার ~/.ssh/configঅ্যাড

Match host raspi exec "[[ $(curl -s ipinfo.io/ip) == '12.345.67.89' ]]"
  User john
  HostName 192.168.2.7

Match host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]"
  User john
  HostName 12.345.67.89
  Port 1234

আমি বিশ্বাস করি যেssh সমস্ত মিলে যাওয়া নির্দেশিকাগুলি যথাযথভাবে প্রক্রিয়া করবে, সুতরাং তত্ত্ব অনুসারে আপনার Match host raspi / User john / HostName 192.168.2.7অনুসরণের মতো কিছু করতে সক্ষম হওয়া উচিত Match host raspi exec "[[ $(curl -s ipinfo.io/ip) != '12.345.67.89' ]]" / HostName 12.345.67.89 / Port 1234এবং কেবলমাত্র একটি curlঅনুরোধের মাধ্যমে একই প্রভাব == '12.345.67.89'পাওয়া উচিত, দ্বিতীয় Matchনিয়মের ব্যর্থতায় মামলাটি ধরে নেওয়া উচিত exec
এফআরডি

(আপনাকে অবশ্যই এটি নিশ্চিত করতে হবে যে প্রথমটিতে বর্ণিত প্রতিটি যুক্তিটি Matchএকই হয় বা দ্বিতীয়টিতেও সুনির্দিষ্ট - আপনি যদি Port xxxxপ্রথমে কোনও অ-মানক নির্দিষ্ট করেছেন Matchএবং দ্বিতীয়টিতে মানক বন্দর ব্যবহার করতে চান Match, আপনাকে স্পষ্ট করে এটিকে আবার ওভাররাইড করতে হবে Port 22যাতে এটি বন্দর ব্যবহার করা অব্যাহত রাখে না xxxx))
FeRD

0

ধরে নিই আপনার মেশিনে আইপি 192.168.1 রয়েছে * * আপনার ল্যানের সাথে সংযুক্ত থাকাকালীন আপনি নিম্নলিখিত কনফিগারেশনের মাধ্যমে এটি অর্জন করতে পারেন ~/.ssh/configযাতে আপনি সর্বদা ssh raspiসংযোগ করতে একই কমান্ডটি (জাস্ট ) ব্যবহার করতে পারেন :

Match Originalhost raspi Exec "ifconfig | grep 192\.168\.1\."
    HostName 192.168.1.2
    User john
    Port 22

Host raspi
    HostName 12.34.56.78
    User john
    Port 1234

0

এই সমাধানটি ধরে নিয়েছে যে আপনার হোম নেটওয়ার্কের একক রাউটার রয়েছে যা আমি বিশ্বাস করি এটি সাধারণ ঘটনা।

আপনার যোগ করুন ~/.ssh/config

Match host raspi exec "test $(arp 192.168.1.1 | awk '{print $4}') = ROUTER_MAC_ADDRESS"
        Hostname 192.168.2.7
        User john

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