ip rule দিয়ে একটি নীতি নিয়ম যোগ করুন, আর সেটি লিংকটি চলে যাওয়া পর্যন্ত কাজ করে; সেই মুহূর্তে সেটি কেবল আর নেই। কোনো কিছু জোরে ব্যর্থ হয়নি: কার্নেলের অবস্থা বদলে গেল, আর কোনো কনফিগারেশন মালিক জানত না যে নিয়মটির থাকার কথা। টিকে থাকা নিয়ম আর না-থাকা নিয়মের মধ্যে পুরো পার্থক্য এটাই। systemd-networkd হোস্টে সমাধান হলো নিয়মটিকে একটি মালিক দেওয়া, প্রতিবার পুনঃসংযোগের পর কমান্ডটি আবার চালানো নয়।

নিয়ম তখনই থাকে যখন কেউ তার মালিক হয়

কার্নেলের রাউটিং নীতি কনফিগারেশন নয়, অবস্থা। এটি চলমান সিস্টেমে বাস করে, আর যে ইন্টারফেসের উপর এটি নির্ভর করে তা ভেঙে ফেলা যে-কোনো কিছুই এটিকে সঙ্গে নিয়ে যেতে পারে। শেল কমান্ড সেই অবস্থা বদলায় এবং উদ্দেশ্যের কোনো রেকর্ড রাখে না।

নেটওয়ার্ক ম্যানেজাররা উল্টোভাবে কাজ করে: তারা কনফিগারেশন পড়ে, প্রয়োগ করে, আর লিংক ইভেন্ট আগের অবস্থাকে অকার্যকর করলে আবার প্রয়োগ করে। তাদের কনফিগারেশনে ঘোষিত নিয়ম আবার তৈরি হয়, অথচ তাদের পাশে যোগ করা নিয়ম মালিকহীন একটি বহিরাগত বস্তু।

এই পার্থক্যের networkd-এ একটি নাম আছে, আর কিছু সক্রিয় করার আগে সেটি পড়া উচিত। সাম্প্রতিক সংস্করণে বহিরাগত নিয়ম ডিফল্টভাবে সরানো হয়, যা তাদের অবাক করে যারা ভেবেছিল তাদের হাতে লেখা এন্ট্রি থেকে যাবে।

কোনো সেটিংয়ে ভরসা করার আগে সংস্করণ পড়ুন

মালিকানা-আচরণ networkd.conf-এর একটি সেটিং দিয়ে নিয়ন্ত্রিত হয়, আর সেই সেটিং পুরোনো systemd সংস্করণে নেই। এর চারপাশে নকশা করার আগে ইনস্টল করা সংস্করণ যাচাই করুন, কারণ পুরোনো হোস্ট আপনি যে ডকুমেন্টেশন পড়ছেন তার চেয়ে ভিন্নভাবে আচরণ করে।

দুটি মান গুরুত্বপূর্ণ। একটি ঠিক করে networkd কনফিগারেশনে ঘোষিত নয় এমন নিয়ম সরানো হবে কি না, আর অন্যটি রুটের জন্য একই কাজ করে। দুটোই নীতির বিষয়বস্তু নয়, মালিকানা নিয়ে, আর দুটোরই ডিফল্ট চলতি সংস্করণে কঠোরতর আচরণ। এগুলো বিশ্বব্যাপী বন্ধ রাখলে প্রতিটি বহিরাগত নিয়ম বেঁচে থাকে, যা একটি অভীষ্ট VPN নীতি ঘোষণা করার চেয়ে অনেক বড় সিদ্ধান্ত।

systemctl --version | head -1
networkctl --version | head -1
grep -R "ManageForeign" /etc/systemd/ /usr/lib/systemd/ 2>/dev/null

সেই grep আপনাকে বলে স্থানীয়ভাবে কী সেট আছে এবং ভেন্ডরের ডিফল্ট কী। অনুপস্থিতিও তথ্য, কারণ এর অর্থ হলো কম্পাইল করা ডিফল্টটি প্রযোজ্য। ডিফল্টটি নিজের নোটে লিখে রাখুন যাতে পরের মানুষকে তা আবার আবিষ্কার করতে না হয়।

নিয়ম ও তার দেখানো টেবিল ঘোষণা করুন

.network ফাইলের একটি নিয়ম একটি টেবিলের নাম দেয়, আর নাম যা করে তা এটুকুই। এটি সেই টেবিলের ভেতরের রুট তৈরি করে না, আর সেগুলো অর্থবহ কি না তা যাচাই করে না। রুট ছাড়া নিয়ম ঘোষণা করলে এমন নীতি তৈরি হয় যা ট্রাফিক মেলায় এবং পরে ফেলে দেয়।

একই ফাইলে রুটগুলো ঘোষণা করুন, পৌঁছানো যায় এমন পরবর্তী হপ ও সঠিক টেবিলসহ। ঘোষিত নিয়মে অগ্রাধিকার রাখুন যাতে ক্রমবদ্ধ তালিকায় এটি আপনার প্রত্যাশিত জায়গায় পড়ে। ভুল টেবিলে সময়ের আগে পৌঁছানো নিয়ম আপনি যে সেবাটি ঠিক করতে চেয়েছিলেন তার চেয়ে বেশি ট্রাফিক বদলে দেয়। নিচের অংশটি সম্পূর্ণ ফাইল নয়, একটি আকার হিসেবে পড়ুন, কারণ ইন্টারফেস মালিকানা ও সংযোগের বাকি অংশও থাকতেই হবে।

[RoutingPolicyRule]
Family=ipv4
IPProtocol=tcp
SourcePort=443
Table=100
Priority=1000

[Route]
Destination=10.80.0.0/24
Gateway=10.80.0.1
Table=100

তারপর রিলোড করুন এবং ফাইল নয়, কার্নেলের অবস্থা পড়ে দেখুন। পরিষ্কারভাবে পার্স হওয়া কনফিগারেশনও আপনার অচিন্তিত একটি নিয়ম তৈরি করতে পারে, আর দুটি দৃশ্য কেবল তখনই মেলে যখন ঘোষণাটি সম্পূর্ণ ছিল।

ইন্টারফেসের জন্য একজন মালিক বেছে নিন

এক টানেলে দুই ম্যানেজার এমন লড়াই বাধায় যা দুটোতেই বাগের মতো দেখায়। চলমান wg-quick সেটআপ networkd-এ আমদানি করা যোগ নয়, স্থানান্তর, আর দুটোই চালালে ইন্টারফেস ও তার নিয়ম দুজন মালিকের অধীনে থেকে যায়।

স্থানান্তরটি একবারেই করুন: পুরোনো ইউনিট থামান, নিষ্ক্রিয় করুন, networkd-এ ইন্টারফেস ও তার রুট ঘোষণা করুন, তারপর রিলোড করুন। পুরোনো ইউনিট বুটে ফিরে আসতে পারে না তা যাচাই করুন। রিবুটের পর আবার সক্রিয় হওয়া অবশিষ্ট ইউনিট আপনি এইমাত্র ঘোষণা করা অবস্থাকে লিখে ফেলে। নতুনটি একটি পুনঃসংযোগ টিকে যাওয়া পর্যন্ত পুরোনো কনফিগারেশন ফাইলটি রাখুন, তারপর অবসর দিন।

মার্কের মালিকানাও একই যত্ন দাবি করে: নিয়ম যদি ফায়ারওয়াল মার্কের সাথে মেলে, তবে কাউকে সেই মার্ক সেট করতে হবে। যে নিয়ম এমন মার্কের কথা বলে যা কেউ সেট করে না, সেটি মৃত কনফিগারেশন যা ইচ্ছাকৃত মনে হয়।

জীবনচক্রের ইভেন্টগুলো মহড়া দিন

কনফিগারেশন ততটুকুই ভালো যতটুকু ইভেন্টজুড়ে তার আচরণ। লিংক নামান, তোলেন, সেবা পুনরায় চালু করুন এবং ঠিকানা নবায়ন করুন। প্রতিটির পরে নিয়মের তালিকা ও টেবিলের বিষয়বস্তু পড়ুন।

sudo networkctl reload
ip rule show
ip route show table 100
sudo systemctl restart systemd-networkd

কাঙ্ক্ষিত ফল হলো একই মালিকানাধীন নীতি আবার তৈরি হওয়া এবং পুরোনো অবস্থার অবসর, যা প্রতিবার পুনঃসংযোগের পর শেল নিয়ম আবার যোগ করার চেয়ে বেশি টেকসই। পরিবর্তন-রেকর্ডে একটি লাইন রাখুন যেখানে নিয়মের মালিক ফাইল ও যে সংস্করণ এটি সমর্থন করে তা লেখা থাকে। তখন পরের প্রকৌশলী শেল ইতিহাস খোঁজা ছাড়াই নীতিটি পাবেন। যে নিয়মের কোনো মালিক নেই, সেটি আবার হারিয়ে যাবে।

সম্পর্কিত নিবন্ধ