VirtualBox VPN ল্যাব: গেটওয়ে VM বনাম শুধু-হোস্ট নেটওয়ার্ক
একটি VirtualBox VPN ল্যাবের জন্য রাউটেড গেটওয়ে VM আর শুধু-হোস্ট সেগমেন্টের মধ্যে বেছে নিন, তারপর টানেল পড়ে গেলে গেস্টকে বন্ধ-ব্যর্থ করুন।
আপনার VPN ল্যাব কতটা যন্ত্রপাতি পাওয়ার যোগ্য, তা ঠিক করতে হবে। দুটি VirtualBox সেগমেন্টের মাঝে একটি রাউটেড গেটওয়ে VM ঠিকানা অনুবাদ, ফেরার পথ এবং যে ফায়ারওয়াল অবস্থানের পেছনে আসল ক্লায়েন্ট বসে থাকে তা পুনরুৎপাদন করে। একক শুধু-হোস্ট সেগমেন্ট আপনাকে একটি নিয়ন্ত্রিত দরজা দেয়, আর কিছু নয়। গেটওয়ে সংস্করণে খরচ তিনটি গেস্ট এবং আপনি যে রাউটিং টেবিল রক্ষণাবেক্ষণ করেন; শুধু-হোস্ট সংস্করণে খরচ একটি গেস্ট আর একটি নীতি। তিনটি প্রশ্ন এদের আলাদা করে, এবং তৃতীয়টি ঠিক করে আপনার পরীক্ষা আদৌ পাস করতে পারবে কি না।
কিছু ক্লোন করার আগে তিনটি প্রশ্নের উত্তর দিন
শুরু করুন VPN সার্ভারকে কী পর্যবেক্ষণ করতে হবে তা দিয়ে। যদি সার্ভারকে এমন একটি সোর্স ঠিকানা দেখতে হয় যা পরীক্ষার গেস্টের নয়, তবে তাদের মাঝে কিছু একটা অনুবাদ করতে হবে, এবং সেই কিছুটিকে হতে হবে আপনার নিয়ন্ত্রণে থাকা একটি রাউটার। শুধু-হোস্ট নেটওয়ার্কিং হোস্টকে গেস্টের সেগমেন্টে একটি অ্যাডাপ্টার দেয়, অনুবাদক নয়। এরপর গেস্টের যখন বাইরের কিছুতে পৌঁছাতে হয়, আপনি একটি NAT অ্যাডাপ্টার যুক্ত করেন, আর VirtualBox-এর নিজের NAT ইঞ্জিন আপনাকে না জিজ্ঞাসা করেই সোর্সটি আবার লেখে।
এরপর জিজ্ঞাসা করুন, গেস্ট কি টানেল ছাড়া অন্য কিছুতে পৌঁছাতে পারবে? সেই উত্তরই ইন্টারনাল বা শুধু-হোস্ট বেছে নেয়, এবং এটিই সেই প্রশ্ন যা বেশিরভাগ ল্যাব-লেখা এড়িয়ে যায়। সবশেষে জিজ্ঞাসা করুন, টানেল পড়ে গেলে কী হতে হবে, কারণ তা টপোলজি নয়, নীতি নির্ধারণ করে, আর যে ল্যাব কেবল সুখী পথটিই প্রমাণ করে, সে প্রায় কিছুই পরীক্ষা করেনি।
| What the test requires | Routed gateway VM | Host-only guest |
|---|---|---|
| Server sees a translated source address | Yes, from your own MASQUERADE rule | No, VirtualBox NAT does it instead |
| The guest has exactly one egress | Yes, while the second adapter faces the tunnel | Only until a NAT adapter is attached |
| Policy is testable during a tunnel failure | Rules live in one place | Rules live on each guest |
তিনটি ভূমিকাকে ইন্টারনাল নেটওয়ার্ক দিয়ে জুড়ুন
তিনটি গেস্ট ও দুটি নামকরা সেগমেন্ট ব্যবহার করুন, আর গেটওয়েই একমাত্র মেশিন যা দুটিতেই অ্যাডাপ্টার রাখে:
VBoxManage modifyvm lab-client --nic1 intnet --intnet1 WAN
VBoxManage modifyvm lab-server --nic1 intnet --intnet1 LAN
VBoxManage modifyvm lab-gw --nic1 intnet --intnet1 WAN --nic2 intnet --intnet2 LAN
ইন্টারনাল নেটওয়ার্কের জন্য আলাদা কোনো তৈরি করার ধাপ নেই। --intnet1-এ থাকা স্ট্রিংটিই সেগমেন্ট: দুটি মেশিন কেবল তখনই এটি ভাগ করে যখন নামটি হুবহু মেলে, আর হোস্টে কিছুই এর সাথে যুক্ত থাকে না। এই শেষ বৈশিষ্ট্যটিই ল্যাবটিকে পরিষ্কারভাবে পুনরাবৃত্তিযোগ্য করে, কারণ হোস্টের রুট, তার নিজের VPN ক্লায়েন্ট এবং তার ফায়ারওয়াল দুর্ঘটনাক্রমে গেস্টদের কাছে পৌঁছাতে পারে না। ইন্টারনাল সেগমেন্টে আপনি একটি যোগ না করলে DHCP সার্ভারও থাকে না, তাই স্ট্যাটিক ঠিকানাই সবচেয়ে ছোট পথ।
ক্লায়েন্টকে কেবল তার WAN ঠিকানা দিন, আর ডিফল্ট গেটওয়ে গেটওয়ের WAN ঠিকানার দিকে নির্দেশ করুক। সার্ভার একটি LAN ঠিকানা পায় এবং গেটওয়ের LAN ঠিকানাকে নিজের ডিফল্ট গেটওয়ে হিসেবে ব্যবহার করে। যে গেস্ট একই সেগমেন্টে দুটি ঠিকানা রাখে, বা অন্য সেগমেন্টে একটি বেওয়ারিশ রুট রাখে, তার রাউটারকে এড়িয়ে যাওয়ার একটি পথ আছে, এবং নিচের পরীক্ষাগুলো আপনাকে মিথ্যা বলবে।
VM-গুলোর নামের পাশে আমি একটি টেক্সট ফাইল রাখি যাতে চারটি ঠিকানা ও দুটি সেগমেন্টের নাম থাকে, এবং সেটি প্রতিটি শেলে পেস্ট করি। কয়েক সপ্তাহ পরে, যখন কোনো প্রোফাইল পরিবর্তন কিছু ভেঙে দেয়, তখন সেই ফাইলটিই প্রোফাইল ডিবাগ করা আর নিজের স্মৃতি ডিবাগ করার মধ্যে পার্থক্য।
যে সেগমেন্ট ফাঁস হওয়া চলবে না, তার জন্য ইন্টারনাল বা শুধু-হোস্ট বেছে নিন
শুধু-হোস্ট মোড হোস্টের নিজের উপর একটি ভার্চুয়াল অ্যাডাপ্টার তৈরি করে, সাধারণত vboxnet0, এবং হোস্টকে গেস্টের সেগমেন্টে একটি ঠিকানা দেয়। এটি প্রশাসনের জন্য সুবিধাজনক এবং বিচ্ছিন্নতা পরীক্ষার জন্য মারাত্মক, কারণ হোস্ট এখন সরাসরি গেস্টের কাছে পৌঁছাতে পারে এবং হোস্টের দিকের প্রতিটি সেবা সম্ভাব্য পথ হয়ে ওঠে। ইন্টারনাল মোডে হোস্ট অ্যাডাপ্টার একেবারেই থাকে না। নেটওয়ার্ক সেটিংস প্যানেলে দুটি মোড সহজেই মিশে যায়, তাই লেবেল নয়, নথিভুক্ত পার্থক্যটি দেখুন (VirtualBox নেটওয়ার্কিং বিবরণ পৃষ্ঠাটি দেখুন)।
যে গেস্টকে টানেল ব্যবহার করতেই হবে, তার জন্য ইন্টারনালই নিরাপদ ডিফল্ট, আর গেটওয়েই একমাত্র বেরোনোর পথ। যদি শুধু-হোস্ট রাখেন, তবে হোস্ট অ্যাডাপ্টারকে একটি ব্যবস্থাপনা পথ হিসেবে ধরুন এবং সেটি স্পষ্ট করে বলুন: হোস্ট গেস্টের কাছে পৌঁছাতে পারে, কিন্তু গেস্ট যেন হোস্টকে বেরোনোর পথ হিসেবে ব্যবহার করতে না পারে।
VBoxManage modifyvm lab-client --nic1 hostonly --hostonlyadapter1 vboxnet0
আপনি যে বিচ্ছিন্নতা প্রমাণ করতে পারেন, সেটিই আপনি কনফিগার করেছেন। একটি ইন্টারনাল অ্যাডাপ্টার, গেটওয়েতে ডিফল্ট রুট এবং কোনো NAT অ্যাডাপ্টার না থাকা গেস্টের গেটওয়ে এড়িয়ে যাওয়ার কোনো পথ নেই। শুধু-হোস্ট অ্যাডাপ্টার ও NAT অ্যাডাপ্টার থাকা গেস্টের দুটি পথ আছে, এবং তাদের মধ্যে কেবল একটি-ই সেই পথ যা আপনি পরীক্ষা করতে চেয়েছিলেন।
গেটওয়েতে রাউট ও অনুবাদ করুন, তারপর সেটি ব্যর্থ হলে বন্ধ হয়ে যাওয়ার ব্যবস্থা করুন
VirtualBox সেগমেন্টের মাঝে ফরওয়ার্ড করে না; গেস্টই করে। VPN সার্ভার VM গেটওয়ের পেছনে থাকলে, ফরওয়ার্ডিং চালু করুন এবং ক্লায়েন্টের ট্রাফিক সার্ভারের দিকে বেরোনোর সময় অনুবাদ করুন:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
এই নিয়মে সার্ভার ক্লায়েন্টের বদলে গেটওয়ের LAN ঠিকানা দেখে, আর ক্যারিয়ার NAT-এর পেছনে থাকা আসল ক্লায়েন্ট হেড-এন্ডের কাছে ঠিক এমনই দেখায়। sysctl মানটি /etc/sysctl.d/-এ এবং নিয়মটি ডিস্ট্রিবিউশন যে ফায়ারওয়াল সেবাই ব্যবহার করুক তাতে সংরক্ষণ করুন, নইলে একটি রিবুট ল্যাবটিকে চুপচাপ রাউটেড কিন্তু অনূদিত অবস্থায় ফিরিয়ে দেয়।
ফরওয়ার্ডিং মানেই অনুমোদন নয়। ACCEPT-এর ডিফল্ট FORWARD নীতির অধীনে, যে গেস্টের ডিফল্ট রুট গেটওয়ের দিকে নির্দেশ করে, সে রাউটিং টেবিল যে ইন্টারফেস বেছে নেয় তা দিয়েই বেরোয়, টানেল হোক বা না হোক। যদি গেটওয়ের প্যাকেজ ইনস্টলের জন্য একটি NAT অ্যাডাপ্টারও থাকে, তবে টানেল পড়ার মুহূর্তেই সেই অ্যাডাপ্টার একটি কাজ করা আনএনক্রিপ্টেড আউটলেট, এবং আপনার শুধু-VPN পরীক্ষা কখনোই শুধু-VPN পরীক্ষা ছিল না।
যখন সার্ভারটি দূরবর্তী এবং টানেলটি গেটওয়ে নিজেই শেষ করে, তখন একই সিদ্ধান্ত টানেল ইন্টারফেসের দিকে নির্দেশ করে, ইন্টারনেটে পৌঁছানো NIC-এর দিকে নয়:
iptables -P FORWARD DROP
iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT
iptables -A FORWARD -i tun0 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
টানেলের নিজস্ব বাইরের পরিবহন এবং আউট-অব-ব্যান্ড ব্যবস্থাপনা রুটকে ফরওয়ার্ড হওয়া ট্রাফিক থেকে আলাদা রাখুন। যদি গেটওয়ে মেরামতের একমাত্র উপায় হয় আপনি যে টানেলটি ডিবাগ করছেন তা দিয়ে যাওয়া, তবে ল্যাবটি একটি লকআউট অনুশীলনে পরিণত হয়। একটি সিরিয়াল কনসোল, একটি শুধু-হোস্ট ব্যবস্থাপনা অ্যাডাপ্টার, বা একটি জানা-ভালো অবস্থার স্ন্যাপশট হাতে ভাঙা রাউটার উদ্ধার করার চেয়ে সস্তা।
পথটি হোস্ট থেকে নয়, গেস্ট থেকে যাচাই করুন
বাইরের দিকে কাজ করুন। ক্লায়েন্ট গেটওয়ের WAN ঠিকানায় পৌঁছাতে পারে, তারপর গেটওয়ে হয়ে সার্ভারে পৌঁছাতে পারে, তারপর VPN পোর্টে একটি সংযোগ বেরিয়ে ফিরে আসে—এসব নিশ্চিত করুন। গেটওয়ের দুটি ইন্টারফেসেই ক্যাপচার দেখায় উত্তরটি আসছে কি না এবং ফেরার পথে বাদ পড়ছে কি না, যা কেবল ক্লায়েন্টে ক্যাপচার করে আলাদা করা যায় না:
tcpdump -ni eth0 udp port 1194
tcpdump -ni tun0 udp port 1194
তারপর বহির্গমন প্রমাণ করুন। গেস্ট থেকে একটি ঠিকানা-প্রতিফলন সেবাকে জিজ্ঞাসা করুন সে কোন সোর্স দেখছে এবং তা গেটওয়ের নিজের বহির্গমন ঠিকানার সাথে তুলনা করুন; উত্তরটি যদি হোস্টের ঠিকানার সাথে মেলে, তবে টানেলকে এড়িয়ে যাওয়ার একটি পথ আছে। গেস্ট আসলে কোন রিজলভার ব্যবহার করে তা দেখুন, এবং IPv6 আলাদাভাবে দেখুন, কারণ যে সেগমেন্টে IPv6 চালু কিন্তু টানেল কেবল IPv4 বহন করে, সেটি দুর্ঘটনায় নয়, নকশা অনুসারেই ফাঁস হয়।
সবশেষে, ইচ্ছাকৃতভাবে এটি ভেঙে দিন। টানেল থামান, বা তার বাইরের পোর্ট ব্লক করুন, এবং গেস্ট থেকে একটি নতুন সংযোগ খুলুন। এটি ব্যর্থ হতেই হবে, এবং কারণটি এমন হতে হবে যা আপনি নাম দিতে পারেন: কোনো রুট নেই, একটি প্রত্যাখ্যান নিয়ম আছে, বা রিজলভার মৃত। টানেল আবার চালু করুন এবং নেটওয়ার্ক পুনর্নির্মাণ ছাড়াই গেস্ট সেরে ওঠে কি না নিশ্চিত করুন। Hamachi বা ZeroTier-এর মতো মেশ VPN যদি ল্যাবটি ভাগ করে, তবে মনে রাখুন ব্রিজড অ্যাডাপ্টার মেশকে নয়, অ্যাডাপ্টারের নাম অনুসরণ করে, তাই ক্লায়েন্ট নিজের ভার্চুয়াল অ্যাডাপ্টার ইনস্টল করার পরে ব্রিজটি আবার নির্দেশ করতে হবে।
VBoxManage list bridgedifs
VBoxManage modifyvm lab-client --bridgeadapter1 <mesh-adapter-name>
গেস্টের টানেল হোস্টের সাথে ভাগ করলে সমস্যাটিই আয়নার মতো দেখা যায়। হোস্টের ডিফল্ট রুট গেস্টের দিকে নির্দেশ করা কাজ করে, গেস্টের ভেতরে একটি প্রক্সিও কাজ করে; হোস্টের মাধ্যমে NAT হোস্টের সৃষ্ট ট্রাফিকের জন্য গেস্টের টানেল বহন করে না। সেগমেন্টের নাম ও ফায়ারওয়াল নিয়ম এক জায়গায় সংরক্ষণ করুন, কাজ করা অবস্থার একটি স্ন্যাপশট নিন, এবং সার্ভার যে সোর্স ঠিকানা পর্যবেক্ষণ করেছে তা লিখে রাখুন। তখন পরবর্তী প্রোফাইল পরিবর্তনের খরচ পুনর্নির্মিত ল্যাবের বদলে একটি স্ক্রিপ্ট চালানো।