অ্যান্ড্রয়েডের এক-VPN নিয়ম ফোনে চলা SSH সার্ভারকে ব্লক করে না
এক-VPN সীমা VPN পরিষেবাকে সীমিত করে, সকেটকে নয়। ফোনের SSH সার্ভার ব্যর্থ হয় শ্রোতা, সমকক্ষের প্রবেশ বা উত্তরের পথের কারণে।
এই বিশ্বাস এতটাই প্রচলিত যে একে সত্য ধরা হয়: অ্যান্ড্রয়েড কেবল একটি VPN অনুমতি দেয়, তাই ফোনে চলা SSH সার্ভার ওই টানেল দিয়ে কাজ করতে পারে না। প্রথম অংশ সত্য, কিন্তু সিদ্ধান্তটি আসে না। প্ল্যাটফর্মের সীমা হলো কতগুলো অ্যাপ VPN পরিষেবার স্লট নিতে পারে, কতগুলো সকেট থাকতে পারে বা কে ফোনে সংযোগ করতে পারবে তা নয়। শ্রোতা সকেটযুক্ত SSH ডেমন সাধারণ পোর্টযুক্ত সাধারণ অ্যাপ, আর টানেল তার ট্রাফিক যেতে পারে এমন পথগুলোর একটি।
এক-VPN নিয়ম আসলে কী সীমিত করে
VpnService এক-স্লট সম্পদ। কোনো অ্যাপ টানেল স্থাপন করলে সেটি ডিভাইসের VPN হয়ে যায়, আর দ্বিতীয় অ্যাপ স্থাপন করতে চাইলে প্রথমটি না যাওয়া পর্যন্ত তা প্রত্যাখ্যাত হয়। এটি টানেলের মালিকানা নিয়ে নিয়ম, এবং দুটি VPN ক্লায়েন্ট একসঙ্গে কেন চলতে পারে না তা ব্যাখ্যা করে।
শ্রোতা সকেট সম্পর্কে কিছুই বলে না। SSH সার্ভার VpnService ডাকে না, প্যাকেট আটকায় না, ওই স্লটের জন্য প্রতিযোগিতা করে না। এটি একটি পোর্ট বেঁধে সংযোগ গ্রহণ করে, VPN না থাকলেও যা করত। ফলে কল্পকাহিনিটি টানেল সরবরাহকারীর সীমাকে নেটওয়ার্ক সংযোগের সীমার সঙ্গে মিশিয়ে ফেলে, অথচ দুয়েরই সম্পর্ক নেই।
শ্রোতা একটি গন্তব্য, টানেলের অংশ নয়
টানেল থাকার পর ফোনের তাতে একটি ঠিকানা থাকে, আর সমকক্ষ ডিভাইসের সেই ঠিকানায় একটি রুট থাকে। কিছু উত্তর দেয় কি না তা ঠিক করে শ্রোতা। লুপব্যাকে বাঁধা ডেমন কেবল ফোন থেকেই পৌঁছানো যায়; পুরোনো টানেল ঠিকানায় বাঁধা ডেমন পুনঃসংযোগের পর ঠিকানা বদলালেও তার বাঁধন ধরে রাখতে পারে।
বাঁধার নিয়ম সাধারণ SSH কনফিগারেশন: শোনার ঠিকানা ও পোর্ট, এবং কে প্রমাণীকরণ করতে পারে। অ্যান্ড্রয়েডে এই সেটিংস অ্যাপের নিজের কনফিগারেশনে থাকে, আর অ্যাপ প্রক্রিয়ার মালিককে বিশেষাধিকারযুক্ত পোর্ট ব্যবহারের অনুমতি না-ও দেওয়া হতে পারে, তাই ডেস্কটপে রুট হিসেবে পোর্ট 22 বাঁধার অভ্যাস অপরিবর্তিতভাবে চলে না।
ListenAddress 10.90.0.4
Port 2222
AllowUsers aliceতারপর পথের উপরেই অনুমতি। বাইরের ওয়েব ট্রাফিক সহজে বহন করা গ্রাহক VPN-কে তার ক্লায়েন্টদের কাছে ইনবাউন্ড সংযোগ দিতেই হবে না; অনেকেই দেয় না, কারণ তাতে এক গ্রাহক আরেকজনের সামনে উন্মুক্ত হয়। সমকক্ষ যদি ফোনের টানেল ঠিকানায় কোথাও থেকেই পৌঁছাতে না পারে, সমস্যা পরিষেবার নীতিতে, ফোনে নয়।
উত্তরের পথেই সাধারণত ভাঙে
ধরে নিন সমকক্ষ ফোনের টানেল ঠিকানায় পৌঁছাল এবং SYN এল। এখন উত্তরকে সেই একই পথে বেরোতে হবে, আর সেটি ফোনের ভেতরের রাউটিং সিদ্ধান্ত। উত্তর যদি Wi-Fi দিয়ে বেরোয় কারণ সেটিই ডিফল্ট নেটওয়ার্ক, তবে সমকক্ষ এমন সংযোগ দেখে যা কখনো সম্পূর্ণ হয় না, আর তা হুবহু ফায়ারওয়ালের মতো দেখায়।
অ্যান্ড্রয়েড এটি ডেস্কটপের চেয়ে জটিল করে, কারণ ডিফল্ট নেটওয়ার্ক প্রতি প্রক্রিয়ায় বাছা হয় এবং VPN অ্যাপের নীতিতে বদলানো যায়। VPN ক্লায়েন্ট কেবল অনুমোদিত অ্যাপের তালিকা রাউট করতে পারে, তাই সেই তালিকার বাইরের সার্ভার অ্যাপ তার উত্তরগুলোর জন্য ভৌত নেটওয়ার্ক ব্যবহার চালিয়ে যায়, যদিও সমকক্ষ সেগুলো টানেল দিয়ে আশা করে।
অ্যাপ নিজের সকেটও নির্দিষ্ট নেটওয়ার্কে বাঁধতে পারে, যা ডিফল্টকে অগ্রাহ্য করে। কোনো পরিষেবা এক ঠিকানা থেকে পাওয়া যায় কিন্তু অন্যটি থেকে যায় না — এমন প্রতিবেদন পড়লে সাধারণত এর পেছনের কৌশল এটিই।
VPN বাইপাস করা ইনবাউন্ড পরিষেবা মেরামত করে না
জনপ্রিয় সমাধান, SSH অ্যাপকে VPN থেকে বাদ দেওয়া যাতে তার ট্রাফিক আর পুনর্নির্দেশিত না হয়, বিপরীত সমস্যার মেরামত। বাইরের SSH ক্লায়েন্টের পরিবহন টানেলের কারণে বারবার ভাঙলে এটি সাহায্য করে। হোস্ট করা সার্ভারের ক্ষেত্রে এটি উত্তরগুলো সমকক্ষের ব্যবহৃত টানেলের বাইরে সরিয়ে দিতে পারে, আর তাতে আংশিক ব্যর্থতা সম্পূর্ণ ব্যর্থতায় বদলে যায়।
রাউটারে পাবলিক পোর্ট খোলার ক্ষেত্রেও একই কথা। যদি চাহিদা হয় একটি অনুমোদিত ডিভাইস VPN দিয়ে ফোনে পৌঁছাবে, তবে SSH ইন্টারনেটে খুলে দেওয়া ভিন্ন হুমকি-মডেল, মেরামত নয়।
আগে পরিষেবার ঠিকানা ঠিক করুন: ফোনের LAN ঠিকানা, তার টানেল ঠিকানা, বা ইচ্ছাকৃতভাবে ফরওয়ার্ড করা এন্ডপয়েন্ট। প্রত্যেকের নিজস্ব প্রাপ্যতা ও উন্মুক্ততার চুক্তি আছে, আর সেগুলো মিশিয়ে দেওয়াই ছোট প্রবেশ সমস্যাকে স্থায়ী ফুটোয় পরিণত করে।
একবারে একটি দিক নির্ণয় করুন
কনফিগারেশন বদলানোর আগে চারটি তথ্য লিখে রাখুন: সমকক্ষ যে ঠিকানায় সংযোগ করছে, ফোনে শ্রোতার অবস্থা, এটি যে অ্যাপ ও ব্যবহারকারীর প্রেক্ষাপটে চলছে, এবং প্রতিটি দিকে দেখা পথ। VPN SSH কেটে দেয় — এমন প্রতিবেদনে এর কোনোটিই থাকে না এবং ক্লায়েন্ট পরিবহনের সমস্যাকে অপ্রাপ্য সার্ভার থেকে আলাদা করতে পারে না।
adb shell ip -br addr
adb shell ip route get 10.90.0.9
nc -vz 10.90.0.4 2222পোর্ট পরীক্ষা সমকক্ষ থেকে চালান, ফোন থেকে নয়, এবং SSH ক্লায়েন্টের বিস্তারিত আউটপুট পড়ে দেখুন TCP হ্যান্ডশেকের আগে না পরে ব্যর্থ হয়। যে সকেট কখনো সংযোগ করে না আর যে লগইন প্রত্যাখ্যাত হয় — এরা ভিন্ন স্তরের ভিন্ন মালিক।
ডিবাগ করার সময় হোস্ট-কি যাচাই ও অ্যাকাউন্টের সীমাবদ্ধতা অক্ষত রাখুন। শ্রোতা ও অনুমোদিত ব্যবহারকারীদের সীমিত করাই প্রাপ্য সার্ভারকে গ্রহণযোগ্য করে; সংযোগ চালাতে সেগুলো শিথিল করলে এক সমস্যার বদলে আরও খারাপটি পাওয়া যায়। OpenSSH সার্ভার রেফারেন্স শ্রবণ ও প্রবেশ নিয়ন্ত্রণ কভার করে, যদি আপনার অ্যান্ড্রয়েড রূপায়ণ একই কনফিগারেশন নাম মানে।