প্রতি প্রোফাইলের জন্য আলাদা প্রোব দিয়ে একাধিক vpnc টানেল চালু রাখুন
প্যাকেজের সাথে আসা রিকানেক্ট স্ক্রিপ্টটি একটি টানেল ধরে নেয়। প্রতিটি vpnc প্রোফাইলকে তার নিজস্ব পোর্ট দিন, সত্যিকারের একটি পরিষেবা প্রোব করুন এবং প্রোবগুলোকে একটি নির্দিষ্ট ক্রমে শৃঙ্খলাবদ্ধ করুন।
একটি vpnc প্রোফাইল রোমিংয়ের পর পরিষ্কারভাবে পুনরায় সংযুক্ত হয়; তিনটি পালাক্রমে একে অপরের সকেট, রুট ও রিজলভার অবস্থা নষ্ট করে। প্যাকেজের সাথে আসা রিকানেক্ট স্ক্রিপ্টটি একটি টানেলের জন্য লেখা, তাই যেকোনো একটি ডাউন হলেই এটি প্রতিটি প্রোফাইল পুনরায় চালু করে। এটি ঠিক করতে তিনটি জিনিস দরকার: আলাদা লোকাল পোর্ট, প্রতি প্রোফাইলে সত্যিকারের একটি পরিষেবা পরীক্ষা করে এমন প্রোব, এবং একটি সুবিন্যস্ত শৃঙ্খল যা কখনোই একসাথে দুটি সংযোগ চালায় না।
প্রতিটি প্রোফাইলকে তার নিজস্ব লোকাল পোর্ট দিন
ডিফল্ট লোকাল পোর্টে রাখা vpnc প্রোফাইল ইতিমধ্যে চলা প্রোফাইলের সাথে প্রতিযোগিতা করে। প্রথমটি পোর্ট ধরে রাখায় দ্বিতীয় সংযোগটি ব্যর্থ হয়, আর লগের লাইনটি লোকাল সংঘর্ষের বদলে গেটওয়ে সমস্যার মতো দেখায়। বরং প্রতিটি প্রোফাইল ফাইলের জন্য একটি লাইন দিন:
Local Port 0শূন্য দিলে কার্নেল একটি ক্ষণস্থায়ী পোর্ট বেছে নেয়, তাই দুটি প্রোফাইল একসাথে প্রতিষ্ঠিত হতে পারে। প্রতিটি ফাইলের নাম তার সেবা করা গেটওয়ে ও গ্রুপ অনুযায়ী দিন, এটি কেবল root-এর জন্য পাঠযোগ্য রাখুন, এবং সর্বদা ভাগ করা ডিফল্টের বদলে মিলে যাওয়া প্রোফাইল দিয়ে সংযুক্ত হন। কোনো একটি প্রোফাইলের নাম বদলানোর পর একটি ভাগ করা ডিফল্ট ফাইলই স্ক্রিপ্টকে ভুল টানেলে পুনরায় সংযুক্ত করার উপায়।
প্রোফাইল ফাইলে প্রমাণপত্র থাকে, তাই অনুমতি নকশার অংশ, তত্ত্বাবধানের নয়। যে ফাইলটি /etc/vpnc-এর অধীনে সবার পাঠযোগ্য, সেটি গ্রুপের গোপনীয়তা প্রতিটি লোকাল ব্যবহারকারীর হাতে দেয়। মোড 0600 রাখুন এবং মালিক রাখুন root, আর স্ক্রিপ্টগুলোকে গোপনীয়তা আর্গুমেন্টে কপি না করে root হিসেবে ফাইলটি পড়তে দিন। সে কারণেই একটি প্রোব স্ক্রিপ্টের কখনোই ফাইলের বিষয়বস্তু লগে ছাপা উচিত নয়।
প্রতিটি প্রোফাইলে একটি পরিষেবা প্রোব করুন, টানেলের ঠিকানা নয়
টানেলের নিজস্ব ঠিকানায় ইকো অনুরোধ মূলত ইন্টারফেসটি বিদ্যমান — এইটুকুই প্রমাণ করে। এটি বলে না যে তার পেছনের হোস্টটি এখনো সেই অ্যাপ্লিকেশনটিতে পৌঁছাতে পারে যা টানেলটিকে ন্যায্যতা দেয়। ইন্টারফেস চালু থাকতে পারে, অথচ তার পরের রুট ইতিমধ্যে চলে গেছে।
প্রতিটি প্রোফাইলে একটি পরিষেবা প্রোব করুন সংক্ষিপ্ত TCP টাইমআউট দিয়ে, এবং কেবল সেই প্রোফাইল পুনরায় সংযুক্ত করুন যার প্রোব ব্যর্থ হয়েছে। দুই সেকেন্ড মৃত পথকে ধীর পথ থেকে আলাদা করে, আর TCP প্রোব পথের কোথাও ICMP অনুমোদিত হওয়ার উপর নির্ভর করে না। প্রোফাইলগুলোর মধ্যে কেবল লক্ষ্য ও কনফিগের নাম বদলান:
#!/bin/bash
set -eu
if ! nc -z -w 2 10.63.7.20 8443; then
/usr/sbin/vpnc-connect ops.conf
fiএটি /usr/local/bin/ensure-vpn-ops.sh হিসেবে সংরক্ষণ করুন, চালনাযোগ্য করুন, এবং কেবল প্রোবের লক্ষ্য ও কনফিগের নাম বদলে প্রতিটি প্রোফাইলের জন্য পুনরাবৃত্তি করুন। যে প্রোব প্রোটোকলের প্রশ্নের উত্তর দেয়, সে এমন গেটওয়ে পেরিয়ে টিকে থাকে যেগুলো ইকো ফেলে দেয় কিন্তু ব্যবহারকারীদের কাছে গুরুত্বপূর্ণ পরিষেবা এখনো প্রেরণ করে।
প্রোবগুলোকে শৃঙ্খলাবদ্ধ করুন যাতে তারা কখনো প্রতিযোগিতা না করে
প্যাকেজের রিকানেক্ট স্ক্রিপ্ট আপনার প্রোবগুলোকে ক্রমান্বয়ে ডাকতে পারে, এবং ক্রমটাই মূল কথা। একসাথে চলা দুটি vpnc-connect কল রাউটিং টেবিল এমন ক্রমে পুনর্লিখন করে যা কেউ নিয়ন্ত্রণ করে না, আর এভাবেই একটি সুস্থ প্রোফাইল তার রুট হারায়।
কলগুলো ব্যাকগ্রাউন্ডে না রেখে চালান, অন্তর্নিহিত ইন্টারফেসের জন্য সংক্ষিপ্ত স্থিতি বিলম্ব দিন, এবং root-এর cron টেবিল থেকে শৃঙ্খলটি নির্ধারণ করুন, কারণ কেবল root-ই টানেলের রুট পুনর্লিখন করতে পারে:
#!/bin/bash
sleep 20
/usr/local/bin/ensure-vpn-ops.sh
/usr/local/bin/ensure-vpn-lab.shবুট স্ক্রিপ্ট ও cron এন্ট্রির মধ্যে ক্রম অভিন্ন রাখুন, কারণ বুটের সময় ভিন্ন ক্রমে চলা শৃঙ্খল কার্যত ভিন্ন একটি প্রোগ্রাম। যখন একটি প্রোফাইল অন্যটির রুটের উপর নির্ভর করে, নির্ভরতাটি আগে রাখুন এবং পরের প্রোবটি নিরীহভাবে ব্যর্থ হতে দিন, যখন আগের টানেল এখনো উঠছে।
লগ দেখুন, তারপর ইচ্ছাকৃতভাবে একটি ভাঙুন
প্রতি রানে একটি লাইন লগ করুন — প্রোফাইল, প্রোবের লক্ষ্য, ফলাফল ও নেওয়া পদক্ষেপ। এটি ছাড়া প্রতি মিনিটে দোলা দেওয়া টানেল দেখতে ঠিক তেমনই লাগে যেন কখনো পড়েনি, আর প্রোবের বাগ গেটওয়ে বিভ্রাট থেকে আলাদা করা যায় না। লগটি এও প্রমাণ করে যে শৃঙ্খল কেবল ব্যর্থ প্রোফাইলটিকেই স্পর্শ করেছে। এটি এমন জায়গায় লিখুন যা রিবুটেও থাকে, নইলে প্রমাণ প্রক্রিয়ার সাথে চলে যায়।
তারপর ইচ্ছাকৃতভাবে একটি টানেল ভাঙুন এবং কী ঘটে দেখুন। একটি মাত্র প্রোফাইল থামান এবং নিশ্চিত করুন কোন প্রক্রিয়া ও রুট এখনো আছে:
pgrep -a vpnc
ip -4 route show | grep -E '10[.]63|10[.]90'
tail -n 5 /var/log/ensure-vpn.logকেবল থামানো প্রোফাইলটিই পুনরায় সংযুক্ত হওয়া উচিত, আর বাকি সেশনগুলো তাদের প্রক্রিয়া ও রুট দুটোই ধরে রাখা উচিত। যদি দুটি প্রোফাইল পুনরায় চালু হয়, তবে আপনার শৃঙ্খল কোথাও সমান্তরালে চলছে যা আপনি আশা করেননি।
জাগরূক প্রহরী যা করা উচিত নয়
যে প্রহরী যেকোনো ব্যর্থতায় সবকিছু পুনরায় চালু করে, সে পরীক্ষার সময় সুস্থ দেখায় এবং রক্ষণাবেক্ষণ উইন্ডোতে বিভ্রাট ঘটায়। প্রোফাইল অনুযায়ী পুনরায় চালু করুন, কখনো বৈশ্বিকভাবে নয়।
যখন গেটওয়ে একই প্রোটোকলের জন্য রক্ষণাবেক্ষণকৃত ক্লায়েন্ট দেয়, তখন সেটিকে প্রাধান্য দিন, এবং কখনো স্ক্রিপ্টে পাসওয়ার্ড হার্ডকোড করবেন না বা কমান্ড লাইনে তা পাঠাবেন না, কারণ প্রোফাইল ফাইলেই গোপনীয়তা রয়েছে। টানেল ওঠার পর যদি কোনো কাজ সাধারণ ব্যবহারকারী হিসেবে চালাতে হয়, তবে পুরো শৃঙ্খল সেই অ্যাকাউন্টে চালানোর বদলে স্ক্রিপ্টের ভেতর থেকেই বিশেষাধিকার কমান। সবশেষে, পুনঃসংযোগের পর রুটগুলো আবার পড়ুন, কারণ একটি প্রোফাইল ভিন্ন বরাদ্দকৃত ঠিকানা নিয়ে ফিরে আসতে পারে এবং পুরোনো একটি রুট রেখে যেতে পারে যা টানেলের ঠিকানায় লক্ষ্য করা কোনো প্রোবই কখনো খেয়াল করবে না।