host-only নেটওয়ার্কের VM ট্র্যাফিক TUN OpenVPN সার্ভার দিয়ে রাউট করুন
টানেল এবং host-only প্রিফিক্স আলাদা রাখুন, গেস্ট রুট পুশ করুন, তারপর প্রতিটি ভার্চুয়াল মেশিনকে হোস্টের মধ্য দিয়ে একটি সুচিন্তিত ফিরতি পথ দিন।
host-only অ্যাডাপ্টার একটি স্থানীয় ভার্চুয়াল নেটওয়ার্ক তৈরি করে, আর রাউট করা TUN টানেল ঠিকানাগুলোর মধ্যে IP প্যাকেট বহন করে। কোনোটিই অন্যটির ব্রিজ নয়, তাই একটি কার্যকর কনফিগারেশনকে বলতে হবে কে ফরওয়ার্ড করে এবং ফিরতি রুট কার। এই দুটি নির্ধারণ ভুল করলে গেস্ট টানেলকে এমন উৎস দিয়ে উত্তর দেয় যা টানেল ক্লায়েন্ট কখনো চায়নি। নিচের ডিজাইন দুটি প্রিফিক্স আলাদা রাখে এবং ফিরতি পথ স্পষ্ট করে।
দুটি নেটওয়ার্ক, দুটি প্রিফিক্স
টানেল পুল ও host-only নেটওয়ার্ককে আলাদা প্রিফিক্স দিন এবং একটিকে অন্যটির জন্য কখনো পুনরায় ব্যবহার করবেন না। এই উদাহরণে VPN পুল 10.44.0.0/24 এবং host-only নেটওয়ার্ক 192.168.99.0/24, হোস্ট 192.168.99.1-এ এবং একটি গেস্ট 192.168.99.20-এ। একই প্রিফিক্স TUN ডিভাইস ও host-only অ্যাডাপ্টার দুটিতেই দিলে সেগুলো যুক্ত হয় না। এটি একই ঠিকানা পরিসরে দুটি দাবি তৈরি করে, আর রাউটিং টেবিল তখন যে দাবিটি দৈবক্রমে রেখেছে তার পক্ষে উত্তর দেয়।
host-only অ্যাডাপ্টার হোস্টে এবং গেস্টের ভেতরে বিদ্যমান, এবং এর নিজে থেকে মেশিনের বাইরে যাওয়ার কোনো পথ নেই। ব্রিজড ও NAT সংযোগের এক্সপোজার আলাদা, এবং একটি গেস্ট সেবা পৌঁছাতে ব্রিজড মোডে যাওয়া কোনো শর্ত নয়।
হোস্ট ইতিমধ্যে পথ ধরে আছে
কিছু যোগ করার আগে দেখুন কী আছে। হোস্টের host-only নেটওয়ার্কে একটি ইন্টারফেস এবং সেই প্রিফিক্সের একটি রুট আছে, দুটোই অ্যাডাপ্টার ওঠার সময় তৈরি হয়েছে।
ip -br addr show
ip route show 192.168.99.0/24
sysctl net.ipv4.ip_forward
তৃতীয় লাইনটি হলো সেই ব্যবস্থা যা হোস্টকে একটি হপে পরিণত করে। এটি ছাড়া টানেল থেকে আসা প্যাকেট এমন নেটওয়ার্কে ঠিকানা পায় যা হোস্টে পৌঁছানো যায় কিন্তু ফরওয়ার্ড করা হবে না। ফরওয়ার্ডিং প্রয়োজনীয়, যথেষ্ট নয়। ফিল্টার নীতি তখনো ঠিক করে টানেল ইন্টারফেস ও host-only ইন্টারফেসের মধ্যে নির্দিষ্ট ফ্লো অনুমোদিত কি না, আর সেই সিদ্ধান্ত লিখিত থাকা উচিত, কেউ না পড়া ডিফল্ট নীতিতে নয়।
রুট পুশ করুন, তারপর তা যা ছুঁয়েছে তা ফিল্টার করুন
পুশ করা রুট গ্রহণ করা ক্লায়েন্টদের সার্ভার host-only প্রিফিক্স দিতে পারে, যা টানেলের পিছনে অন্য যেকোনো সাবনেটের জন্য ব্যবহৃত একই ব্যবস্থা।
push "route 192.168.99.0 255.255.255.0"
iptables -A FORWARD -i tun0 -o vboxnet0 -d 192.168.99.20 -p tcp --dport 5432 -j ACCEPT
iptables -A FORWARD -i vboxnet0 -o tun0 -s 192.168.99.20 -p tcp --sport 5432 -m conntrack --ctstate ESTABLISHED -j ACCEPT
এই দুটি নিয়ম এক দিকে একটি সেবা এবং তার উত্তর অনুমোদন করে। পুরো প্রিফিক্সে পৌঁছানো একটি রুট আর একটি পোর্ট অনুমোদন করা ফিল্টার একটি সচেতন সমন্বয়; রুটের সঙ্গে শর্তহীন গ্রহণ হলো ল্যাব সেবাকে উন্মোচিত সেবায় পরিণত করার উপায়। পুশ করা রুটও কোনো অনুমোদন নয়। ক্লায়েন্ট তা গ্রহণ করে, হোস্ট তা ফরওয়ার্ড করে, আর গেস্ট ফায়ারওয়াল ও সেবাটি নিজেই তখনো মত দেয়।
গেস্টের ফেরার পথ দরকার
10.44.0.x থেকে পাওয়া একটি গেস্টকে তার উত্তর হোস্টের host-only ঠিকানায় পাঠাতে হবে, নয়তো হোস্টকে উৎস অনুবাদ করতে হবে। VirtualBox DHCP থেকে ঠিকানা পাওয়া এই দুটি বিন্যাসের কোনোটি সম্পর্কেই কিছু বলে না।
ip route add 10.44.0.0/24 via 192.168.99.1 dev enp0s8
ip route get 10.44.0.15
গেস্টের ভেতরে সেই রুট যোগ করলে মূল উৎস সংরক্ষিত থাকে, যা প্রতি ক্লায়েন্টের নীতি ও লগ অর্থবহ রাখে। হোস্টে সীমিত উৎস অনুবাদ বিকল্প, এবং এটি কাজ করে, কিন্তু কোন ক্লায়েন্ট যুক্ত হয়েছিল তা লুকানোর বিনিময়ে। ওভারল্যাপ হলো অন্য ব্যর্থতার ধরন। যে দূরবর্তী ক্লায়েন্টের হোম LAN ইতিমধ্যে 192.168.99.0/24 ব্যবহার করে, সে পুশ করা রুটকে নিজের নেটওয়ার্ক হিসেবে পড়বে, আর সার্ভার দিকের কোনো পরিবর্তন সেই দ্ব্যর্থতা মেটায় না। এক দিক নতুন করে নম্বর দিন বা সংঘর্ষের সম্ভাবনা কম এমন প্রিফিক্স বেছে নিন।
TUN ডিভাইস IP প্যাকেট বহন করে, তাই গেস্টের ভেতরে ডিফল্ট গেটওয়ে যোগ করলে টানেল host-only অ্যাডাপ্টারের সঙ্গে একটি ইথারনেট সেগমেন্টে পরিণত হয় না। TAP ব্রিজিং আলাদা ডিজাইন যার নিজস্ব ক্লায়েন্ট সমর্থন ও ঠিকানা মালিকানা আছে, আর দুটি বর্ণনা মেশালে এমন কনফিগারেশন হয় যা কখনো মিলিত হয় না।
যাচাই করুন, তারপর রিস্টার্টে টিকে থাকার ব্যবস্থা করুন
সাধারণ দূরবর্তী ক্লায়েন্ট থেকে একটি নিরীহ সেবা পরীক্ষা করুন, গেস্টের ফিরতি রুট দেখুন, এবং নিশ্চিত করুন যে অনুমোদন না দেওয়া সেবা ধীর নয়, বরং প্রত্যাখ্যাত হয়।
ss -lntp '( sport = :5432 )'
conntrack -L | grep 192.168.99.20
তারপর VPN সেবা ও ভার্চুয়াল মেশিনের নেটওয়ার্কিং রিস্টার্ট করুন এবং একই তিনটি যাচাই পুনরাবৃত্তি করুন। হাতে যোগ করা রুট পরের রিবুট পর্যন্ত টেকে, আর যে কনফিগারেশন কেবল উষ্ণ সেশনে কাজ করে তা ডিজাইন নয়। দুটি প্রিফিক্স, ফরওয়ার্ডিং নীতি ও গেস্ট রুট একসঙ্গে লিখে রাখুন। পরের ভার্চুয়াল মেশিন যে যোগ করবে তার তিনটিই লাগবে, নইলে সে প্রতিটি ব্যর্থ সংযোগে সেগুলো আবার আবিষ্কার করবে।