সার্ভারের IP ঠিকানা বদলানোর পরেও SNAT নিয়মটি পুরোনো ঠিকানাই দেখায়
টনেল সংযোগ হতে পারে, অথচ প্রতিটি ফরওয়ার্ড করা প্যাকেট আটকে যায়, কারণ অনুবাদ নিয়মটি এখনও এমন ঠিকানায় লিখছে যা হোস্টের আর নেই।
সার্ভার নতুন ঠিকানায় চলে গেছে, ক্লায়েন্টরা এখনও সংযোগ করে, এবং তারা যা পাঠায় তার কিছুই ইন্টারনেটে পৌঁছায় না। এই বিভাজনই সূত্র: শোনা সকেট ও পোর্ট ফরওয়ার্ডিং স্থানান্তর টিকে গেছে, তাই টনেল উঠে আসে, অথচ ফরওয়ার্ড করা প্যাকেটে প্রয়োগ হওয়া সোর্স অনুবাদ এখনও এমন ঠিকানা দেখায় যা হোস্টের আর নেই। ওই পুনর্লিখিত প্যাকেটের উত্তর যায় এমন মেশিনে, যা আর সেখানে নেই।
সংযোগ ও ফরওয়ার্ডিং ভিন্ন জায়গায় ব্যর্থ হয়
স্থাপন নির্ভর করে ক্লায়েন্টদের আগে থেকেই জানা প্রান্তবিন্দুর ওপর: পাবলিক ঠিকানা, তার সামনের পোর্ট ফরওয়ার্ডিং, আর ভেতরের শ্রবণকারী। ফরওয়ার্ড করা ট্রাফিক নির্ভর করে প্যাকেট টনেলে ঢোকার পর নেওয়া দ্বিতীয় সিদ্ধান্তের ওপর, যখন হোস্ট তার সোর্স পুনর্লিখন করে যাতে উত্তর ফেরার পথ খুঁজে পায়।
ঠিকানা বদল কেবল দ্বিতীয় সিদ্ধান্তটি ভাঙে, তাই উপসর্গটি "সংযুক্ত কিন্তু ইন্টারনেট নেই" হিসেবে পড়া হয়। এটিই ব্যাখ্যা করে কেন ক্লায়েন্টের দিকের স্বাভাবিক পরীক্ষাগুলো সুস্থ দেখায়: হ্যান্ডশেক সম্পন্ন হয়, ক্লায়েন্ট ঠিকানা পায়, এমনকি সার্ভারের টনেল ঠিকানায় ping-ও উত্তর দিতে পারে। অন্য দিকে থাকা ত্রুটির জন্য ক্লায়েন্টে ঘণ্টার পর ঘণ্টা নষ্ট হয়, তাই নিয়মের তালিকাই প্রথম দেখার জায়গা।
সম্পাদনার আগে নিয়ম ও তার কাউন্টার পড়ুন
কাউন্টারসহ অনুবাদ নিয়মগুলো তালিকাভুক্ত করুন এবং কনফিগার করা সোর্সকে হোস্টের প্রকৃত ঠিকানার সঙ্গে মিলিয়ে দেখুন। মৃত ঠিকানায় পুনর্লিখিত নিয়ম সাধারণত ঢোকার পথে ট্রাফিক দেখায়, কারণ প্যাকেট সেখানে পৌঁছে অনুবাদ হয়, আর ফেরার পথে কিছুই দেখায় না।
sudo iptables -t nat -L POSTROUTING -n -v --line-numbers
ip -4 addr show
সেখানে থাকার সময় তিনটি ক্ষেত্র দেখুন: সোর্স ম্যাচের পুল, নিয়ম কোনোটি নাম দিলে এক্সিট ইন্টারফেস, এবং যে বাদ দেওয়াটি টনেল-থেকে-টনেল ট্রাফিক পুনর্লিখন থেকে আটকায়। সম্পাদনার সময় ওই বাদ দেওয়াটি হারানো সহজ, আর তা হারালে পিয়ার ট্রাফিক কাজ করছে বলে মনে হয়, অথচ তার উত্তর অদ্ভুত পথ নেয়।
কাউন্টার শূন্যে আটকে থাকলে প্যাকেট কখনও এই নিয়মে পৌঁছায় না, আর ঠিকানা তখন সমস্যা নয়। চেইনের আগের দিকে প্রতিদ্বন্দ্বী নিয়ম খুঁজুন, যা ঘটে যখন কেউ মূলটি সম্পাদনার বদলে প্রতিস্থাপন যোগ করে। এক মিনিট আগে লিখে রাখা আউটপুটের সঙ্গে নিয়মের নম্বর মিলিয়ে দেখুন। ক্রম কনফিগারেশনের অংশ, নিছক সৌন্দর্যের বিষয় নয়।
সোর্স প্রতিস্থাপন করুন, বা একেবারে নাম দেওয়া বন্ধ করুন
হোস্টের ঠিকানা স্থির হলে আরেকটি যোগ না করে নিয়মটি জায়গাতেই প্রতিস্থাপন করুন। নিয়ম নম্বর দিয়ে প্রতিস্থাপন বাকি চেইন যে ক্রমের ওপর নির্ভর করে তা রক্ষা করে।
sudo iptables -t nat -R POSTROUTING 1 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-source 10.151.0.40
ঠিকানা গতিশীলভাবে বরাদ্দ হলে কোনো সোর্সের নাম দেবেন না এবং কার্নেলকে এক্সিট ইন্টারফেস থেকে বর্তমানটি বেছে নিতে দিন। এই রূপটি পরের স্থানান্তর সম্পাদনা ছাড়াই টিকে যায়, বিনিময়ে কোন ঠিকানা ব্যবহৃত হলো তা লুকিয়ে রাখে।
sudo iptables -t nat -R POSTROUTING 1 -s 10.8.0.0/24 ! -d 10.8.0.0/24 -o eth0 -j MASQUERADE
IPv4 ফরওয়ার্ডিং ব্যবস্থাপিত কনফিগারেশনের মাধ্যমে এখনও চালু আছে নিশ্চিত করুন, তারপর ডিস্ট্রিবিউশনের নিজস্ব ব্যবস্থায় নিয়মটি স্থায়ী করুন। কেবল চলমান কার্নেলে করা পরিবর্তন পরের রিবুটে ফিরে আসে, সাধারণত এমন রক্ষণাবেক্ষণ উইন্ডোতে যা কেউ পরিবর্তনের সঙ্গে যুক্ত করে না।
প্রতিস্থাপন ভুল করার দুই উপায়
পুলটিকে সার্ভারের LAN ঠিকানার বদলে তার টনেল ঠিকানায় অনুবাদ করলে উত্তর সোজা টনেলে ফিরে যায়, যেখানে সেগুলো এমন ক্লায়েন্টের দিকে রুট হয় যে কখনও চায়নি। সংযোগটি রাউটিং লুপের মতো করে আটকে যায়, কারণ সেটি সত্যিই লুপ।
পুরোনোটির ওপরে দ্বিতীয় অনুবাদ স্তূপ করা আরেকটি ভুল। প্রথম মিলে যাওয়া নিয়মই জেতে, তাই পুরোনো এন্ট্রি মুছে ফেলার আগ পর্যন্ত প্যাকেট সামলাতে থাকে, আর নতুন নিয়মের কাউন্টার শূন্যে থাকে, অথচ সবাই প্রতিস্থাপনকেই দোষ দেয়। নতুন কিছু যোগ করার আগে অনুলিপিটি মুছুন। তারপর তালিকাটি আরেকবার পড়ে নিশ্চিত করুন যে পুলের সঙ্গে ঠিক একটি অনুবাদই মেলে।
টনেল IPv6-ও বহন করলে অন্য স্ট্যাকে পুরো পর্যালোচনা পুনরাবৃত্তি করুন। অনুবাদ ও রুট করা প্রিফিক্স ছাড়া IPv6 ডিফল্ট রুট ঠিক তেমনই নিঃশব্দে ব্যর্থ হয়, আর এটি ভুলে যাওয়া সহজ, কারণ তার ওপরের সবকিছু একই রকম দেখায়।
ইনবাউন্ড সেবার বিপরীত অনুবাদ দরকার
VPN ক্লায়েন্টের এমন সেবা যা বাইরে থেকে পৌঁছানো যায়, তার গন্তব্য অনুবাদ দরকার, সোর্স অনুবাদ নয়: পাবলিক পোর্ট ঢোকার আগে ক্লায়েন্টের টনেল ঠিকানায় পুনর্লিখিত হয়। তারপর ফরওয়ার্ড পথে ওই ট্রাফিক অনুমোদনকারী স্পষ্ট নিয়ম দরকার।
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.9.8.2:8080
টনেল নিজেই যে পোর্ট বহন করে তা কখনও অনুবাদ করবেন না, কারণ ওই পুনর্লিখন সেবাটি পৌঁছানোর উপযোগী রাখা সংযোগটি ভেঙে দেয়। টনেল পোর্টকে গন্তব্য নিয়মের বাইরে সম্পূর্ণ রাখুন। পরে দুই প্রান্ত থেকেই যাচাই করুন: নতুন নিয়মের কাউন্টার, টনেল ডিভাইসে একটি সংক্ষিপ্ত ক্যাপচার, এবং পাবলিকটি চেষ্টা করার আগে টনেলের ভেতরের ঠিকানায় একটি অনুরোধ।