আপনার ডিভাইসটি ক্যারিয়ার NAT-এর পেছনে, এটি আউটবাউন্ড সংযোগ খুলতে পারে, এবং এমন একটি SSH সার্ভার চালায় যেখানে কেউ পৌঁছাতে পারে না। যে অনুরোধ আসে তা সাধারণত "এটিকে একটি VPN দিন" হিসেবে বলা হয়, যা কয়েকটি উত্তরের মধ্যে একটি। এটি মেনে নেওয়ার আগে ঠিক করুন আপনার একটি প্রশাসনিক TCP পোর্ট দরকার, নাকি সম্পূর্ণ সাবনেটে একটি রাউটেড পাথ, কারণ ওগুলো ভিন্ন এক্সপোজারযুক্ত ভিন্ন প্রকল্প।

রিভার্স টানেল সংকীর্ণ সংস্করণের ভালো উত্তর দেয়। ডিভাইসটি আপনার হাবে ডায়াল করে, হাবকে লুপব্যাক পোর্টে শোনার অনুরোধ করে এবং সেই পোর্টটি তার নিজের SSH সেবায় ফরোয়ার্ড করে। এরপর প্রশাসকরা পাবলিক ইন্টারনেটের মাধ্যমে নয়, হাবের মাধ্যমে লিসেনারে পৌঁছান।

সিদ্ধান্ত নির্ধারণকারী তিনটি শর্ত

কোনো কনফিগারেশনের আগে এগুলো লিখে রাখুন। এগুলো সীমিত ম্যানেজমেন্ট প্রবেশ ও নেটওয়ার্ক সম্প্রসারণের মধ্যকার সীমানা, আর এগুলো গুলিয়ে ফেললেই পাঁচ লাইনের টানেল মালিকহীন সমতল নেটওয়ার্কে পরিণত হয়।

ConditionReverse tunnel fitsSomething else is needed
How many services must be reachable?One, or a small fixed set on loopbackAnything that needs many ports or dynamic discovery
Who connects, and how are they authenticated?Named administrators with their own hub accountsThird parties, or anything needing per-flow audit you do not control
Does the device's own LAN need to be reachable?NoYes, so a routed VPN or a managed platform is the honest answer

তৃতীয় সারিটিই মানুষ যেটি নিয়ে তর্ক করে। ডিভাইসের SSH পোর্টে টানেল তার প্রতিবেশীদের আপনার নেটওয়ার্কে রাখে না, এবং আরও ফরোয়ার্ডের শৃঙ্খল দিয়ে তাকে তা করে দেখানো উচিত নয়। যদি চাহিদাটি সত্যিই LAN হয়, তাহলে তা বলুন এবং বদলে সেটিই ডিজাইন করুন।

হাবের দিক: একটি সীমিত রিলে অ্যাকাউন্ট

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

Match User relay-dev-7
    AuthenticationMethods publickey
    PubkeyAuthentication yes
    AllowTcpForwarding remote
    PermitListen 127.0.0.1:21022
    GatewayPorts no
    MaxSessions 0
    PermitTTY no
    X11Forwarding no
    AllowAgentForwarding no

MaxSessions 0 আকর্ষণীয় লাইন। এটি শেল ও সাবসিস্টেম সেশন অস্বীকার করে, অথচ ডিভাইসের প্রয়োজনীয় ফরোয়ার্ডিং অনুমোদন করে, তাই চুরি যাওয়া কি ইন্টারঅ্যাকটিভ লগইনে পরিণত হতে পারে না। PermitListen হাবের দিকের লিসেনার ঠিকানা ও পোর্ট পিন করে, এবং GatewayPorts no এটিকে হাব যে নেটওয়ার্কে বসে তার জন্য খোলার বদলে লুপব্যাকে রাখে।

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

ডিভাইসের দিক: জোরে ব্যর্থ হওয়া ফরোয়ার্ডিং

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

ssh -NT \
    -o ExitOnForwardFailure=yes \
    -o ServerAliveInterval=30 \
    -o ServerAliveCountMax=3 \
    -R 127.0.0.1:21022:127.0.0.1:22 \
    [email protected]

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

ExitOnForwardFailure=yes অনুরোধকৃত লিসেনার প্রতিষ্ঠা করতে না পারলে কমান্ডটি বেরিয়ে যাওয়ায় কাজ করে, তাই রিস্টার্ট লুপ অর্ধেক-চলা সেশন রেখে দেওয়ার বদলে আপনাকে সত্যিটা বলে। স্থানীয় SSH সেবা পরে সুস্থ কি না তা এটি কিছুই বলে না, তাই এটিকে একটি প্রসেস ম্যানেজার ও মাঝে মাঝে সত্যিকারের সংযোগ পরীক্ষার সাথে জোড়া দিন।

অতিরিক্ত হপ এড়াতে লুপব্যাক লিসেন ঠিকানাটি কখনো ওয়াইল্ডকার্ড দিয়ে বদলাবেন না। এই একক পরিবর্তনই ম্যানেজমেন্ট পাথ ও প্রকাশ্যে পৌঁছানোযোগ্য পোর্টের মধ্যে পার্থক্য, আর এটি সাধারণত ডিবাগিংয়ের সময় ঘটে এবং থেকে যায়। সহকর্মী হাবের মাধ্যমে পোর্টে পৌঁছাতে না পারলে বাইন্ডটি প্রশস্ত করার বদলে জাম্প কনফিগারেশন ঠিক করুন। এই ডিজাইনের সম্পূর্ণ নিরাপত্তা যুক্তি হলো লুপব্যাক।

হাবের মাধ্যমে প্রশাসক প্রবেশ

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

ssh -J [email protected] -o HostKeyAlias=device-7 \
    -p 21022 [email protected]

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

লাইফসাইকলের মালিকানা নিন

ডিভাইসের কমান্ডটি ঠিক একটি সক্রিয় ইনস্ট্যান্স এবং সচেতনভাবে বেছে নেওয়া রিস্টার্ট নীতিসহ একটি প্রসেস ম্যানেজারের অধীনে চালান। কিপঅ্যালাইভ অপশনগুলো মৃত সহযোগী শনাক্ত করে; তারা বেরিয়ে যাওয়া প্রসেসকে পুনরুজ্জীবিত করে না।

তারপর অবসর প্রক্রিয়া লিখুন। প্রতিটি ডিভাইস নিজের লিসেনার ও নিজের কি পায়, তাই ডিকমিশন মানে সেই অ্যাকাউন্ট বাতিল করা এবং সেই কি সরানো, অন্য সব ডিভাইসের সঙ্গে ভাগ করা ফ্লিট-ব্যাপী গোপনীয়তা ঘোরানো নয়।

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

সম্পর্কিত নিবন্ধ