যে Raspberry Pi-কে শুধু নিজের আউটবাউন্ড ট্রাফিক রক্ষা করতে হয়, তার সামনে দুটি বাস্তবসম্মত নকশা আছে: নেটওয়ার্ক ম্যানেজারকে টানেলের মালিক হতে দেওয়া, অথবা এমন একটি স্ক্রিপ্ট রাখা যা তার মালিক। দুটোই ট্রাফিক বহন করতে পারে। তারা ভিন্ন জায়গায় ব্যর্থ হয়, আর রাত দুইটায় দূর থেকে যে ব্যর্থতা আপনি নির্ণয় করতে পারেন, সেটিই বেছে নেওয়ার যোগ্য। মালিকানা দিয়ে, IPv6 ও DNS জড়িত হলে পূর্ণ টানেলের অর্থ কী দিয়ে, এবং টানেল পড়ে যাওয়ার মুহূর্তে কী ঘটে তা দিয়ে তাদের তুলনা করুন।

একটি টানেলের দুই মালিক

নকশা A হলো সিস্টেমের নেটওয়ার্ক ম্যানেজারের ভেতরের একটি প্রোফাইল: আমদানি করা OpenVPN প্রোফাইল বা নেটিভ WireGuard সংযোগ, যা বুটের সময় Ethernet ও Wi-Fi তোলা একই সার্ভিস দিয়ে সক্রিয় হয়। নকশা B হলো আপনার নিজের একটি ইউনিট, যা ক্লায়েন্টকে সরাসরি চালায়, রিজলভার কনফিগারেশন সম্পাদনা করে এবং নিজের রুট ও ফায়ারওয়াল নিয়ম ইনস্টল করে। দুটোই বৈধ নকশা; পার্থক্য হলো রাউটিং টেবিল বদলানোর অনুমতি কার আছে।

ব্যর্থতাগুলো আলাদা, কারণ মালিকরা আলাদা। A-তে, যে প্রোফাইল সক্রিয় হয় না, সেটি ইন্টারফেস চালু রেখে টানেল বন্ধ রাখে, আর ম্যানেজারের লগ কারণ বলে দেয়। B-তে, যে স্ক্রিপ্ট আধা-সফল হয়, সেটি এমন রুট রেখে যায় যা সেগুলো তৈরি করা প্রসেসের পরেও টিকে থাকে। দুটোই চালানো সবচেয়ে খারাপ পরিণতি: দুই প্রসেস ডিফল্ট রুট লিখছে, বুটের সময় দুই রিজলভার সম্পাদনা প্রতিযোগিতা করছে, আর ঘোরানোর জন্য দুই সেট গোপন তথ্য।

প্রতি টানেলে একজন মালিক বেছে নিন এবং কিছু পরীক্ষা করার আগে অন্যটি নিষ্ক্রিয় করুন। দুই মালিক মানে টানেল চালু থাকলেও কিছু রিজলভ না হলে দেখার দুটি জায়গা। এই একটি নিয়মই Pi VPN আলোচনায় বর্ণিত বেশিরভাগ বিভ্রান্তিকর অবস্থা প্রতিরোধ করে।

আমদানি কী তৈরি করে, আর কী করে না

Raspberry Pi OS Bookworm ও পরের সংস্করণে ডিফল্ট নেটওয়ার্ক কনফিগারেশন টুল হলো NetworkManager, তাই প্রোফাইলই ক্লায়েন্ট টানেলের স্বাভাবিক ঠিকানা। আমদানির জন্য মানানসই প্লাগইন ইনস্টল থাকা দরকার; তা ছাড়া আমদানি অসমর্থিত সংযোগ ধরন সম্পর্কে বার্তা দিয়ে ব্যর্থ হয়, যা থেমে প্লাগইন ইনস্টল করার সৎ সংকেত।

nmcli connection import type openvpn file ./provider.ovpn
nmcli connection show
nmcli --ask connection up id provider-name

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

--ask দিয়ে সক্রিয় করা শেয়ার করা মেশিনে শেল ইতিহাসের বাইরে একটি পাসফ্রেজ রাখে। অব্যবহৃত Pi-এর জন্য শেষে আপনি চাইবেন প্রোফাইলটি বুটে উঠুক, যা হাতে একবার তোলার থেকে আলাদা সিদ্ধান্ত।

পূর্ণ টানেল, দুই নকশার তুলনায়

পূর্ণ টানেল রুট সম্পর্কে একটি দাবি, অভিপ্রায় সম্পর্কে নয়, আর দুই নকশা তা ভিন্নভাবে প্রকাশ করে। প্রোফাইল পদ্ধতি ম্যানেজারকে ডিফল্ট রুট ও তার রিজলভার সেটিংস ইনস্টল করতে বলে; স্ক্রিপ্ট পদ্ধতি স্ক্রিপ্ট যা বলে তাই করে, কিছু না করাও সহ। কোনো নকশাই না বললে IPv6 ঢাকে না, আর অস্পৃষ্ট IPv6 ডিফল্ট রুট IPv4 নিখুঁত দেখালেও আনন্দের সঙ্গে টানেলের বাইরে ট্রাফিক বহন করবে।

ip -4 route get 198.51.100.23
ip -6 route show default
resolvectl query example.org

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

প্রদানকারীর নির্দেশনা পূর্ণ টানেলের প্রতিশ্রুতি দিলেও IPv6 ডিফল্ট রুট টিকে থাকলে Pi ফাঁস করছে। আপলিংকে IPv6 নিষ্ক্রিয় করুন বা প্রোফাইলকে তা দাবি করতে বলুন, এবং পরে আবিষ্কার করার বদলে সচেতনভাবে সিদ্ধান্ত নিন।

খোলা ব্যর্থতা বনাম বন্ধ ব্যর্থতা

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

বন্ধ ব্যর্থতা টানেল বন্ধ থাকলে আপনার দূরবর্তী প্রবেশাধিকার কেড়ে নেয়, তাই ব্যবস্থাপনা পথের জন্য সচেতন ব্যতিক্রম দরকার। একটি উপায় হলো এমন নিয়ম যা টানেলের বাইরে কেবল VPN পিয়ারের ঠিকানা অনুমোদন করে:

sudo nft add table inet vpnkill
sudo nft 'add chain inet vpnkill out { type filter hook output priority 0; policy accept; }'
sudo nft add rule inet vpnkill out oifname != "tun0" ip daddr != 203.0.113.24 reject

পরিচালন ব্যয় সৎভাবে তুলনা করুন। প্রোফাইল সাধারণত এই নিয়ম প্রকাশ করতে পারে না, তাই বন্ধ ব্যর্থতা আপনাকে স্ক্রিপ্ট নকশার দিকে বা টানেল থেকে স্বাধীনভাবে নিয়মটি ইনস্টল করা ছোট ইউনিটের দিকে ঠেলে দেয়। যেভাবেই হোক, এক সপ্তাহ প্রত্যাখ্যানগুলো লগ করুন: নীরব প্রত্যাখ্যান ভাঙা সার্ভিসের মতোই দেখায়, আর ব্যবহারকারী জানালে যে একটি সাইট লোড হওয়া বন্ধ করেছে, তখন কাউন্টারটি আপনার দরকার হবে।

স্ক্রিনহীন Pi-এর জন্য বাছাই

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

তাদের মধ্যে স্থানান্তর মূলত ক্রমের বিষয়: পুরোনো মালিক নিষ্ক্রিয় করুন, কোনো বাসি রুট বা রিজলভার এন্ট্রি টিকে নেই নিশ্চিত করুন, তারপর নতুনটি সক্রিয় করে দুইবার রিবুট করুন। একবার রিবুট এমন এক রেস লুকাতে পারে যা দ্বিতীয়বার প্রকাশ করে। টানেল নয়, Pi পরীক্ষা করে শেষ করুন: একটি নাম রিজলভ করুন, IPv4 দিয়ে কিছু আনুন, রাখলে IPv6 দিয়েও আনুন, তারপর টানেল ফেলে দিন এবং আপনি যে আচরণ বেছেছিলেন তা সত্যিই ঘটছে নিশ্চিত করুন। ip link-এ একটি ইন্টারফেস পরীক্ষার শুরু, শেষ নয়।

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