VPN বিচ্ছিন্ন হলে যেন কিছুই লিক না হয় — লিনাক্সের ইগ্রেস কীভাবে লক করবেন
রাউটিং ও ফিল্টারিং আলাদা সিদ্ধান্ত। আউটপুট হুক লক করুন, তারপর টানেলের পুনঃসংযোগের জন্য দরকারি এন্ডপয়েন্ট, DNS ও প্রশাসনিক ব্যতিক্রমগুলো সীমিত করুন।
একটি বাড়ির আপলিংকে বসানো মিডিয়া বক্সের কথা ভাবুন, যা কেবল একটি টানেল দিয়েই ইন্টারনেটে পৌঁছানোর কথা। টানেলটি বিচ্ছিন্ন হলে অ্যাপ্লিকেশনটির ফিজিক্যাল ইন্টারফেস দিয়ে চুপচাপ চলতে থাকার বদলে থেমে যাওয়া উচিত। এই আচরণ পাওয়াটা রাউটিংয়ের নয়, ফায়ারওয়ালের সমস্যা, এবং এই পার্থক্যটি গুরুত্বপূর্ণ, কারণ রুট ডেমন রিস্টার্ট দিয়ে বদলে যেতে পারে, কিন্তু ফিল্টার ঠিক যেখানে রেখেছেন সেখানেই থাকে। এরপর দেখব প্যাকেটের পথ আসলে কীভাবে সিদ্ধান্ত নেয়, আর তারপর টানেলকে পুনঃসংযোগে রাখা ব্যতিক্রমগুলো কীভাবে সীমিত করতে হয়।
লোকাল আউটপুট ফরওয়ার্ডিংয়ের থেকে আলাদা হুক
মেশিনের কোনো অ্যাপ্লিকেশন থেকে বেরোনো প্যাকেট আউটপুট হুক পার হয়; মেশিনটি অন্য হোস্টের জন্য যে প্যাকেট রাউট করে, সেটি ফরওয়ার্ড পার হয়। যে নীতিতে কেবল forward উল্লেখ থাকে, তা দ্বিতীয়টিকে সীমিত করে আর প্রথমটিকে সম্পূর্ণ খোলা রাখে, তাই এত ইগ্রেস লক সঠিক দেখায় অথচ কিছুই করে না। ইন্টারফেস মেলানো একই নিয়মেই থাকা উচিত: oifname "tun0" accept এমন ট্রাফিক পাস করে যা ইতিমধ্যেই টানেল দিয়ে রাউট হয়েছে। রাউটিং আর ফিল্টারিংও আলাদা সিদ্ধান্ত থাকে, তাই ফিল্টার প্যাকেট প্রত্যাখ্যান করলেও আপলিংকের রুট থাকতে পারে। আপনি এই বিচ্ছেদের ওপরই ভরসা করছেন।
অন্য ডিভাইসের জন্য ফরওয়ার্ড করা গেটওয়ের দুটি হুকই দরকার। কেবল আউটপুট লক করলে মেশিনটিই সুরক্ষিত থাকে আর প্রতিটি ডাউনস্ট্রিম ক্লায়েন্ট লিক করার স্বাধীনতা পায়।
ব্যতিক্রমের তালিকা এন্ডপয়েন্ট থেকে বাইরের দিকে লিখুন
টানেলের এন্ডপয়েন্ট দিয়ে শুরু করুন: একটি গন্তব্য ঠিকানা বা ছোট অনুমোদিত সেট, ট্রান্সপোর্ট প্রোটোকল এবং গন্তব্য পোর্ট, যেমন udp dport 1194 ip daddr 203.0.113.7 accept। ক্লায়েন্ট যদি হোস্টনেম রিজলভ করে, তবে বুটস্ট্র্যাপ DNS বিনিময়ের নিজস্ব নিয়ম দরকার, যা রিজলভার ও পোর্ট 53-এ সীমিত হবে, ওই রিজলভারের ঠিকানায় সার্বিক অনুমতি নয়। প্রতিটি ব্যতিক্রমের থাকার কারণটিও লেখা উচিত। VPN পোর্টে সব UDP ট্রাফিকের অনুমতি আপনার মনে থাকা সেই একমাত্র প্রমাণিত সার্ভিসের চেয়ে অনেক বেশি কিছু ঢেকে দেয়।
বুটস্ট্র্যাপ রিজলভেশনই সেই জায়গা যেখানে লক সাধারণত নষ্ট হয়। টাইমারে রিফ্রেশ হওয়া ঠিকানার সেটের জন্য রিফ্রেশ ব্যর্থ হলে নির্দিষ্ট আচরণ দরকার, আর সেই আচরণ সফল হওয়ার আগ পর্যন্ত আপলিংক খুলে দেওয়া হতে পারে না। টানেল ওপরে থাকা অবস্থায় টানেল দিয়েই রিফ্রেশ করুন, নইলে শেষ জানা ভালো এন্ডপয়েন্টে ফিরে যান।
লোকাল প্রশাসনেরও একই ব্যবহার দরকার। ম্যানেজমেন্ট সাবনেট শুধু ঠিকানা প্রাইভেট বলে বিশ্বাসযোগ্য হয় না, আর যে নিয়ম এতে ভরসা করে সে লকের চারপাশে দ্বিতীয় পথ ডেকে আনে।
ইন্টারফেস মেলানো সুস্থ টানেলের প্রমাণ নয়
tun0 থেকে বেরোনো সবকিছু গ্রহণ করা নিয়ম ধরে নেয় যে ওই ইন্টারফেসের প্যাকেট টানেল থেকেই এসেছে। ইন্টারফেসের নাম আবার তৈরি হয়, আর নাম কোনো ক্রিপ্টোগ্রাফিক পরিচয় নয়। পিয়ার সরে গেলেও ইন্টারফেস ওপরে থাকতে পারে, যা নিয়মটিকে খুব বিশ্বাসযোগ্য নিষ্ক্রিয়তায় পরিণত করে।
কানেকশন ট্র্যাকিং আরেকটি ফাঁদ যোগ করে। প্রতিষ্ঠিত সংযোগের জন্য বিস্তৃত নিয়ম একটি ফ্লো আগে পাওয়া অনুমতিই আবার প্রয়োগ করে, তাই টানেল পড়ার আগে শুরু হওয়া সেশন পরে চলতেই থাকে। স্টেটফুল গ্রহণ কেবল সেই ইন্টারফেস ও ঠিকানায় সীমিত করুন যা আপনি সত্যিই বোঝাচ্ছেন, নইলে আপনি নিজে থেকেই খুলে যাওয়া লক বানিয়েছেন। ইনপুট ও আউটপুট নিয়মও ভিন্ন প্রশ্নের উত্তর দেয়, আর একটি কঠোর করে অন্যটি উপেক্ষা করলে মেশিনটি সেই দিকেই নাগালে থেকে যায় যা আপনি ভাবেননি।
ডেমন ক্র্যাশ হলে কী টিকে থাকে
টানেল ওঠার পরে চালানো স্ক্রিপ্ট যে ফিল্টার বসায়, সেটি টানেলের সাথেই হারিয়ে যায়, ঠিক যখন তার দরকার ছিল তখনই। লকটি বুটে লোড করুন আর ডেমনকে কেবল তার ব্যতিক্রমগুলো সামলাতে দিন।
ডিফল্ট রুট মুছে ফেলাও বিকল্প নয়। রুট হলো সেই অবস্থা যা ডেমনের মালিকানায় থাকে ও সে পুনর্লিখন করে, আর তা সরালে পুনঃসংযোগের প্রয়োজনীয় পথটিও চলে যেতে পারে। IPv6-এর নিজস্ব পরিকল্পনা দরকার, কারণ নেবার ডিসকভারি ও রাউটার অ্যাডভারটাইজমেন্ট লিংক সার্ভিস, যা সাধারণ ট্রাফিক ব্লক থাকা অবস্থায়ও চলতে হবে। DHCP একই শ্রেণিতে পড়ে। এগুলোকে উদ্দেশ্যসহ ব্যতিক্রম হিসেবে লিখে রাখুন, পরে বিভ্রাট হিসেবে আবিষ্কার করার বদলে।
মোতায়েনের আগে পুনরুদ্ধারের পথ
লকটি যেভাবে ব্যর্থ হবে সেভাবেই পরীক্ষা করুন: টানেল ছাড়া বুট, ডেমন কিল, এন্ডপয়েন্ট বদল এবং পুনঃসংযোগ। প্রতিটি ক্ষেত্রেই অ্যাপ্লিকেশন থেমে যাওয়া উচিত আর পুনরুদ্ধার চ্যানেল চালু থাকা উচিত। এটি কনসোল থেকে করুন, কারণ রিমোট শেলই সেই সেশন যা আপনার নিজের নিয়মে সবচেয়ে বেশি লক আউট হওয়ার সম্ভাবনা রাখে।
তারপর দেখুন একটি সাধারণ অ্যাপ্লিকেশন এখনো কোথায় পৌঁছাতে পারে, একটি নিরীহ গন্তব্য ও যাচাইযোগ্য অনুরোধ দিয়ে। আপনি যে ফল চান তা হলো আপলিংকে প্রত্যাখ্যান আর টানেল দিয়ে সফলতা, কোনো দ্ব্যর্থক টাইমআউট নয় যা দুটোর যেকোনোটি বোঝাতে পারে। শেল স্ক্রিপ্ট থেকে পুরো টেবিল বদলানোর বদলে নিয়মের সেটটি ফায়ারওয়ালের বাকি অংশের মতো একই মালিকানার অধীনে রাখুন। যে নীতিতে প্রতিটি অনুমতি নিজেকে যুক্তিযুক্ত করতে পারে, তা এমন দীর্ঘ রুলসেটের চেয়ে বেশি মূল্যবান যা কেউ ব্যাখ্যা করতে পারে না।