VPN গেটওয়েতে MSS ক্ল্যাম্পিং: এটি কী ঠিক করে আর কী করে না
ক্ল্যাম্পিং TCP হ্যান্ডশেকে MSS পুনর্লিখন করে যাতে সেগমেন্টগুলো টানেলে ধরে। এটি কখনও UDP বা ভাঙা path-MTU পরীক্ষা ঠিক করে না। তিনটি পরীক্ষা, ক্রমে।
ছোট অনুরোধ কাজ করে, বড় ডাউনলোড ঝুলে যায়, আর কেউ এসে MSS ক্ল্যাম্পিংয়ের পরামর্শ দেয়। এই পরামর্শ যথেষ্ট বার সঠিক, যাতে সঠিক ক্রমে চেষ্টা করা যায়, আবার যথেষ্ট বার ভুল, যাতে না বুঝে প্রয়োগ করলে একটা বিকেল নষ্ট হয়। নিচের তিনটি পরীক্ষা আসল TCP আকারের সমস্যাকে UDP-র সমস্যা, ভাঙা path-MTU আবিষ্কার এবং এমন ক্ল্যাম্প থেকে আলাদা করে যা যে হ্যান্ডশেককে পুনর্লিখন করার কথা তা কখনও দেখেই না।
ব্যর্থতার আকৃতি দিয়ে শুরু করুন
আকারের ত্রুটির একটা স্বাক্ষর আছে: সংযোগ প্রতিষ্ঠিত হয়, প্রমাণীকরণ ও ছোট প্রতিক্রিয়া সফল হয়, তারপর পূর্ণ আকারের সেগমেন্ট দরকার হলে স্থানান্তর অনির্দিষ্টকালের জন্য থেমে যায়। যে পৃষ্ঠাগুলো টেক্সট লোড করে কিন্তু ছবি কখনও শেষ করে না, সেগুলো ছোট মাপে একই ত্রুটি। যদি কিছুই আদৌ সংযোগ না করে, সমস্যা পথের আরও আগে এবং ক্ল্যাম্পিং সাহায্য করবে না। যে হ্যান্ডশেক কখনও আসেনি, ক্ল্যাম্প তা মেরামত করতে পারে না।
এই স্বাক্ষর আছে কারণ সেগমেন্টের আকার ঠিক হয় হ্যান্ডশেকে। প্রতিটি পক্ষ TCP অপশন হিসেবে সর্বোচ্চ সেগমেন্ট আকার ঘোষণা করে, আর প্রেরকরা প্রতিপক্ষের ঘোষণাকে মানে। পথ যদি এত বড় সেগমেন্ট বহন করতে না পারে, ত্রুটি পরে দেখা দেয়, যখন প্রেরক শেষে একটা চেষ্টা করে।
এই লক্ষণ পড়ার সময় পরিবহনকে চোখের সামনে রাখুন। ক্ল্যাম্পিং TCP অপশন পুনর্লিখন, তাই একই টানেলের নিচে আটকে থাকা ভয়েস বা ভিডিও কল MSS সমস্যা নয় এবং এতে ভালো হবে না। কোনো TCP অপশনে হাত দেওয়ার আগে পরিবহনটা লিখে রাখুন।
পথের দাম বের করুন, তারপর টানেলের সঙ্গে তুলনা করুন
দুটি সংখ্যা গুরুত্বপূর্ণ এবং প্রায়ই গুলিয়ে যায়। path-MTU হলো সবচেয়ে বড় প্যাকেট যা পথটি খণ্ডন ছাড়াই বহন করবে, আর IPv4-এর ঘোষিত MSS হলো সেই মান থেকে IP ও TCP হেডারের 40 বাইট বিয়োগ, বা IPv6-এর জন্য 60 বিয়োগ। ভেতরের প্যাকেট শুরু হওয়ার আগেই টানেল এনক্যাপসুলেশন বাজেটের একটি অংশ খেয়ে ফেলে।
ping -M do -s 1400 198.51.100.20
tracepath 198.51.100.20
do-not-fragment বিটসহ ping আপনাকে বলে সেই পেলোড মাপের প্যাকেট টিকে আছে কি না; মাপটা ব্যর্থ হওয়া পর্যন্ত বদলান, তাহলে পরীক্ষামূলকভাবে পথের সীমা পেয়ে যাবেন। tracepath-এর আউটপুট রুট বরাবর আবিষ্কৃত MTU জানায়, যা কাজ করলে দ্রুততর এবং কোনো মধ্যবর্তী হপ প্রোব ফিল্টার করলে কম নির্ভরযোগ্য।
এখন টানেলের ওভারহেড বিয়োগ করুন। বাইরের IP হেডার, UDP হেডার এবং টানেল-নির্দিষ্ট হেডার সবই একই 1500 বাইট থেকে আসে, তাই সাধারণ ইথারনেট আন্ডারলে-তে ব্যবহারযোগ্য ভেতরের MTU ভৌত লিংক যা বোঝায় তার চেয়ে কম। গণনা করা ভেতরের MTU আপনার প্রতিপক্ষরা যা ঘোষণা করে তার চেয়ে কম হলে আপনি অনুমান নয়, সত্যিকারের ক্ল্যাম্প প্রার্থী পেয়েছেন। গণনা করা মান যদি ইতিমধ্যে প্রতিপক্ষের ঘোষণার চেয়ে বেশি হয়, এখানেই থামুন এবং অন্যত্র খুঁজুন।
ক্ল্যাম্প বসান যেখানে হ্যান্ডশেক যায়
ক্ল্যাম্প কাজ করে গেটওয়ে অতিক্রম করার সময় SYN ও SYN-ACK প্যাকেটে MSS অপশন পুনর্লিখন করে। নিয়মটি যদি এমন ইন্টারফেসে বসে যা কোনো দিকই কখনও অতিক্রম করে না, দরকষাকষি অপরিবর্তিতভাবে শেষ হয় এবং লক্ষণ থেকে যায়, তাই মানের চেয়ে বসানোই ফলাফল ঠিক করে।
| Symptom | What it points to | Next check |
|---|---|---|
| Handshake completes, large transfer stalls | Segment size larger than the path can carry | Path MTU against the tunnel's effective MTU |
| Nothing connects, small or large | Routing, firewall or keying failure | Not MSS; look at the tunnel state |
| Only UDP applications stall | Datagram size or a dropped ICMP error | Platform-specific UDP handling, not clamping |
| Fixed after reconnect, returns later | Clamp applied to one direction or one interface | Rule placement and the handshake path |
দিক হলো বাকি অর্ধেক। এক দিক ক্ল্যাম্প করলে অর্ধেক ফ্লো ঠিক হয় আর বাকিগুলো এমনভাবে ব্যর্থ হতে থাকে যা মাঝে মাঝে দেখা যায়, তাই ফরোয়ার্ড হওয়া ট্র্যাফিকের দুই দিকেই প্রয়োগ করুন। টানেল ইন্টারফেসের ক্লাসিক Linux রূপ হলো SYN প্যাকেটের সঙ্গে মেলে এমন mangle নিয়ম:
iptables -t mangle -A FORWARD -o tun0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
লক্ষ্য করুন --clamp-mss-to-pmtu আসলে কী করে: এটি রুটের MTU থেকে মানটি নেয়, যা সবসময় টানেলের আসল পেলোড বাজেট নয়। রুট-ভিত্তিক টানেলে যেখানে ভেতরের রুট ও বাইরের পথ আলাদা, আগের পরীক্ষায় গণনা করা স্পষ্ট মান স্বয়ংক্রিয় মানের চেয়ে বেশি পূর্বানুমেয়।
নতুন সংযোগে যাচাই করুন এবং প্রতিক্রিয়া সচল রাখুন
প্রতিষ্ঠিত সংযোগ যে MSS-এ দরকষাকষি করেছে তা ধরে রাখে, তাই একই সেশনে পরীক্ষা কিছুই প্রমাণ করে না। পরিবর্তনের পর নতুন সংযোগ খুলুন এবং দরকষাকষি করা মানটি সরাসরি পড়ুন, হঠাৎ শেষ হয়ে যাওয়া কোনো স্থানান্তর থেকে অনুমান করার বদলে।
ss -tin dst 198.51.100.20
iptables -t mangle -S | grep TCPMSS
প্রথম কমান্ডটি সকেটের MSS জানায় তার কনজেশন অবস্থার সঙ্গে, যা ক্ল্যাম্প কাজ করেছে বলে সবচেয়ে দ্রুত নিশ্চিত করে। দ্বিতীয়টি নিশ্চিত করে যে আপনি মনে করছেন যোগ করেছেন সেই নিয়মটিই আছে, যে টেবিলে সেটি বসানো হয়েছে সেখানেই।
তারপর যে প্রক্রিয়াটি আপনি ঠিক করেননি সেটি রক্ষা করুন। path-MTU আবিষ্কার নির্ভর করে ICMP fragmentation-needed বার্তা প্রেরকের কাছে পৌঁছানোর ওপর, তাই যে ফায়ারওয়াল সেগুলো ফেলে দেয় তা সঠিক ক্ল্যাম্প থাকা সত্ত্বেও বড় স্থানান্তর ভাঙতে থাকবে। টানেল পথের জন্য সেই বার্তাগুলো অনুমোদন করুন, বা মেনে নিন যে ক্ল্যাম্পিং আপনার বেছে নেওয়া নীতির ক্ষতিপূরণ দিচ্ছে।
শেষে, ক্ল্যাম্পকে টিউনিং নব হিসেবে দেখার প্রলোভন প্রতিরোধ করুন। এটি সেগমেন্টের আকার সীমিত করে, যা এমন পথে থ্রুপুট খায় যেখানে কখনও দরকারই ছিল না। তিনটি পরীক্ষার পরে প্রয়োগ করলে এটি লক্ষ্যভিত্তিক মেরামত; আগে প্রয়োগ করলে এটি এমন পরিবর্তন যা মূল ত্রুটি ঢেকে দেয় এবং পরের প্রতিটি পরীক্ষায় দ্বিতীয় চলক যোগ করে। এই বিনিময়টা সচেতনভাবে করা উচিত, ডিফল্টভাবে নয়।
আপনি যে path-MTU মেপেছেন, যে টানেল ওভারহেড বিয়োগ করেছেন, যে নিয়ম যোগ করেছেন এবং পরে যে MSS দেখেছেন তা লিখে রাখুন। চারটি সংখ্যা পরের ঘটনাটিকে তদন্তের বদলে তালিকা-সন্ধানে পরিণত করে।