OpenVPN iroute বনাম কার্নেল রুট: কোনটি অনুপস্থিত?
সার্ভারে একটি রুট আছে, তবুও ট্রাফিক থেমে যায়। পথের একটি সিদ্ধান্ত কার্নেলের, অন্যটি পিয়ারের; কোনটি অনুপস্থিত এবং কী যাচাই করতে হবে তা জানুন।
10.77.20.0/24-এর জন্য একটি প্যাকেট OpenVPN সার্ভারে দুটি আলাদা সিদ্ধান্ত নেয়: অপারেটিং সিস্টেমকে এটি VPN ইন্টারফেসে দিতে হবে, এবং OpenVPN-কে জানতে হবে কোন সংযুক্ত ক্লায়েন্ট ওই প্রিফিক্সের মালিক। কার্নেল রুট অনুপস্থিত থাকলে প্যাকেটটি টানেলের আগেই বাদ পড়ে, আর পিয়ার রুট অনুপস্থিত থাকলে টানেলের পরে বাদ পড়ে। দূরের LAN থেকে দুটি ব্যর্থতাই একই রকম দেখায়, আর আপনার কাছে কোনটি আছে তা নির্ণয় করতে প্রতিটি পাশে একটি করে কমান্ড লাগে।
ক্লাসিক ইউজারস্পেস ডেটা পাথে কার্নেল রুট প্যাকেটটিকে টানেল প্রসেসে পৌঁছায়, আর iroute ওই প্রসেসকে বলে কোন পিয়ার এটি পাবে। কোনোটিই অন্যটির বিকল্প নয়, এবং শুধু একটি বহন করা কনফিগারেশন প্রথম ping পর্যন্ত যুক্তিসঙ্গত দেখাবে।
দুটি সিদ্ধান্ত, একটি রুট নয়
কল্পনা করুন একটি সাইট-থেকে-সাইট লিংক যেখানে 10.77.20.0/24 একটি ক্লায়েন্টের পিছনে আছে। সার্ভারের কার্নেল রুট, উদাহরণস্বরূপ ip route add 10.77.20.0/24 dev tun0, মিলে যাওয়া প্যাকেটগুলো টানেল ডিভাইসে পাঠায়। এরপর OpenVPN ক্লায়েন্ট কনফিগারেশন ডিরেক্টরির iroute এন্ট্রি থেকে তৈরি নিজের অভ্যন্তরীণ টেবিল দেখে সিদ্ধান্ত নেয় কোন পিয়ার সংযোগ সেগুলো পাবে। কার্নেল রুট ছাড়া প্যাকেট কখনোই প্রসেসে পৌঁছায় না, আর পিয়ার রুট ছাড়া এটি প্রসেসে পৌঁছেও কোথাও যায় না।
এই বিভাজন সহজেই ভুলে যায়, কারণ ক্লায়েন্ট প্রোফাইলের একটি রুট লাইন উভয় কাজই করছে বলে মনে হতে পারে। কিন্তু তা নয়: রুট পুশ করা ক্লায়েন্টদের বলে টানেলের ভেতর দিয়ে কী পাঠাতে হবে, আর iroute সার্ভারকে বলে ক্লায়েন্টের পিছনের একটি ঠিকানা-পরিসর কার মালিকানাধীন। এগুলো আলাদা ফাইলে থাকে, আলাদা পক্ষ পড়ে, এবং বিপরীত দিকে ব্যর্থ হয়।
iroute কোথায় থাকে এবং কী বলে
এন্ট্রিটি ক্লায়েন্টের common_name অনুসারে নামকরণ করা একটি পৃথক ফাইলে, client-config-dir-এর অধীনে, iroute 10.77.20.0/24 হিসেবে যায়। ফাইলের নামের মিল শুধু সৌন্দর্যের জন্য নয়: OpenVPN প্রমাণিত পরিচয় খুঁজে নেয় এবং ঠিক ওই নামের ফাইল পড়ে, তাই site-a নামের ফাইল কেবল সেই ক্লায়েন্টের জন্য কার্যকর হয় যার সাধারণ নাম site-a। এমন ফাইল না থাকা ক্লায়েন্টদের সম্পূর্ণ প্রত্যাখ্যান করতে চাইলে ccd-exclusive যোগ করুন, যা তখনই সঠিক সেটিং যখন প্রতিটি ক্লায়েন্ট একটি সাইট গেটওয়ে। প্রতিটি গেটওয়ের জন্য একটি ফাইল রাখুন এবং আপনি প্রকৃতপক্ষে যে সার্টিফিকেট সাবজেক্ট ইস্যু করেন তার নামে তার নাম দিন।
দূরের LAN-কে দোষ দেওয়ার আগে সার্ভার থেকে এন্ট্রিটি পরীক্ষা করুন। স্ট্যাটাস ফাইল সংযুক্ত ক্লায়েন্টদের তাদের সাধারণ নামসহ তালিকাভুক্ত করে, আর --verb 4-এ চলা সার্ভার পিয়ার সংযুক্ত হওয়ার সময় iroute ইনস্টল হওয়ার লগ রাখে। সংযোগের সময় কিছু না দেখালে ফাইলটি ভুল ডিরেক্টরিতে আছে বা ভুল পরিচয়ের নাম বলছে।
ফাঁদ: ফাইল আছে, পরিচয় ভুল
ভুল পিয়ারের সাথে যুক্ত সঠিক দেখতে iroute হারানো ফাইলের চেয়ে বেশি সময় নষ্ট করে, কারণ ডিস্কে সবকিছু ঠিকঠাক দেখায়। সার্টিফিকেটের নাম বদল, একই সাধারণ নামের পুনরাবৃত্তি, এবং কার্যকর পরিচয় বদলে দেওয়া username-as-common-name — এগুলো সবই এই অবস্থা তৈরি করে। আপনি যা আশা করেছিলেন তা নয়, সার্ভার কোন পরিচয় প্রমাণ করেছে তা যাচাই করুন: স্ট্যাটাস আউটপুটই কর্তৃত্বপূর্ণ, ফাইলের নাম কেবল একটি লুকআপ কী।
একটি রুট তার মালিকের চেয়েও বেশি দিন টিকতে পারে। স্ট্যাটিক রুট এবং iroute এন্ট্রি প্রাপ্যতার নিশ্চয়তা নয়, একটি প্রিফিক্স বর্ণনা করে, তাই ট্রাফিক এমন পিয়ারের দিকে যেতে থাকতে পারে যা এই মুহূর্তে সংযোগবিহীন।
পিয়ারের ওপারে পথটি সম্পূর্ণ করুন
পিয়ার মালিকানা পথের মাঝখানে, শেষে নয়। ক্লায়েন্টকে টানেল থেকে প্যাকেট তার LAN-এ ফরওয়ার্ড করতে হবে, অর্থাৎ ওই হোস্টে IP ফরওয়ার্ডিং সক্রিয় এবং ট্রানজিট অনুমোদনকারী ফায়ারওয়াল নিয়ম থাকতে হবে। দূরের LAN-এর হোস্টগুলোর টানেল ঠিকানার জন্য ফিরতি পথ দরকার: হয় গেটওয়ের দিকে ফেরত যাওয়া একটি রুট, নয়তো ক্লায়েন্টের পাশে সচেতনভাবে ডিজাইন করা NAT। ডিস্ট্রিবিউশনের ডিফল্ট ধরে না নিয়ে sysctl net.ipv4.ip_forward দিয়ে ক্লায়েন্টে ফরওয়ার্ড সেটিং নিশ্চিত করুন।
অন্য VPN ক্লায়েন্টদের যদি ওই সাবনেটে পৌঁছাতে হয়, ব্যবস্থাটি আবার বাড়ে: সার্ভারের client-to-client দরকার, এবং ওই ক্লায়েন্টদের প্রিফিক্সটি টানেল দিয়ে রুট করতে হবে। এর কোনোটিই সার্ভারের নিজের রুট টেবিল থেকে আসে না।
সার্ভার থেকেই নয়, একটি বাস্তব উৎস থেকে একটি গন্তব্য যাচাই করুন। সম্পর্কহীন একটি LAN হোস্ট থেকে ক্লায়েন্টের পিছনের হোস্টে ping এক চালেই ফিরতি পথ, ফরওয়ার্ডিং নিয়ম এবং পিয়ার মালিকানা পরীক্ষা করে, যেখানে সফল handshake কেবল পরিচয় প্রমাণ করে। তারপর মালিক পিয়ারটি বিচ্ছিন্ন করুন এবং রুটটি কী করে তা লিখে রাখুন, কারণ সেই উত্তরই আপনার ব্যর্থতার ধরন।