একটি Pi, দুটি OpenVPN ইনস্ট্যান্স: প্রতিটি ইউনিট কী পড়ে
একই Pi-তে দুটি OpenVPN ডিমন আলাদা কনফিগ ফাইল পড়ে এবং আলাদা হুক দিয়ে বের হয়। প্রতিটি ইনস্ট্যান্স ম্যাপ করুন, তারপর পেলোডের পথ আলাদাভাবে পরীক্ষা করুন।
প্রোফাইল স্পর্শ করার আগে OpenVPN প্রসেসগুলো গুনুন। যে Pi রোমিং ব্যবহারকারীদের গ্রহণ করে এবং একই সঙ্গে একটি আপস্ট্রিম সেবায় ডায়াল করে, সেটি দুটি ডিমন চালায়, আর তাদের প্রতিটি আপনার টাইপ করা ইনস্ট্যান্স নাম অনুযায়ী বাছাই করা কনফিগারেশন ফাইল পড়ে। এরপর প্যাকেজ করা টেমপ্লেট প্রতিটি ডিমনকে তার নিজের ওয়ার্কিং ডিরেক্টরি, নিজের রানটাইম স্টেটাস ফাইল এবং নিজের টানেল ডিভাইস দেয়। এই ভাগটা ভুল করলে আপনি একটি সন্ধ্যা ব্যয় করবেন এমন একটি ফাইলে সঠিক সেটিং বদলাতে, যা চলমান প্রসেস কখনও খোলে না।
প্রতিটি ইনস্ট্যান্স নাম নিজের ফাইল বেছে নেয়
OpenVPN 2.6-এর সঙ্গে আসা ইউনিট ফাইলগুলোতে স্টার্ট আর্গুমেন্টে একটি ইনস্ট্যান্স প্লেসহোল্ডার থাকে, যা @ চিহ্নের পরের লেখা থেকে পূরণ হয়। সার্ভার টেমপ্লেট সার্ভার কনফিগারেশন ডিরেক্টরি থেকে চলে এবং তার আর্গুমেন্ট %i.conf এর সঙ্গে মিলিয়ে দেখে, আর ক্লায়েন্ট টেমপ্লেট একই কাজ ক্লায়েন্ট ডিরেক্টরি থেকে করে। তাই [email protected] পড়ে admits.conf সার্ভার ডিরেক্টরিতে এবং [email protected] পড়ে uplink.conf ক্লায়েন্ট ডিরেক্টরিতে, এবং দুটি নামের কোনওটিরই অন্য ডিরেক্টরিতে কোনও অর্থ নেই।
প্যাকেজটি আপস্ট্রিম ডিফল্ট রেখেছে ধরে না নিয়ে মেশিনেই ম্যাপিংটি নিশ্চিত করুন। ডিস্ট্রিবিউশনের ড্রপ-ইন ওয়ার্কিং ডিরেক্টরি বা কনফিগ আর্গুমেন্ট সরাসরি বদলে দিতে পারে।
systemctl cat [email protected]
systemctl cat [email protected]সেই আউটপুটে WorkingDirectory লাইন এবং কনফিগ আর্গুমেন্ট পড়ুন, কারণ সক্রিয় ইউনিটই একমাত্র জিনিস যা ঠিক করে কোন ফাইল লোড হবে। যে ড্রপ-ইন --config এর সঙ্গে ExecStart যোগ করে, সেটি টেমপ্লেটের পথ ঠিক দেখালেও টেমপ্লেটকে হারিয়ে দেয়। স্থানীয় ওভাররাইড আছে কিনা জানতে চাইলে ফ্র্যাগমেন্ট ও ড্রপ-ইনের পথ চান। যদি দুটি রোলই একটি ফাইলে মিলে যায়, তাহলে আপনার একটি প্রসেস একই সঙ্গে সার্ভার ও ক্লায়েন্ট হতে চাইছে, আর সেই ফাইলের পরের অপশনটিই নিঃশব্দে জিতে যায়।
স্থানীয় ট্রান্সপোর্ট ও ফরওয়ার্ড করা পেলোড আলাদা হুকে পড়ে
সার্ভারের প্রতিটি রোমিং ব্যবহারকারীর সঙ্গে এনক্রিপ্টেড সংযোগ Pi-র ভেতরেই তৈরি হয়, তাই তার বাইরের উত্তরগুলো স্থানীয় আউটপুট হুক দিয়ে বের হয়। ক্লায়েন্টের আপস্ট্রিম পিয়ারের সঙ্গে সংযোগও স্থানীয়ভাবে তৈরি আউটপুট, যদিও তা দূরবর্তী নেটওয়ার্কে পৌঁছায়। ফরওয়ার্ড করা পেলোড তৃতীয় শ্রেণি, আর কার্নেল তা মেলায় কেবল প্যাকেটের জন্য আউটবাউন্ড ডিভাইস বেছে নেওয়ার পরেই।
| Flow | Hook that sees it | What to inspect |
|---|---|---|
| Roaming user handshakes to the server | Local input and local output | Listener socket, bind address, rule admitting the UDP port |
| User payload leaving through the upstream tunnel | Forward | IPv4 forwarding switch, selected route, permission rule, any translation |
| Pi's own connection to the upstream peer | Local output | Underlay route to the provider endpoint, not the tunnel route |
ফরওয়ার্ড চেইনের ভেতরে আউটবাউন্ড ইন্টারফেস মেলানো একটি নিয়ম রাউটিং আগেই যে ইন্টারফেসে প্যাকেট বরাদ্দ করেছে, সেটি অনুমোদন বা বাতিল করতে পারে, কিন্তু ইন্টারফেস কখনও বেছে নেয় না। যখন একটি হোস্ট একটি টানেল শেষ করে অন্যটি শুরু করে, তখন ব্যবহারকারীর পেলোড আপস্ট্রিম টানেলে পাঠানোর নীতি আর Pi-র নিজের এনক্রিপ্টেড উত্তর রক্ষা করার নীতি আলাদা সিদ্ধান্ত। এরা দৈবাৎ একই ফিজিক্যাল নিক-এ পড়ে, তাই এদের গুলিয়ে ফেলা হয়।
এই পার্থক্যই একটি সাধারণ অর্ধ-ব্যর্থতা ব্যাখ্যা করে। ব্যবহারকারীরা সংযোগ করে, হ্যান্ডশেক সম্পন্ন হয়, তবুও তাদের ট্রাফিক ভুল পথে বের হয়, কারণ হ্যান্ডশেক ছিল স্থানীয় আর পেলোড ছিল ফরওয়ার্ড, এবং দুটির মধ্যে কেবল একটি পরীক্ষা করা হয়েছিল।
আমদানি করা রুট আপনার ব্যবহারকারীদের উত্তর গিলে ফেলতে পারে
ক্লায়েন্ট প্রোফাইলের নিরাপত্তা সেটিং ঠিক করে আপস্ট্রিম Pi-র রাউটিং টেবিলে কী ঠেলে দিতে পারে, আর বিস্তৃত রিডাইরেক্ট হল সেই অপশন যা একটি কাজ করা দ্বৈত-রোল হোস্টকে ভাঙা হোস্টে পরিণত করে। যদি ঠেলা রুটটি রোমিং ব্যবহারকারীদের পাবলিক ঠিকানা ঢেকে দেয়, তাহলে সার্ভার তাদের উদ্দেশে যে উত্তর তৈরি করে তা আন্ডারলে দিয়ে বের না হয়ে নতুন রুট ধরে আপস্ট্রিম টানেলে যেতে পারে। মানুষ প্রায়ই দেখে যে প্রদানকারীর টানেল এখনও কাজ করে এবং সেখানেই থেমে যায়, কারণ ওই ট্রাফিক টানেলের নিজের ট্রান্সপোর্ট এবং বাকি সবকিছু খারাপ আচরণ করলেও তা প্রবাহিত হতে থাকে।
উৎস বা মার্ক ভিত্তিক নীতি হল দুটি প্রবাহকে আলাদা রাখার উপায়। OpenVPN-এর Linux মার্ক অপশন ডিমনের নিজের এনক্রিপ্টেড প্যাকেটে ফায়ারওয়াল মার্ক বসায়, যা পরে একটি রাউটিং নিয়ম নির্দিষ্ট টেবিলে পাঠাতে পারে। উৎস ঠিকানা ঠিক ততটাই ভালো কাজ করে যখন সার্ভারের বাইরের উত্তর সবসময় একটি আন্ডারলে ঠিকানা থেকে বের হয়। দুই পদ্ধতিরই যে টেবিল বেছে নেয় তাতে বৈধ রুট আর প্রদানকারীর এন্ডপয়েন্টের জন্য ব্যতিক্রম দরকার, নইলে টানেল নিজেই উঠতে থেমে যায়।
কোনও নিয়ম লেখার আগে কার্নেলকে জিজ্ঞাসা করুন উত্তরটি আসলে কোন পথে যাবে। নিচের ঠিকানাগুলো Pi-র আন্ডারলে ঠিকানা ও একজন রোমিং ব্যবহারকারীর পাবলিক ঠিকানার প্লেসহোল্ডার।
ip rule show
ip route get 198.51.100.7 from 192.0.2.10ভাগটা যাচাই করুন, তারপর একবারে একটি রোল বন্ধ করুন
তিনটি প্রবাহ আলাদাভাবে পরীক্ষা করুন, কারণ একটি কাজ করা হ্যান্ডশেক বাকি দুটি সম্পর্কে কিছু প্রমাণ করে না। একটি নতুন ইনবাউন্ড সংযোগ গ্রহণ করুন, একটি অনুমোদিত অ্যাপ্লিকেশন আপস্ট্রিম এক্সিট দিয়ে পাঠান, আর নিশ্চিত করুন দুটি প্রসেসই নিজেদের পিয়ারে পৌঁছাচ্ছে।
তারপর ক্লায়েন্ট রোল বন্ধ করুন এবং সার্ভার রোল কী ধরে রাখে দেখুন। একটি ইনস্ট্যান্সের জন্য বানানো কিন্তু দুটিতেই প্রয়োগ করা রুট বা মার্ক নিয়ম খুঁজে বের করার সবচেয়ে সস্তা উপায় এটি।
systemctl stop [email protected]
systemctl status [email protected] --no-pager
ss -lunp | grep openvpn
journalctl -u [email protected] -n 20 --no-pagerআপনি যা দেখতে চান তা হল লিসেনার এখনও বাঁধা, টানেল ডিভাইস এখনও উপস্থিত, আর ক্লায়েন্ট রোল বন্ধ থাকা অবস্থায় লগ নতুন ত্রুটিমুক্ত। যদি ক্লায়েন্ট বন্ধ করলে সার্ভারের বিদ্যমান ব্যবহারকারীদের প্রতি উত্তরও কেটে যায়, তবে দুটি রোল এমন কিছু ভাগ করছে যা একটিতেই সীমাবদ্ধ থাকা উচিত ছিল। কোন ইনস্ট্যান্স, কোন কনফিগ ফাইল আর কোন প্রবাহ-মালিক প্রতিটি পরিবর্তনে ছোঁয়া লেগেছে তা লিখে রাখুন, কারণ এই হোস্ট ডিবাগ করা পরের ব্যক্তি তা না হলে একই আবিষ্কার শূন্য থেকে আবার করবে।