টানেল না থামিয়ে একটি OpenVPN ক্লায়েন্টকে LAN থেকে ব্লক করুন
ক্লায়েন্টের টানেল ঠিকানাটি তার সার্টিফিকেটে পিন করুন, FORWARD-এর শুরুতে তার LAN ট্রাফিক ফেলে দিন, তারপর IPv6, ট্র্যাক করা সেশন এবং রিবুটের পর টিকে থাকা যাচাই করুন।
আপনার OpenVPN সার্ভারে একটি ক্লায়েন্টকে LAN অ্যাক্সেস হারাতে হবে, অথচ বাকি সব টানেল চালু থাকবে। এটি খুঁজলে শীর্ষ উত্তর সাধারণত বলে ডেমন এটি করতে পারে না, যা অর্ধেক সত্য: OpenVPN-এ প্রতি-ক্লায়েন্ট ফায়ারওয়াল নেই, কিন্তু যে হোস্ট টানেলটি শেষ করে সে ইতিমধ্যেই প্যাকেট ফিল্টার করে। আসল দুটি সিদ্ধান্ত হলো আপনি যে পরিচয় ব্লক করছেন এবং নিয়মের অবস্থান। এগুলো ঠিক করলে পরিবর্তনটি এক লাইনে পরিণত হয় যা আপনি পরীক্ষা করে সরাতে পারেন।
নিয়ম লেখার আগে ক্লায়েন্টকে পিন করুন
OpenVPN পুল থেকে টানেল ঠিকানা লিজ দেয়, তাই 10.8.0.6 একজন ব্যক্তি নয়, একটি আসন। সেশন শেষ হলে লিজটি ফিরে আসে এবং পরবর্তী সংযোগকে দেওয়া হতে পারে, অর্থাৎ ওই ঠিকানার বিরুদ্ধে লেখা নিয়ম আসনটিকে অনুসরণ করে, ব্যবহারকারীকে নয়। তাই আগে ঠিক করুন আপনি আসলে কী ব্লক করছেন: সংক্ষিপ্ত পরীক্ষার জন্য একটি ঠিকানা, নাকি এমন কাউকে দূরে রাখতে একটি সার্টিফিকেট।
ঠিকানাটি সার্টিফিকেটের সাথে বাঁধতে, client-config-dir দ্বারা নামকৃত ডিরেক্টরিতে একটি ফাইল তৈরি করুন এবং ফাইলটিকে সার্টিফিকেটের common name ঠিক তেমনই দিন। এতে একটি নির্দেশনা রাখুন, ifconfig-push 10.8.0.6 255.255.255.0, এবং ওই ক্লায়েন্ট পুনঃসংযোগেও একই টানেল ঠিকানা ধরে রাখে। এটি কার্যকর হতে দুটি সেটিং থাকতে হবে: সার্ভার কনফিগারেশনে client-config-dir ঘোষণা করতে হবে, এবং পুশ করা ঠিকানাটি এমন সাবনেটে থাকতে হবে যা সার্ভার রুট করতে পারে। যেকোনো একটি বাদ গেলে ফাইলটি কোনো ত্রুটি ছাড়াই উপেক্ষিত হয়, যা পরের ফায়ারওয়াল পরীক্ষাকে বিভ্রান্তিকর করে তোলে।
সাময়িক ব্লক পুলের ঠিকানা ব্যবহার করতে পারে, যতক্ষণ টিকিটে লেখা থাকে সেই সময়ে কোন সেশনটি এটি ধরে রেখেছিল।
ক্রম নির্ধারণ করে ড্রপটি চলবে কি না
যে Linux গেটওয়ে টানেল ও LAN-এর মধ্যে ফরওয়ার্ড করে, সেখানে প্যাকেট FORWARD চেইন অতিক্রম করে। নিচের কমান্ডটি একটি বাক্য হিসেবে পড়ুন: FORWARD-এর শুরুতে ঢোকান, tun0 থেকে আসা, কেবল সেই একটি হোস্ট থেকে, LAN সাবনেটে লক্ষ্য করা ট্রাফিক মিলিয়ে ফেলে দিন।
iptables -I FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP-I হলো যা নিয়মটি চালায়। -A দিয়ে যোগ করলে এটি টানেল সাবনেটের যেকোনো বিস্তৃত অনুমোদনের নিচে পড়ে এবং কখনো প্যাকেট দেখে না। iptables -vnL FORWARD --line-numbers দিয়ে অবস্থান যাচাই করুন এবং কাউন্টারও পড়ুন: উপরে থাকা ড্রপ যদি কিছু না গোনে, তার মানে ট্রাফিক অন্য পথে আসছে।
গেটওয়ের নিজের LAN ঠিকানা আলাদা পথ। বক্সটির নিজের কাছে পাঠানো প্যাকেট INPUT-এ যায়, FORWARD-এ নয়, তাই একটি ক্লায়েন্ট LAN হোস্ট হারিয়েও রাউটারের অ্যাডমিন পেজ খুলতে পারে। এটি গুরুত্বপূর্ণ হলে মিলে যাওয়া INPUT নিয়ম যোগ করুন।
ফিল্টার যা দেখতে পারে না
প্যাকেট মূল্যায়নের সময় ফিল্টারিং ঘটে, তাই প্রতিষ্ঠিত TCP সেশন বন্ধ বা রিসেট না হওয়া পর্যন্ত চলতে পারে। ব্লকটি যদি সঙ্গে সঙ্গে কাজ করতে হয়, নিয়ম বসানোর পর conntrack -D -s 10.8.0.6 দিয়ে ওই সোর্সের ট্র্যাক করা ফ্লো মুছে দিন। কয়েক সেকেন্ডের ওভারল্যাপ গ্রহণযোগ্য হলে সেই সিদ্ধান্ত লিখে রাখুন, অন্তর্নিহিত রেখে দেবেন না। যেভাবেই হোক, পরের ব্যক্তিকে জানতে হবে নিয়মটি জীবন্ত ট্রাফিক থামায়, নাকি কেবল নতুন সংযোগ।
পিয়ার ট্রাফিক কখনো হোস্ট ফায়ারওয়াল স্পর্শ করে না। client-to-client চালু থাকলে OpenVPN ওই প্যাকেট ডেমনের ভেতরে ফরওয়ার্ড করে, তাই FORWARD বা INPUT কোনোটিই সেগুলো দেখে না। একমাত্র সমাধান হলো client-to-client বন্ধ করা বা পিয়াররা একে অপরকে পৌঁছাতে পারে তা মেনে নেওয়া; iptables নিয়ম ওই ট্রাফিক দেখবে না।
IPv6, ফার্মওয়্যার এবং রিবুটের পর টিকে থাকা
IPv4 নিয়ম IPv6 সম্পর্কে কিছুই বলে না। টানেল ও LAN যদি দুই পরিবারই বহন করে, সমতুল্য নিয়মটি ip6tables-এ থাকতে হবে, বা ওই হোস্টে নীতি মালিকানাধীন nftables রুলসেটে। রাউটার ফার্মওয়্যার প্রায়ই netfilter-কে নিজের বিমূর্ততার আড়ালে লুকায়, তাই ফোরাম থেকে কপি করা সিনট্যাক্স ও টেবিলের নাম নাও খাটতে পারে।
OpenWrt-এ নথিভুক্ত পথ হলো ফায়ারওয়াল কনফিগারেশন এন্ট্রি, হাতে লেখা iptables লাইন নয়, এবং হাতে লেখা লাইন ফায়ারওয়াল রিলোড হলে হারিয়ে যেতে পারে। অন্য ডিস্ট্রিবিউশনগুলো netfilter-persistent, বুট ইউনিট বা ভেন্ডর স্টোরের মাধ্যমে নিয়ম পুনরুদ্ধার করে, এবং ওই প্রক্রিয়াগুলো বিনিময়যোগ্য নয়। আপনি যেটি বেছেছেন তা রিবুট দিয়ে প্রমাণ করুন, কারণ রিলোড ভিন্ন পথ ব্যবহার করে।
পথ ধরে যাচাই করুন, তারপর পরিষ্কারভাবে ফিরিয়ে নিন
প্রতিটি পথ আলাদাভাবে পরীক্ষা করুন, কারণ একটি সফল যাচাই বাকিগুলোকে লুকায়। ব্লক করা ক্লায়েন্টের টানেল দিয়ে ইন্টারনেটে পৌঁছানো উচিত, কিন্তু LAN হোস্টে ব্যর্থ হওয়া উচিত; দ্বিতীয় ক্লায়েন্টের ওই একই হোস্টে পৌঁছানো উচিত; গেটওয়ে ঠিকানা ও পিয়ার পথের প্রত্যেকের নিজস্ব পর্যবেক্ষণ দরকার। ফলাফল নিয়মের পাশে লিখুন যাতে পরের পরিবর্তনের একটি ভিত্তি থাকে। নিচের টেবিলটি সেই সেট যা টিকিটে রাখা মূল্যবান।
| পথ | নিয়মসহ প্রত্যাশিত | যখন ব্যর্থ হয় |
|---|---|---|
| ব্লক করা ক্লায়েন্ট থেকে LAN হোস্টে | কোনো উত্তর নেই | নিয়ম কোনো অনুমোদনের নিচে, বা সোর্স মেলে না |
| ব্লক করা ক্লায়েন্ট থেকে ইন্টারনেটে | tun0 দিয়ে কাজ করে | নিয়মটি খুব বিস্তৃত, গন্তব্য মিল নেই |
| দ্বিতীয় ক্লায়েন্ট থেকে একই LAN হোস্টে | কাজ করে | নিয়মটি অভীষ্ট হোস্টের বেশি মিলিয়েছে |
| ব্লক করা ক্লায়েন্ট থেকে গেটওয়ের LAN ঠিকানায় | কেবল মিলে যাওয়া INPUT নিয়ম থাকলেই ব্লক হয় | INPUT নিয়ম অনুপস্থিত |
| ব্লক করা ক্লায়েন্ট থেকে পিয়ার টানেল ঠিকানায় | তবুও কাজ করে | client-to-client চালু এবং ফায়ারওয়ালের আওতার বাইরে |
রোলব্যাক হলো স্পেসিফিকেশন অনুযায়ী ডিলিট, ফ্লাশ নয়: iptables -D FORWARD -i tun0 -s 10.8.0.6/32 -d 192.168.1.0/24 -j DROP ঠিক ওই এন্ট্রিটি সরায় এবং চেইনের বাকিটা অক্ষত রাখে। বুটে নিয়ম পুনরুদ্ধার করে এমন যেকোনো ফাইল থেকে একই লাইন সরান, সেটি রিলোড করুন, এবং ক্লায়েন্ট আবার LAN হোস্টে পৌঁছায় তা নিশ্চিত করুন। FORWARD ফ্লাশ করলে আপনি না লেখা নিয়মও বাতিল হতো, যা রোলব্যাককে দ্বিতীয় ঘটনায় পরিণত করে।
টিকিট বন্ধ করার আগে তিনটি বিষয় নিশ্চিত করুন: পিন করা ঠিকানা সার্টিফিকেটের সাথে মেলে, নিয়মটি অনুমোদনগুলোর উপরে আছে এবং কাউন্টার অশূন্য, এবং স্থায়িত্ব ফাইলে আপনি যে নিয়মটি পরীক্ষা করেছেন সেটিই আছে। এর কোনোটি না থাকলে ব্লকটি শেল সেশনের একটি মায়া।