DNS-চালিত nftables সেট থেকে WireGuard: হ্যান্ডঅফ কীভাবে কাজ করে
একটি DNS উত্তর nftables সেটকে খাওয়াতে পারে, কিন্তু সেট নিজে কোনো রুটিং করে না। চারটি হ্যান্ডঅফ আর তিনটি আয়ু অনুসরণ করুন, যেগুলো ঠিক করে স্টিয়ারিং কাজ করবে কি না।
নাম ঠিকানায় রূপান্তরিত হয়, আর সেই ঠিকানাগুলো ফায়ারওয়াল সেটে ঢুকতে পারে যা পরে রাউটিংকে প্রভাবিত করে, ফলে প্রক্সি ছাড়াই নামভিত্তিক স্টিয়ারিং সম্ভব হয়। ফাঁদ হলো, চারটি উপাদানকে সঠিকভাবে হ্যান্ডঅফ করতে হয়: রিজলভার, সেট, নতুন ফ্লো চিহ্নিতকারী ক্লাসিফায়ার, এবং এটি বহনকারী পিয়ার। প্রতিটি হ্যান্ডঅফ আলাদাভাবে ব্যর্থ হয় এবং প্রত্যেকে নিজের সময় ধরে রাখে।
নকশাটিকে কনফিগারেশন নয়, বরং একটি শৃঙ্খল হিসেবে ধরুন। প্রতিটি ধাপের প্রশ্ন হলো কোন উপাদান সিদ্ধান্তের মালিক এবং তার ইনপুট অনুপস্থিত হলে কী হয়।
DNS উত্তর যা করতে পারে এবং যা করতে পারে না
dnsmasq উত্তর থেকে ঠিকানা nftables সেটে কপি করতে পারে, এটি রাউটিং সিদ্ধান্ত নয় বরং একটি ফিড। সেই অপশনটি, dnsmasq ম্যানুয়ালে নথিভুক্ত, পরিবার, টেবিল ও সেটের নাম দেয়, আর এর শুরুর 4# কেবল A রেকর্ড বেছে নেয়, তাই v6 গন্তব্যের জন্য আলাদা ব্যবস্থা দরকার। সেটটি আগে থেকেই থাকতে হবে, কারণ রিজলভার ফায়ারওয়াল মালিকের তৈরি জিনিসে উপাদান যোগ করে। সেই ধাপে কোনো ইন্টারফেস, টেবিল বা পিয়ার বেছে নেওয়া হয় না।
ক্লায়েন্টকেও নামের জন্য সেই রিজলভার ব্যবহার করতে হবে। নিজস্ব এনক্রিপ্টেড DNS আছে এমন অ্যাপ্লিকেশন, বা নীতি তৈরির আগের ক্যাশে থাকা উত্তর, সেটে কোনো এন্ট্রি না বানিয়েই সংযোগ করে।
সেট হলো ইনপুট, রুট নয়
সেটের একটি উপাদান হলো মেলানোর শর্ত। কাউকে তা দেখতে হবে, সিদ্ধান্ত নিতে হবে যে এই প্যাকেট নতুন ফ্লো শুরু করছে, এবং সেই নীতি প্রয়োগ করতে হবে যা ফ্লোকে টানেল দিয়ে পাঠায়। Linux-এ এটি সাধারণত বোঝায় একটি রুট-সক্ষম আউটপুট পথ যা মার্ক বসাতে পারে, একটি নিয়ম যা চিহ্নিত প্যাকেটকে ডেডিকেটেড টেবিলে পাঠায়, এবং সেই টেবিলে WireGuard ডিভাইসের দিকে নির্দেশ করা একটি রুট। কেবল সদস্যপদ এগুলোর কিছুই ইনস্টল করে না।
nft add set inet vpn_select office_v4 { type ipv4_addr\; }
ip rule add fwmark 0x40 table 200
ip route add default dev wg0 table 200
wg show wg0 allowed-ips
পিয়ার দ্বিতীয় একটি কভারেজ যাচাই প্রয়োগ করে যা মানুষ ভুলে যায়। WireGuard কেবল সেই পিয়ারের জন্য প্যাকেট এনক্রিপ্ট করে যার অনুমোদিত ঠিকানায় গন্তব্যটি আছে, তাই পিয়ারের তালিকা সেই প্রিফিক্স বাদ দিলে ইন্টারফেসে নীতি-রুট যথেষ্ট নয়। তালিকাটি ম্যানেজার যে রুট তৈরি করে তার উপর নির্ভর না করে রাউটিং মালিকের নিয়ন্ত্রণে রাখুন।
মার্ক, টেবিল ও পিয়ার কভারেজ
মার্ক একটি ভাগ করা নামস্থান, তাই মান এবং মাস্ক দুটোই অন্য যা কিছু সেগুলো ব্যবহার করে তার সঙ্গে মিলিয়ে নিতে হবে। চিহ্নিত ট্রাফিক ডেডিকেটেড টেবিলে পাঠানো নিয়মের একটি নির্দিষ্ট ফলাফল দরকার যখন সেই টেবিলে মিলতে পারে এমন রুট নেই, কারণ উত্তরহীন লুকআপ পরের নিয়মে গিয়ে প্যাকেটটি ফিজিক্যাল ইন্টারফেস দিয়ে বের করে দিতে পারে। ডেডিকেটেড টেবিলের ভেতরে blackhole ডিফল্ট সেই নিঃশব্দ পলায়নকে দৃশ্যমান বর্জনে বদলে দেয়। নকশাটি এখনও যা করতে পারে না, তা হলো এমন গন্তব্যের জন্য বন্ধ হয়ে যাওয়া যা কখনও সেটে ঢোকেনি।
টানেলের নিজের বাইরের প্যাকেটগুলোকে ক্লাসিফায়ার এড়িয়ে যেতে হবে। WireGuard টুল ঠিক এই উদ্দেশ্যে সকেট মার্ক দেয়, আর এটি ব্যবহার করলে এনক্যাপসুলেশন নিজে যে ইন্টারফেস তৈরি করছে সেখানে ফিরে রুট হয় না।
প্রতিটি আয়ু আলাদাভাবে পরীক্ষা করুন
তিনটি ভাণ্ডার তিনটি সময়সূচিতে পুরনো হয়: রিজলভার ক্যাশে, সেটের উপাদান এবং ট্র্যাক করা সংযোগ। এই ক্রমে পরীক্ষা করুন এবং দেখুন প্রতিটি যখন উচিত তখন নড়ছে কি না। নিচের কমান্ডগুলো কিছু না বদলেই রিজলভার, সেট, সংযোগ টেবিল ও নীতি নিয়ম পড়ে।
dig +short office.example
nft list set inet vpn_select office_v4
conntrack -L -d 10.60.8.15
ip rule show
উপাদান যোগ করা একটি নতুন লুকআপ প্রমাণ করে ফিড কাজ করছে, আর নিজের উত্তরকে অতিক্রম করা পুরনো উপাদান হলো আয়ুর অমিল যা লিখে রাখা দরকার। সংযোগ টেবিলে প্রত্যাশিত মার্ক নিয়ে নতুন সংযোগ দেখা যাওয়া দেখায় ক্লাসিফায়ার চলেছে, আর পুরনো সংযোগ তার মূল মার্ক ধরে রাখা বাগ নয় বরং সঠিক আচরণ। নিয়মের তালিকা উত্তর দেয় নীতির লুকআপ আদৌ আছে কি না, যা এটি মিলেছে কি না তার চেয়ে আলাদা প্রশ্ন। চারটি আউটপুট এই ক্রমে পড়ুন, ব্যর্থ হ্যান্ডঅফ নিজেই ধরা পড়বে।
যেখানে দরকার যে একটি নির্দিষ্ট নাম সর্বদা একটি পথ ব্যবহার করবে, সেখানে DNS-চালিত সেট তা প্রমাণ করতে পারে না, কারণ ভাগ করা ঠিকানা অন্য নামও বহন করে। প্রক্সি বা অ্যাপ্লিকেশন-স্তরের ব্যবস্থাই সেই নিশ্চয়তার হাতিয়ার।