Systemd বনাম NetworkManager: বুটে VPN কে চালু করে?
তিনটি পদ্ধতি একই Ubuntu প্রোফাইল চালু করতে পারে, প্রতিটির ট্রিগার আলাদা। এগুলো তুলনা করুন, একজন মালিক রাখুন, নকলটি সরান।
একই ইমেজের দুটি Ubuntu মেশিন, একটি VPN প্রোফাইল, লগইনে উল্টো ফল: একটিতে ডেস্কটপ আসার আগেই টানেল চালু, অন্যটিতে কখনোই চালু হয় না। এখানে প্রোফাইলটি পরিবর্তনশীল নয়। পার্থক্য হলো তিনটি উপাদানের মধ্যে কোনটিকে এটি চালু করার নির্দেশ দেওয়া হয়েছে, আর এই তিনটি একই সুইচ ভাগ করে না।
পাশাপাশি তুলনা করা অনুমানের চেয়ে দ্রুত। প্রতিটি আলাদা ধরনের ব্যর্থতা দেখায়, আর সেটাই তুলনাটিকে মূল্যবান করে তোলে।
তিনটি ভিন্ন ট্রিগারসহ তিনটি স্টার্টার
প্যাকেজকৃত openvpn সার্ভিস সবচেয়ে পুরোনো পথ। এর init স্ক্রিপ্ট /etc/default/openvpn থেকে অটোস্টার্ট তালিকা পড়ে। তালিকাটি কমেন্ট করা বা খালি রাখা থাকলে স্ক্রিপ্ট আপনার যোগ করা একক কনফিগারেশনের বদলে ওই ডিরেক্টরিতে পাওয়া প্রতিটি কনফিগারেশন চালু করে। একটি টানেলের জন্য যোগ করা একটি ফাইল নিঃশব্দে কয়েকটি চালু করে দিতে পারে।
| Starter | What triggers it | Typical failure |
|---|---|---|
| Init script and templated units | Boot, plus anything in the autostart list | Starts every config, not the one you meant |
| NetworkManager secondary | Activation of the base Wi-Fi or Ethernet profile | Nothing happens until that base link comes up |
| Hand-written unit or wrapper | Whatever its WantedBy and ExecStart say | Runs a different binary or environment than your shell |
দ্বিতীয় সারিটি মানুষ ভুল কনফিগার করে। NetworkManager আমদানি করা প্রোফাইল ধরে রাখে এবং চালু করবে, কিন্তু শুধু অন্য একটি সংযোগের সেকেন্ডারি হিসেবে, অর্থাৎ ট্রিগারটি VPN-এর নয়, নেটওয়ার্ক লিংকের।
সেটআপ খরচ ও পরিধি তুলনা করুন
init স্ক্রিপ্টের পথে এক লাইন লাগে এবং মেশিনের প্রতিটি কনফিগারেশন ঢেকে দেয়। এটি রাউটারের জন্য ঠিক, কিন্তু আলাদা আলাদা নেটওয়ার্কে যোগ দেওয়া ল্যাপটপের জন্য ভুল। NetworkManager পথে একটি UUID খোঁজা লাগে এবং টানেলকে একটি বেস সংযোগে বেঁধে দেয়। এটি অফিসের নেটওয়ার্কে চালু হয় আর হোটেলের নেটওয়ার্কে বন্ধ থাকে।
হাতে লেখা unit সবচেয়ে বেশি খরচ করে এবং সবচেয়ে বেশি নিয়ন্ত্রণ দেয়, অন্য সার্ভিসের সঙ্গে ক্রম নির্ধারণসহ। সিদ্ধান্তকারী বিষয় হলো পরিধি। মেশিনে যদি একটি নেটওয়ার্ক আর একটি টানেল থাকে, প্যাকেজকৃত সার্ভিস সৎ ও পূর্বানুমেয়। টানেলটি যদি নির্দিষ্ট কোনো Wi-Fi নেটওয়ার্ক অনুসরণ করা উচিত হয়, তবে তিনটির মধ্যে সেকেন্ডারিই একমাত্র, যা অতিরিক্ত স্ক্রিপ্ট ছাড়া ওই শর্ত প্রকাশ করে।
একজন মালিক বাছুন, বাকিরা সরান
দুই মালিকের চালু করা প্রোফাইল বুট থেকে বুটে বদলে যাওয়া সময় তৈরি করে, যা যেকোনো একটি পদ্ধতির চেয়ে খারাপ। মালিক বেছে নিন, তারপর প্রতিদ্বন্দ্বী পথটি দুর্ঘটনায় নয়, ইচ্ছাকৃতভাবে বন্ধ করুন।
# who is configured to start something?
grep -v '^#' /etc/default/openvpn
systemctl list-units 'openvpn*'
nmcli -g connection.secondaries connection show 'Work Wi-Fi'
# NetworkManager: attach the tunnel to the base link by UUID
TUNNEL=$(nmcli -g UUID connection show 'Corp Tunnel')
nmcli connection modify 'Work Wi-Fi' +connection.secondaries "$TUNNEL"
প্যাকেজকৃত পথটিই যদি অবসরে পাঠানো হয়, সঠিক ক্রমে করুন: AUTOSTART-কে none করুন, তৈরি হওয়া unit-গুলো যেন নতুন তালিকা নেয় সেজন্য systemctl daemon-reload চালান, তারপর যে টেমপ্লেট ইনস্ট্যান্স আর চান না সেটি বন্ধ করুন। রিলোড বাদ দিলে পুরোনো unit-গুলো সক্রিয় থাকে, ফলে মনে হয় পরিবর্তনের কোনো প্রভাব হয়নি।
ঝুলে যাওয়া স্টপ আলাদা সমস্যা, যার সীমিত উত্তর আছে। TimeoutStopSec SIGKILL পাঠানোর আগে systemd কতক্ষণ অপেক্ষা করবে তা সীমিত করে। ড্রপ-ইন ফাইলই এটি নির্ধারণের সঠিক জায়গা, কারণ প্যাকেজকৃত unit সম্পাদনা করলে পরের আপগ্রেডে পরিবর্তনটি হারায়।
আসলে কী চালু হলো যাচাই করুন
রিবুট করুন এবং কনফিগারেশন ফাইলে ভরসা না করে প্রমাণ পড়ুন। টানেলের মালিক unit-টি সক্রিয় অবস্থা এবং বুটের সঙ্গে মেলা শুরুর সময় দেখাবে, আর লগইনের আগেই VPN ইন্টারফেসটি থাকবে।
systemctl is-enabled openvpn-client@office
systemctl status openvpn-client@office --no-pager
nmcli -f GENERAL.STATE,connection.secondaries connection show 'Work Wi-Fi'
ip -brief link show tun0
এখানে আরও একটি পরীক্ষা দরকার: unit-এর ExecStart আপনি যে বাইনারি ভাবছেন সেটির দিকেই নির্দেশ করে কি না নিশ্চিত করুন। স্থানীয়ভাবে কম্পাইল করা ক্লায়েন্ট বা snap প্যাকেজের প্রায়ই স্পষ্ট পাথ বা snap run র্যাপার লাগে, কারণ systemd আপনার শেলের অনুসন্ধান ক্রম উত্তরাধিকার সূত্রে পায় না। command -v openvpn-এর সঙ্গে unit ফাইল মিলিয়ে দেখলে সেটি সেকেন্ডেই ঠিক হয়ে যায়।
বেছে নেওয়া মালিককে প্রোফাইল নামের পাশে মেশিনের নোটে লিখে রাখুন। পরবর্তী যে ব্যক্তি হারানো টানেল ডিবাগ করবে, সে তুলনাটি পুনরাবৃত্তি না করে ওই লাইন থেকেই শুরু করবে।