OpenVPN-এ SSH আটকে যায়? আগে পাথ MTU মাপুন
ইকো কাজ করে, তারপর একটি তালিকা সেশনটি চিরতরে আটকে দেয়। mssfix, fragment বা ইন্টারফেস MTU সম্পাদনার আগে দুই দিক থেকেই সীমা মাপুন।
SSH সংযোগ হয়, প্রম্পট আসে, আর কোনো কমান্ড উল্লেখযোগ্য কিছু ফেরত দিতেই সেশনটি মরে যায়। ইকো কিছুক্ষণ কাজ করে, তারপর ক্লায়েন্ট এখনো টানেল চালু দেখাচ্ছে অথচ সংযোগের সময় শেষ হয়ে যায়। ডেটা আসার আগ পর্যন্ত সুস্থ থাকা সেশন সাধারণত SSH-এর ত্রুটি নয়, বরং আকারের সীমায় ধাক্কা খায়। নিচের পরীক্ষাগুলো এমনভাবে সাজানো যাতে সবচেয়ে সস্তা ব্যাখ্যাটি আগে বাদ পড়ে।
প্রোফাইলে হাত দেওয়ার আগে ব্যর্থতার আকৃতি পড়ুন
ছোট প্যাকেট পার হয়, পূর্ণ প্যাকেট নয়। প্রম্পট, ব্যানার বা একটি কী-চাপ সহজেই আঁটে; ডিরেক্টরি তালিকা, ডাউনলোড বা পেস্ট করা ব্লক আঁটে না। যে আকারে আচরণ বদলায় সেটাই সূত্র, SSH কোন প্রোগ্রাম তা নয়।
ব্যবস্থাটি হলো পাথ MTU ডিসকভারি, যা ফিডব্যাকের ওপর নির্ভর করে. TCP একটি সেগমেন্ট আকার বেছে নেয়, আর পথের কোনো রাউটার ফলাফল প্যাকেটটি পাঠাতে না পারলে ICMP বার্তা দিয়ে তা জানানোর কথা। এনক্যাপসুলেশন বাইরের প্যাকেটকে ভেতরের চেয়ে বড় করে, তাই টানেলের ভেতরে ব্যবহারযোগ্য আকার সবসময় ভৌত লিঙ্কের নিচে থাকে। ওই ICMP বার্তাগুলো যেকোনো জায়গায় ফিল্টার করলে প্রেরক সংশোধনটি কখনো পায় না, পূর্ণ সেগমেন্ট পাঠাতেই থাকে, আর বাইরের প্যাকেট নিঃশব্দে বাদ পড়ে।
দুই দিক থেকেই সীমা মাপুন
যেকোনোটি বদলানোর আগে টানেলের MTU-এর সঙ্গে ভৌত লিঙ্ক তুলনা করুন। যে টানেল ভৌত মানটি কপি করেছে সে ইতিমধ্যেই বলে দিয়েছে অমিলটি কোথায়।
টানেলের ভেতর থেকে ফ্র্যাগমেন্ট-নিষিদ্ধ অনুরোধে পরীক্ষা করুন, উত্তর ফেরা পর্যন্ত পেলোড কমাতে থাকুন। আকারের যুক্তিটি কেবল পেলোড গোনে, তাই কাজ করা সংখ্যাটি সবসময় ইন্টারফেস MTU-এর নিচে থাকে। ইন্টারফেসের সংখ্যা দরকার হলে হেডারের আকার আবার যোগ করুন।
ip link show tun0
ping -M do -s 1380 10.9.0.1টানেলের বাইরে থেকে সার্ভারের পাবলিক ঠিকানার বিরুদ্ধে পরীক্ষাটি পুনরাবৃত্তি করুন। সেখানেও বড় পরীক্ষা ব্যর্থ হলে সীমাটি সার্ভারের পথেই বসে আছে এবং কোনো টানেল অপশন তা সরাবে না। এই তুলনাটি আপনাকে এমন ক্লায়েন্ট টিউন করা থেকে বাঁচায় যে কখনোই সমস্যা ছিল না। কনফিগারেশন ফাইল খোলার আগে দুই ফলাফলই লিখে রাখুন।
mssfix আর fragment আলাদা কাজ করে
mssfix টানেলের ভেতরের TCP সংযোগগুলো হ্যান্ডশেকের সময় যে সেগমেন্ট আকার ঘোষণা করে তা সীমিত করে। SSH, HTTPS ও ফাইল কপির জন্য এটাই সঠিক লিভার, তাই এটি বসানোর পরেই আটকে যাওয়া প্রায়ই মিলিয়ে যায়। এটি UDP পেলোডে একেবারেই হাত দেয় না।
যে টানেল UDP সেবাও বহন করে সেটি SSH ঠিক হওয়ার পরেও ব্যর্থ হতে পারে, আর এই ফলাফল এমন সবাইকে বিভ্রান্ত করে যারা ভাবে একটি অপশনই সব ঢেকে দেয়।
fragment হলো অন্য ব্যবস্থা এবং ভিন্ন হাতিয়ার। এটি এনক্যাপসুলেশনের আগে অতিরিক্ত বড় প্যাকেট ভাগ করে, কেবল UDP পরিবহনে প্রযোজ্য, প্রতি ডেটাগ্রামে বাড়তি খরচ যোগ করে এবং ভাঙা ডিসকভারির জন্য শেষ উপায় হিসেবে নথিভুক্ত। দুই সেটিংসই টানেল শেষ করা পিয়ারদের মধ্যে মিলতে হবে। এক প্রান্ত সীমিত করছে আর অন্য প্রান্ত ফ্র্যাগমেন্ট করছে — এতে লগে সতর্কবার্তা আসে এবং ফাইল দেখে কেউ অনুমান করতে না পারে এমন আচরণ হয়।
ইন্টারফেস MTU কমানো মোটা দাগের বিকল্প
দুই প্রান্তেই ইন্টারফেস MTU কমানো মোটা দাগের হাতিয়ার। এটি প্রতিটি ভেতরের প্রেরককে ছোট সংখ্যা বলে, যা কাজ করে, আর সে খরচ প্রয়োজনীয় TCP প্রবাহের বদলে সব ট্রাফিকের ঘাড়ে চাপায়।
এটি বেছে নিন যখন টানেল এমন ট্রাফিক বহন করে যা আপনি সীমিত করতে পারবেন না, বা ক্লায়েন্ট এমন যন্ত্র যার প্রোফাইল আপনার নিয়ন্ত্রণে নেই। এটি প্রতিসমভাবে প্রয়োগ করুন এবং মানটি প্রোফাইলের পাশে লিখে রাখুন। অর্ধেক প্রয়োগ করা পরিবর্তন কিছু না করার চেয়েও খারাপ, কারণ এটি সমাধানের মতো দেখায়।
যে স্থানান্তরটি আটকে গিয়েছিল তা দিয়েই আবার পরীক্ষা করুন
সেটিংস লোড হওয়ার জন্য আবার সংযোগ করুন, নতুন সংযোগ খুলুন এবং যে কমান্ডটি জমে গিয়েছিল তা পুনরাবৃত্তি করুন। সেগমেন্ট আকার হ্যান্ডশেকের সময় নির্ধারিত হয়, তাই পুনঃসংযোগ পার হওয়া সেশন এখনো পুরোনো মান বহন করে। এখানে ping দুর্বল পরীক্ষা, কারণ পুরো ব্যর্থতাটাই হলো ছোট প্যাকেট পার হয়। যে তালিকা, ডাউনলোড বা পেস্ট ভেঙেছিল সেটিই ব্যবহার করুন।
ছোট আকারেও আটকে থাকলে অন্য জায়গায় দেখুন: স্টেটফুল ফায়ারওয়াল প্রবাহটি শেষ করে দিচ্ছে, ঠিকানা দ্বিগুণ হয়েছে, বা পুনঃসংযোগে রুট সরে যাচ্ছে। যে পরীক্ষার আকার ব্যর্থ হলো এবং যে সেটিং বদলালেন তা লিখে রাখুন, কারণ ওই জোড়াটিই পরের প্রতিবেদনকে কাজে লাগায়।