শুধুমাত্র VPN-এর জন্য iptables হোস্ট: tun ডিভাইসের নাম দিন, tun+ নয়
tun+ মেশিনের প্রতিটি টানেলের সঙ্গে মেলে। একটি ডিভাইস নাম স্থির করুন, endpoint ব্যতিক্রমটি আগে রাখুন, এবং নীতি পরীক্ষা করার সময় পুনরুদ্ধারের পথ রাখুন।
-o tun+ লেখা একটি নির্ভুল নির্দেশের মতো শোনায়, কিন্তু বাস্তবে এটি কার্নেলের প্রতিটি টানেলের সঙ্গে মেলে এমন একটি ওয়াইল্ডকার্ড। দ্বিতীয় VPN ক্লায়েন্ট, একটি কন্টেইনার ব্রিজ, বা ভেঙে পড়া সেশনের রেখে যাওয়া একটি ইন্টারফেস—সবই এটি সন্তুষ্ট করে, আর হোস্ট তখন এমন ট্রাফিক অনুমোদন করে যা নীতি প্রতিরোধ করার জন্য লেখা হয়েছিল। নিচের রানবুক একটি ডিভাইস নাম স্থির করে, ব্যতিক্রমগুলো এমনভাবে সাজায় যাতে টানেল সত্যিই তৈরি হতে পারে, এবং নিয়মগুলো খারাপভাবে পড়লে ফিরে যাওয়ার পথ রাখে। প্রতিটি ধাপ আলাদাভাবে ফিরিয়ে আনার মতো যথেষ্ট ছোট।
ধাপ 1: এখন যে নিয়মগুলো আছে তা লিখে রাখুন
ডিফল্ট নীতি বদলানোর আগে বর্তমান অবস্থা সংরক্ষণ করুন, যাতে রোলব্যাক স্মৃতি নয়, কমান্ড হয়। iptables-save > /root/iptables.pre প্রতিটি টেবিল এমন একটি ফাইলে লেখে যা আপনি পুনরুদ্ধার করতে পারেন, এবং আপনি যে নীতি দিতে চলেছেন তা যদি সেটি বহনকারী সংযোগটি পড়িয়ে দেয়, তবে root সেশন খোলা একটি দ্বিতীয় টার্মিনাল বাতিক নয়। আপনি যদি দূর থেকে কাজ করেন, তবে একটি flush-ও ডেড ম্যান সুইচ হিসেবে নির্ধারণ করুন।
তারপর ইন্টারফেসগুলো তালিকাভুক্ত করুন, কারণ যে নাম আপনি ধরে নিয়েছেন সেটি এমন নাম যা আপনার পড়া উচিত ছিল: ip -br link এখন কী আছে তা দেখায়, আর টানেল চালু না হওয়া পর্যন্ত দেখা যাবে না। পড়ার সময়েই ডিভাইসের নামগুলো লিখে রাখুন।
ধাপ 2: টানেলকে তার নিজের নাম দিন
OpenVPN ক্লায়েন্ট কনফিগারেশনে dev tun_work গ্রহণ করে, এবং তখন Linux tun0 বরাদ্দ না করে ঠিক সেই নামেই একটি ইন্টারফেস তৈরি করে। অন্য কিছু দাবি না করলে পুনঃসংযোগের মধ্যেও নামটি স্থিতিশীল থাকে, আর এটাই ডিভাইসের নাম উল্লেখ করা নিয়মকে অর্থবহ করে।
যেখানে নাম নিয়ন্ত্রণ করা যায় না, সেখানে টানেল ঠিকানা বা প্যাকেট মার্কের সঙ্গে মেলান। দুটোই কাজ করে, দুটোই পড়তে কঠিন, এবং টানেল নম্বর বদলালে দুটোই আরও নিঃশব্দে ব্যর্থ হয়। যেভাবেই হোক, একটিমাত্র জিনিসের সঙ্গে মেলান এবং কোনটি তা স্পষ্ট করুন।
ধাপ 3: endpoint ব্যতিক্রম আগে রেখে নীতি লিখুন
শুধুমাত্র VPN হোস্ট হলো সংক্ষিপ্ত ব্যতিক্রম তালিকাসহ ডিফল্ট-ডিনাই হোস্ট, আর সবচেয়ে গুরুত্বপূর্ণ ব্যতিক্রমটি হলো যা টানেলকে থাকতে দেয়। এটি এই ক্রমে গড়ুন, টানেল-ডিভাইস নিয়মের আগে endpoint নিয়ম রেখে, যাতে হ্যান্ডশেকের যাওয়ার জায়গা থাকে:
# allow the tunnel to be built, then everything the tunnel carries
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -d 198.51.100.7 -p udp --dport 1194 -j ACCEPT
iptables -A OUTPUT -o tun_work -j ACCEPT
iptables -A INPUT -i tun_work -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTআক্ষরিক endpoint ঠিকানা ও পোর্ট আপনার প্রদানকারীর, এই পৃষ্ঠার নয়। endpoint যদি হোস্টনাম হয়, একবার তা রিজলভ করে ফলাফলটি স্থির করুন, কারণ নিয়ম কোনো নাম খুঁজতে পারে না এবং ঘুরতে থাকা উত্তর পরবর্তী DNS পরিবর্তনের পরে নীতিটি নিঃশব্দে ভেঙে দেবে। পোর্টও দেখুন, কারণ যে প্রদানকারীরা আপনাকে TCP 443-এ সরায় তাদের অন্যথায় এমন একটি নিয়ম লাগবে যা কেউ লেখেনি। কেবল একটি প্রোটোকলে কাজ করা টানেল সাধারণত ফায়ারওয়ালের ত্রুটি নয়, বরং ঠিক এই বাদ পড়াটি।
রাউটারে একই আকৃতি এর পেছনের ক্লায়েন্টদের জন্য FORWARD চেইনে যায়, আর রাউটারের নিজের ট্রাফিকের জন্য নিজের নিয়ম দরকার। যে নিয়মসমষ্টি কেবল ফরওয়ার্ড করা প্যাকেট ঢাকে তা SSH ও DNS-কে পুরনো পথে রেখে দেয়, আর এভাবেই টানেল ওঠার মুহূর্তে রাউটার অপ্রাপ্য হয়ে যায়।
ধাপ 4: কেবল উপস্থিতি নয়, ক্রমও যাচাই করুন
নিয়মগুলো ক্রমানুসারে মূল্যায়িত হয়, তাই আগে আসা একটি ACCEPT আপনাকে পরে যোগ করা REJECT-কে কেবল ঢেকে দেয়। established ও related মিলটিই সাধারণ ইনবাউন্ড পথ না খুলে আপনার নিজের আউটবাউন্ড অনুরোধের উত্তরগুলো ফিরে আসতে দেয়, আর এটি টানেল গ্রহণের পরে রাখলে বোঝায় যে পড়ে যাওয়া টানেলও নিজের ইন্টারফেসে ফেরত ট্রাফিক পার করে।
নিয়মের সংখ্যা এক স্ক্রিনে পড়ার মতো ছোট রাখুন। যে নিয়মসমষ্টি আপনি অডিট করতে পারেন না, সেটিই আপনি উপরে ব্যতিক্রম যোগ করে তালু দেবেন, আর এভাবেই ডিফল্ট-ডিনাই নীতিগুলো ধীরে ধীরে ডিফল্ট-অ্যালাও প্রান্ত পায়। পরিবর্তনের আগে ও পরে ACCEPT গুনুন।
ধাপ 5: এটিকে বুট ও ঠিকানা পরিবার উভয়ই টিকিয়ে রাখুন
হাতে দেওয়া নিয়ম রিবুটে মুছে যায়, তাই ডিস্ট্রিবিউশনের ফায়ারওয়াল সার্ভিস বা টানেল ইন্টারফেস তৈরি হওয়ার পরে চলে এমন একটি unit থেকে সেগুলো লোড করুন। OpenVPN শুরুর আগে চলে এমন স্ক্রিপ্টে tun_work উল্লেখ করা বাদ পড়া ট্রাফিকের বুট লুপ তৈরির একটি সাধারণ উপায়।
তারপর IPv6 আলাদাভাবে পরীক্ষা করুন, কারণ একটি ভালো IPv4 ডিফল্ট-ডিনাই নীতি অন্য পরিবার সম্পর্কে কিছুই বলে না। ip -6 route আপনাকে জানাবে হোস্টের এমন রুট আছে কি না যা কেবল IPv4 সামলানো টানেলকে পাশ কাটিয়ে ট্রাফিক বহন করতে পারে, আর ip6tables বা nftables-এর নিজস্ব সমতুল্য নিয়ম দরকার। নিয়মসমষ্টির প্রতিসাম্য বিশ্বাস না করে IPv6-only গন্তব্য দিয়ে পরীক্ষা করুন।
ধাপ 6: যাচাই করুন এবং পুনরুদ্ধারের জন্য প্রস্তুত থাকুন
টানেল তুলুন, আপনার অভীষ্ট সেবা কাজ করছে কিনা নিশ্চিত করুন, তারপর এমন কিছু চেষ্টা করুন যা নীতির প্রত্যাখ্যান করা উচিত। উত্তর আপনাকে অবাক করলে iptables-restore < /root/iptables.pre দিয়ে পুনরুদ্ধার করুন, এবং কেবল তারপর নিয়ম সম্পাদনা শুরু করুন। স্থায়িত্বের সঙ্গে পরীক্ষিত পুনরুদ্ধার পথই এটিকে এমন পরিবর্তন করে যা আপনি দুবার করতে পারেন।