IPv6 ট্রাফিক কি VPN-এর মধ্য দিয়ে যাবে নাকি সরাসরি?
তিনটি শর্তে ঠিক করুন ::/0 টানেলের ভিতরে পড়ে কি না: এক্সিটের সমর্থন, এন্ডপয়েন্টে পৌঁছানো এবং কেবল স্থানীয় নেটওয়ার্ক।
গত মাসে দুজন মানুষ আমার কাছে বিপরীত ফলাফল চেয়েছিলেন: একজন চেয়েছিলেন IPv6 যেন VPN-এর আওতায় থাকে, অন্যজন চেয়েছিলেন অফিসের প্রিন্টার কাজ করতে থাকুক। একটি মাত্র ::/0 রুট একা দুটোই দিতে পারে না। ওই রুটটি টানেলের ভিতরে পড়ে কি না, তা তিনটি শর্তের উপর নির্ভর করে, আর প্রথম শর্তটিই বেশিরভাগ বাণিজ্যিক এক্সিটের ক্ষেত্রে এটিকে বাদ দেয়। এক্সিট যদি IPv6 বহন না করে, তবে ডিফল্ট রুটটি তার ভিতরে পাঠালে আপনার ট্রাফিক এমন একটি টানেলে লুকিয়ে যায় যার পাঠানোর কোনো জায়গা নেই।
তিনটি শর্তই উত্তর ঠিক করে
ডিফল্ট রুট এক লাইন, ::/0, এবং এটি আরও নির্দিষ্ট রুট ছাড়া যেকোনো IPv6 গন্তব্যের সঙ্গে মেলে (RFC 4291)। এটি ইনস্টল করা সহজ। আপনার এটি করা উচিত কি না, তা ঠিক তিনটি শর্তে গিয়ে দাঁড়ায়।
শর্ত এক: আপনি যে এক্সিটে সংযোগ করেন, সেখানে কাজ করা IPv6 আছে এবং তা এগিয়ে পাঠাতে রাজি। শর্ত দুই: আপনার ক্লায়েন্ট টানেলের এন্ডপয়েন্ট পর্যন্ত পথ ধরে রাখতে পারে, যা সাধারণত আপনি যে রেঞ্জ রুট করতে যাচ্ছেন তার ভিতরেই থাকে। শর্ত তিন: আপনি সেই স্থানীয় IPv6 গন্তব্যগুলোর নাম বলতে পারেন যেগুলো টানেলের বাইরে থাকতে হবে।
প্রতিটি শর্ত নিজের মতো করে ব্যর্থ হয়, তাই আন্দাজ করতে গেলে একটি সন্ধ্যা নষ্ট হয়। ব্যর্থ শর্ত এক আপনাকে নীরবতা আর সঠিক দেখতে একটি রাউট টেবিল দেয়। ব্যর্থ শর্ত দুই হ্যান্ডশেক শুরু হওয়ার কয়েক সেকেন্ড পরেই তা মেরে ফেলে। ব্যর্থ শর্ত তিন একটি কাজ করা টানেল আর প্রিন্টারের পাশে এক অখুশি সহকর্মী রেখে যায়।
| What you see | Decision |
|---|---|
| Exit answers IPv6 probes, no local IPv6 devices to protect | Route ::/0 into the tunnel |
| Exit answers IPv6 probes, printer or NAS reachable by a global address | Route ::/0, then give those prefixes a route of their own |
| Exit is IPv4-only inside the tunnel | Do not route ::/0; block IPv6 on the client |
Endpoint is reached over IPv6 and sits inside ::/0 | Install a host route for the endpoint first |
এক্সিট কি সত্যিই IPv6 বহন করে?
IPv6 ঠিকানা থাকা একটি টানেল ইন্টারফেস ওপারের সম্পর্কে কিছুই প্রমাণ করে না। অনেক বাণিজ্যিক প্রোফাইল ভিতরে কেবল IPv4: সার্ভার আপনাকে একটি v4 ঠিকানা দেয় আর বাকি সব ফেলে দেয়। তার উপরে AllowedIPs থেকে একটি ডিফল্ট বসান, আর কার্নেল আনন্দের সঙ্গে IPv6 এমন ইন্টারফেসে পাঠাবে যার পার্টনার তা কখনো দেখে না।
টানেল চালু থাকার সময় ক্লায়েন্ট থেকে পরীক্ষা করুন। ping -6 -c 3 2001:4860:4860::8888 আর ip -6 route get 2001:4860:4860::8888 ভিন্ন প্রশ্নের উত্তর দেয়: উত্তর ফিরে আসে কি না, আর কার্নেল কোন ডিভাইস বেছেছে। যখন দ্বিতীয়টি আপনার টানেলের নাম বলে আর প্রথমটি কিছুই ফেরত দেয় না, তখন সমস্যা রুটে নয়, এক্সিটে।
আপনি নিজে এক্সিট চালালে ক্লায়েন্ট পরীক্ষা পাস হতে পারে, তবু পথটি মৃতপ্রায় থেকে যায়। গেটওয়েতে net.ipv6.conf.all.forwarding=1 নিশ্চিত করুন এবং তার ফায়ারওয়াল টানেল থেকে ফরোয়ার্ড করা প্যাকেট গ্রহণ করে কি না তা দেখুন। রিলে করতে অস্বীকার করা এক্সিটে সঠিকভাবে রুট করা প্যাকেট ক্লায়েন্টের দিক থেকে দেখতে ঠিক একটি রাউটিং বাগের মতো।
ক্লায়েন্ট কি এন্ডপয়েন্ট পর্যন্ত পথ ধরে রাখতে পারে?
এটাই আমাকে কেবল-IPv6 WireGuard এন্ডপয়েন্টের ল্যাপটপে ধরেছিল। এন্ডপয়েন্টের ঠিকানা একটি সাধারণ গ্লোবাল ঠিকানা, তাই এটি ::/0-এর ভিতরে পড়ে। পুরো প্রিফিক্স ইন্টারফেসে রুট করুন, আর হ্যান্ডশেক প্যাকেটগুলো যে টানেল বানাতে চাইছে তার ভিতরেই নিজেদের তাড়া করবে। টানেল কখনোই ওঠে না, আর ক্লায়েন্টের আউটপুটে কেন তা বলে না।
wg-quick লিনাক্সে এটি সামলায়। এটি AllowedIPs থেকে রুট বের করে, নিজের টেবিলে বসায়, আর একটি পলিসি নিয়ম যোগ করে যাতে এন্ডপয়েন্টে ট্রাফিক প্রথমে মূল টেবিল দিয়ে সমাধান হয়: suppress_prefixlength 0 নিয়মটি, যা ip -6 rule-তে পাবেন। তাই wg-quick up সফল হয় যেখানে হাতে লেখা ip -6 route add default dev wg0 আপনাকে বিচ্ছিন্ন করে দেয়।
টানেল তোলার আগে আর পরে, দুই অবস্থাই ip -6 route get <endpoint-v6> দিয়ে যাচাই করুন। উত্তর যদি আপনার টানেল ডিভাইসে বদলে যায়, তাহলে টানেলের প্রয়োজনীয় পথটি আপনি সরিয়ে ফেলেছেন। নিজে রুট লেখার সময় মূল গেটওয়ে দিয়ে এন্ডপয়েন্টের জন্য একটি হোস্ট রুট যোগ করুন, অথবা IPv4 দিয়ে এন্ডপয়েন্টে সংযোগ করুন আর IPv6 পেলোডের উপর ছেড়ে দিন।
কী টানেলের বাইরে থাকতে হবে?
আরও নির্দিষ্ট রুট ডিফল্টকে হারায়, তাই নিজস্ব রুটসহ অন-লিংক প্রিফিক্স বা ULA রেঞ্জ বাড়তি পরিশ্রম ছাড়াই কাজ করতে থাকে। এটাই সেই নিরব কারণ যার জন্য এত পূর্ণ-টানেল IPv4 সেটআপ টিকে থাকে: LAN প্রিফিক্সগুলো ডিফল্টের চেয়ে বেশি নির্দিষ্ট এবং কখনো টানেলে ঢোকে না।
এটা ভাঙে যখন একটি স্থানীয় ডিভাইস গ্লোবাল ঠিকানায় নাগালের মধ্যে থাকে, যা একই রাউটার থেকে পাবলিক প্রিফিক্স পাওয়া প্রিন্টার, NAS বা টেলিভিশনের জন্য স্বাভাবিক। ওই ঠিকানাগুলো ::/0-এর সঙ্গে মেলে, আর কিছুই না, তাই সেগুলো বাকি সবকিছুর সঙ্গে টানেলে চলে যায় আর হারিয়ে যায়।
প্রোটোকল ধরে নয়, গন্তব্য ধরে সিদ্ধান্ত নিন। দুই-তিনটি স্থানীয় হোস্ট গুরুত্বপূর্ণ হলে তাদের প্রিফিক্সকে ফিজিক্যাল ইন্টারফেস দিয়ে বেরোনোর রুট দিন, বা দর-কষাকষির সেট থেকে বাদ দিন। তালিকা বাড়তেই থাকলে সৎ উত্তর হলো লিখিত ব্যতিক্রম-তালিকাসহ IPv6-এর জন্য স্প্লিট টানেলিং, আপনি যে ডিফল্টটা বারবার প্যাচ করছেন তা নয়।
উত্তর যদি না হয়, তবে ব্লক করুন
IPv6-কে রুটহীন রেখে দেওয়া আর তাকে একা রেখে দেওয়া এক নয়। কাজ করা IPv6 ডিফল্ট থাকা হোস্ট টানেল IPv4 বহন করার সময়ও তা ব্যবহার করে, তাই ট্রাফিক VPN-এর পাশ দিয়ে বেরিয়ে যায় আর IPv6 পছন্দ করা প্রতিটি সেবা আপনার আসল ঠিকানা দেখে। এটা লিক, স্প্লিট টানেল নয়।
একটি বেছে নিন এবং কোনটি বেছেছেন তা লিখে রাখুন। ডিফল্ট রুট করুন এবং উপরের আপসগুলো মেনে নিন, নয়তো টানেল যতক্ষণ থাকে ততক্ষণ IPv6 বন্ধ রাখুন। শুধু AllowedIPs থেকে প্রিফিক্স বাদ দেওয়া যথেষ্ট নয়, কারণ অপারেটিং সিস্টেম নিজের ডিফল্ট নিজেই রাখে। লিনাক্সে স্থূল সংস্করণ sysctl -w net.ipv6.conf.all.disable_ipv6=1; সূক্ষ্ম সংস্করণ ফায়ারওয়াল নিয়মে IPv6-কে টানেলের বাইরে ফেলে দেয়। ফোনের ক্লায়েন্টে স্পষ্ট IPv6-ব্লক টগল থাকে যা একই কাজ করে।
লিকের মতোই যাচাই করুন
টানেল তুলুন আর টগলে ভরসা না করে অবস্থা পড়ুন। ip -6 route show default একটি ডিফল্ট দেখানো উচিত, আর আপনার LAN-এর বাইরের গন্তব্যের জন্য ip -6 route get টানেল ডিভাইসের নাম বলা উচিত। সংযোগ বিচ্ছিন্ন হওয়ার পর দুটোই আবার চালান: যে ডিফল্ট টানেলের পরেও টোকে, সেটাই আপনার খোঁজা বাগ।
তারপর উল্টো দিক পরীক্ষা করুন। স্থানীয় নেটওয়ার্কের একটি হোস্ট থেকে ক্লায়েন্টের স্থানীয় IPv6 ঠিকানায় পৌঁছান। এটি কাজ করা বন্ধ করলে, তখন রাউট টেবিল যা-ই দাবি করুক, শর্ত তিন কখনোই পূরণ হয়নি।
ফলাফলটি সেখানে লিখুন যেখানে পরের মানুষটি তা পাবেন: কোন প্রিফিক্সগুলো স্থানীয় থাকে, কেন, আর সংযোগ বিচ্ছিন্ন হওয়ার পর ক্লায়েন্ট কী করে। রানবুকে দুটি লাইন পরের ইঞ্জিনিয়ারকে মধ্যরাতে এন্ডপয়েন্ট লুপটি আবার আবিষ্কার করা থেকে বাঁচায়।