OpenVPN ক্লায়েন্টের পেছনের সাবনেটে কেন পৌঁছানো যায় না?
OpenVPN অনুমান করতে পারে না কোন ক্লায়েন্টের কাছে দূরের LAN আছে। ক্লায়েন্টের ফাইলে একটি iroute এন্ট্রি, ফেরত রুট এবং ফরওয়ার্ডিং সেই সাবনেটকে পৌঁছানোর উপযোগী করে।
সার্ভারের টানেল ঠিকানায় ping সফল হয়, ক্লায়েন্টের নিজের রুট টেবিল ঠিক দেখায়, তবুও সেই ক্লায়েন্টের পেছনের LAN-এ পৌঁছানো যায় না। ক্লায়েন্টের রাউটিং টেবিল সঠিক দেখায়, সার্ভারে টানেলের দিকে নির্দেশ করা একটি রুট আছে, তবুও প্যাকেট উধাও হয়ে যায়। এটি layer-3 টানেলের চিরাচরিত উপসর্গ, যেটি জানে না যে তার একটি ক্লায়েন্টও একটি গেটওয়ে।
একটি tun ইন্টারফেসে প্রতি-ক্লায়েন্ট পরবর্তী হপ থাকে না। কার্নেল বহু পিয়ারযুক্ত একটি একক ইন্টারফেস দেখে, তাই দূরের LAN-এর জন্য কোন ক্লায়েন্ট প্যাকেট পাবে সেই সিদ্ধান্ত OpenVPN প্রসেসের ভেতরে নিতে হয়। সেই সিদ্ধান্ত iroute দিয়ে কনফিগার করা হয়, এবং এটি ছাড়া প্যাকেটের যাওয়ার জায়গা নেই।
সার্ভার ইন্টারফেস অনুযায়ী নয়, ক্লায়েন্ট অনুযায়ী রাউট করে
সার্ভারকে যখন কোনো ক্লায়েন্টের টানেল ঠিকানায় প্যাকেট পাঠাতে হয়, উত্তর দ্ব্যর্থহীন: ঠিকানাটি সেই ক্লায়েন্টের সেশনের। কিন্তু গন্তব্য যখন সেই ক্লায়েন্টের পেছনের একটি সম্পূর্ণ সাবনেট, তখন ঠিকানাটি সার্ভারের জানা কারও নয়, আর টানেলের দিকে কার্নেলের রুট শুধু বলে "এই ইন্টারফেস দিয়ে", কোন পিয়ার তা বলে না।
OpenVPN এটি সমাধান করে একটি অভ্যন্তরীণ রাউটিং টেবিল দিয়ে যা গন্তব্য প্রিফিক্সকে নির্দিষ্ট ক্লায়েন্টের সাথে মেলায়। সেই টেবিল iroute এন্ট্রি থেকে তৈরি হয়, তাই সার্ভার হোস্টে সাধারণ রুট যথেষ্ট নয়। কার্নেল রুট প্যাকেটকে টানেল ইন্টারফেসে পৌঁছায়; অভ্যন্তরীণ ম্যাপিং নির্ধারণ করে কোন সেশন এটি পাবে। এজন্যেই মেরামতটি কার্নেলের রুট আউটপুটে কখনো দেখা যায় না।
ম্যাপিং না থাকলে প্যাকেট সার্ভারে পৌঁছে টানেল রুটের সাথে মেলে এবং বাদ পড়ে, কারণ কোনো ক্লায়েন্ট গন্তব্যটি দাবি করে না। কিছুই পরিষ্কার ত্রুটি লগ করে না, তাই ব্যর্থতাটি রাউটিং লুপের বদলে নিঃশব্দ কালো গর্তের মতো দেখায়।
ক্লায়েন্টের নাম উল্লেখ করা iroute এন্ট্রি লেখা
iroute থাকে ক্লায়েন্ট-নির্দিষ্ট কনফিগারেশন ফাইলে, সার্ভারের মূল কনফিগারেশনে নয়। client-config-dir অপশন দিয়ে সার্ভারকে একটি ডিরেক্টরির দিকে নির্দেশ করুন, তারপর এমন একটি ফাইল তৈরি করুন যার নাম ক্লায়েন্টের সার্টিফিকেটের কমন নেম এবং প্রিফিক্সটি তার ভেতরে রাখুন।
যে ব্রাঞ্চের LAN 10.20.0.0/24 এবং সার্টিফিকেটের কমন নেম branch-router, সেই পথের ফাইলটিতে iroute 10.20.0.0 255.255.255.0 এর মতো একটি লাইন থাকে। মূল কনফিগারেশনের শুধু ডিরেক্টরি অপশন দরকার; প্রিফিক্সটি থাকে ক্লায়েন্টের কাছে।
কমন নেমটিই ভঙ্গুর অংশ। ভিন্ন সাবজেক্টে ইস্যু করা সার্টিফিকেট, বা এমন ডিপ্লয়মেন্ট যা ব্যবহারকারীদের ইউজারনেম দিয়ে প্রমাণ করে অথচ ফাইলটির নাম সার্টিফিকেট অনুযায়ী, এমন ফাইল তৈরি করে যা কখনো পড়া হয় না। সার্ভার সেশনের জন্য আসলে কোন নাম জানায় তা যাচাই করুন, এবং অমিল ক্লায়েন্টকে তার রুট ছাড়া নিঃশব্দে সংযুক্ত হওয়ার বদলে ব্যর্থ করার অপশনটি বিবেচনা করুন। সার্টিফিকেটের সাথে মিলিয়ে ফাইলের নাম বদলানো পাঁচ মিনিটের সংশোধন, যা খুব দীর্ঘ সন্ধ্যা ঠেকায়।
একটি ক্লায়েন্ট একাধিক প্রিফিক্সের মালিক হতে পারে। প্রতি নেটওয়ার্কে একটি iroute লাইন যোগ করুন এবং ম্যাপিং যাচাইযোগ্য রাখতে তালিকাটি সেই ক্লায়েন্টের বাকি সেটিংসের পাশে রাখুন।
উভয় দিকে ফেরত পথ তৈরি করা
দূরের LAN-এ প্যাকেট পৌঁছানো অর্ধেক কাজ। ক্লায়েন্টকেও সেই LAN-এর ট্রাফিক টানেলে পাঠাতে হবে, যা সাধারণত ক্লায়েন্টকে একটি রুট পুশ করে করা হয়: push "route 10.8.0.0 255.255.255.0" এর মতো একটি লাইন প্রতিটি ক্লায়েন্টকে বলে সার্ভার-পাশের নেটওয়ার্কে কীভাবে পৌঁছাবে। ব্রাঞ্চের জন্য সমতুল্য রুটটি সার্ভার-পাশে যা পৌঁছানো দরকার তার জন্য টানেলের দিকে নির্দেশ করে।
ফেরত দিকের জন্য দূর পাশে একজন মালিক দরকার। সেই পাশে কাউকে ফেরার পথ জানতে হবে: LAN রাউটারে একটি স্ট্যাটিক রুট যা VPN পুলকে সার্ভারের দিকে নির্দেশ করে, অথবা ট্রাফিক LAN-এ ঢোকার আগে সার্ভারে ঠিকানা অনুবাদ। স্ট্যাটিক রুট মূল ঠিকানাগুলো লগ ও অ্যাক্সেস নিয়মে দৃশ্যমান রাখে কিন্তু LAN মালিকের সহযোগিতা দরকার; অনুবাদ স্বয়ংসম্পূর্ণ কিন্তু কে আসলে সংযুক্ত হয়েছিল তা লুকায়।
সার্ভার হোস্টে ফরওয়ার্ডিং সক্রিয় থাকতে হবে। এটি ছাড়া কার্নেল টানেল থেকে প্যাকেট গ্রহণ করে এবং LAN ইন্টারফেসে পাঠাতে অস্বীকার করে, যা ক্লায়েন্টের দৃষ্টিতে অনুপস্থিত iroute-এর মতোই দেখায়।
সঠিক প্রোব দিয়ে পৌঁছানোর ক্ষমতা যাচাই
দূর প্রান্তে ping করে অনুমান করার বদলে স্তরে স্তরে পরীক্ষা করুন। সার্ভার থেকে দেখুন প্রিফিক্সের জন্য অভ্যন্তরীণ ম্যাপিং আছে এবং কার্নেল রুট টানেলের দিকে নির্দেশ করে। ক্লায়েন্ট থেকে নিশ্চিত করুন পুশ করা রুটটি ইনস্টল হয়েছে এবং LAN ঠিকানার জন্য এর ডিফল্ট পথটি টানেল।
তারপর প্যাকেট লক্ষ্য করুন। টানেল ইন্টারফেসে ক্যাপচার দেখায় সার্ভার ক্লায়েন্টের দিকে পাঠাচ্ছে কি না, আর LAN ইন্টারফেসে ক্যাপচার দেখায় এটি ফরওয়ার্ড করছে কি না। যদি প্রথমটি প্যাকেট দেখায় আর দ্বিতীয়টি কিছু না, সমস্যা ফরওয়ার্ডিং বা ফিল্টারে; যদি কোনোটিই কিছু না দেখায়, লুকআপ আগেই ব্যর্থ হয়েছে।
টানেল দিয়ে যুক্ত দুটি সার্ভার দুই পাশে একই নিয়ম পুনরাবৃত্তি করে: প্রত্যেকের অন্য পুলের জন্য iroute দরকার, এবং পথটি প্রতিসম করতে রুট ও ফরওয়ার্ডিং দরকার। এখানে রাউটিং ও নীতি আলাদা বিষয়। রাউটিং ঠিক করে প্যাকেট কোথায় যেতে পারে, আর FORWARD নিয়ম ঠিক করে তা অনুমোদিত কি না, তাই দুই iroute লাইনের ক্লায়েন্ট ফিল্টার ভিন্ন না বললে দুই প্রিফিক্সেই পৌঁছাতে পারে।