Windows-এ VPN আসলে কী রুট করে তা PowerShell-এ কীভাবে যাচাই করবেন
সংযুক্ত VPN টাইল কভারেজ প্রমাণ করে না। সংরক্ষিত প্রোফাইল ফ্ল্যাগ, চলমান রুট টেবিল এবং NRPT নিয়ম এই ক্রমে পড়ুন।
আমি একটি Windows 11 ল্যাপটপে VPN ক্লায়েন্ট সংযুক্ত করলাম, টাইলটি Connected-এ গেল, একটি অভ্যন্তরীণ ফাইল শেয়ার খুলল, অথচ একটি পাবলিক সাইট এখনও অফিসের Wi-Fi থেকে সরাসরি লোড হলো। এই মিশ্রণটি ভাঙা টানেলের মতো দেখায়। এটি আসলে এমন প্রোফাইলের স্বাভাবিক ফল, যা কিছু ট্রাফিক VPN দিয়ে পাঠায় আর বাকিটা ফিজিক্যাল অ্যাডাপ্টারে রাখে। ফোর্স টানেলিং বদলায় Windows কোন ডিফল্ট রুট পছন্দ করবে; এটি বেশি নির্দিষ্ট রুট মুছে ফেলে না এবং সংযোগ কাটলে ট্রাফিক থামবে বলেও প্রতিশ্রুতি দেয় না। এরপরের ক্রমটি আমি অনুসরণ করি যখন কোনো ক্লায়েন্ট কভারেজ দাবি করে: ক্লায়েন্ট অবস্থা, সংরক্ষিত প্রোফাইল, প্রয়োগকৃত রুট, রিজলভার, তারপর প্রকৃত ফ্লো।
ক্লায়েন্ট থেকে শুরু করুন, তারপর তাকে বিশ্বাস করা বন্ধ করুন
ক্লায়েন্ট শুরু করার সঠিক জায়গা কেবল এই কারণে যে এটি বলে দেয় কোন প্রোফাইল সক্রিয়। সংযোগের বৈশিষ্ট্য খুলুন এবং সঠিক প্রোফাইল নাম, এটি বর্তমান ব্যবহারকারীর জন্য না মেশিনের সবার জন্য তৈরি হয়েছে, এবং সংযোগের পরে ncpa.cpl-এ কোন অ্যাডাপ্টার দেখা যায় তা টুকে রাখুন। আমার পরীক্ষার ল্যাপটপে অ্যাডাপ্টারটি প্রোফাইল নামই বহন করছিল, ফলে রুট আউটপুট পড়া সহজ হয়েছিল। অন্য মেশিনে এটি WAN Miniport এন্ট্রি হিসেবে দেখায় এবং নামটি আপনাকে কিছুই বলে না।
ক্লায়েন্ট যা বলতে পারে না তা হলো কভারেজ। সংযুক্ত টাইল টানেলের অবস্থা বর্ণনা করে, গন্তব্যের তালিকা নয়। তৃতীয় পক্ষের ক্লায়েন্টরাও নিজেদের কনফিগারেশন রাখে, তাই নেটিভ Windows প্রোফাইল এবং তার থেকে আপনি যে বৈশিষ্ট্যগুলো পড়তে যাচ্ছেন, সেগুলোর সঙ্গে ওই ক্লায়েন্ট যা ইনস্টল করেছে তার সম্পর্ক না-ও থাকতে পারে। যদি VPN AnyConnect, OpenVPN GUI, WireGuard বা কোনো ভেন্ডর এজেন্ট দিয়ে এসেছে, নিচের PowerShell যাচাইগুলো বেশিরভাগ ক্ষেত্রে প্রযোজ্য নয়, এবং বরং ওই ক্লায়েন্টের নিজের স্প্লিট-টানেল ও রাউটিং সেটিংস পড়া উচিত।
সংরক্ষিত প্রোফাইল পড়ুন, টাইল নয়
নেটিভ Windows প্রোফাইলের জন্য (IKEv2, L2TP, SSTP, বা MDM-চালিত কোনো প্রোফাইল) সংরক্ষিত স্প্লিট-টানেল সিদ্ধান্ত একটি মাত্র বৈশিষ্ট্য:
Get-VpnConnection -Name 'Office' | Select-Object Name, ServerAddress, SplitTunneling, DnsSuffix
প্রোফাইলটি ডিভাইসের সবার জন্য তৈরি হলে -AllUserConnection যোগ করুন। এটি ছাড়া আপনি বর্তমান ব্যবহারকারীর তালিকা পড়ছেন, যা খালি হতে পারে বা একই রকম নামের ভিন্ন এন্ট্রি ধারণ করতে পারে। False মানটি SplitTunneling-এ থাকা মানে প্রোফাইলটি পূর্ণ টানেল হিসেবে সংরক্ষিত হয়েছে: Windows VPN অ্যাডাপ্টার দিয়ে একটি ডিফল্ট রুট ইনস্টল করে। True মানে স্প্লিট টানেল, আর তখন কভারেজ সম্পূর্ণভাবে প্রোফাইলের পাঠানো রুট ও নাম-রিজলিউশন নিয়মের ওপর নির্ভর করে।
এই মানটিকে কনফিগারেশন হিসেবে ধরুন, পর্যবেক্ষণ হিসেবে নয়। এটি টুকে রাখে সংযোগের সময় প্রোফাইল কী চেয়েছিল। Windows-এ ভিন্ন প্রয়োগকৃত রুট থেকে যেতে পারে — অন্য ইন্টারফেসের বেশি নির্দিষ্ট রুট, নীতিসেটিং বা আগের সংযোগের অবশিষ্ট এন্ট্রির কারণে, তাই বুলিয়ান মানটি একা প্রশ্নটির নিষ্পত্তি করে না।
সংরক্ষিত মানটির সঙ্গে প্রয়োগকৃত রুট টেবিল মিলিয়ে দেখুন
সংযোগের পরে পুরো টেবিল স্ক্রল না করে টানেল অ্যাডাপ্টারের রুটগুলো তালিকাবদ্ধ করুন:
$vpn = Get-NetAdapter | Where-Object InterfaceDescription -match 'VPN|WAN Miniport'
Get-NetRoute -InterfaceIndex $vpn.ifIndex | Sort-Object DestinationPrefix
Find-NetRoute -RemoteIPAddress 10.20.4.15 | Select-Object -First 1
Find-NetRoute হলো কাজের অর্ধেক। এটি সেই প্রশ্নের উত্তর দেয় যা ক্লায়েন্ট কখনও দেয় না: এই গন্তব্যের জন্য Windows আসলে কোন ইন্টারফেস ও কোন উৎস ঠিকানা ব্যবহার করবে? এটি চালান একটি অভ্যন্তরীণ হোস্ট, একটি পাবলিক হোস্ট এবং আপনি যেটিকে ইচ্ছাকৃত ব্যতিক্রম মনে করেন তার জন্য। পূর্ণ-টানেল প্রোফাইলে পাবলিক ঠিকানার জন্য টানেল ইন্টারফেস দেখানো উচিত। স্প্লিট-টানেল প্রোফাইলে সাধারণত সেখানে ফিজিক্যাল অ্যাডাপ্টার দেখায়, অথচ অভ্যন্তরীণ প্রিফিক্সগুলো এখনও VPN-এ রিজলভ হয়।
দুটি ফাঁদ «ভুল দিকে রুট করে» অভিযোগের বেশিরভাগ ব্যাখ্যা দেয়। সবচেয়ে নির্দিষ্ট প্রিফিক্সই সবসময় জেতে, তাই ফিজিক্যাল অ্যাডাপ্টারের একটি /24 টানেলের মেট্রিক যতই কম হোক, VPN-এর ডিফল্ট রুটকে হারায়। মেট্রিক কেবল একই প্রিফিক্সের রুটগুলোর মধ্যে সমতা ভাঙে। আর IPv4 ও IPv6 আলাদাভাবে নির্ধারিত হয়: 0.0.0.0/0 কভার করা প্রোফাইল IPv6-কে লোকাল লিঙ্কে রেখে দিতে পারে, ফলে ডুয়াল-স্ট্যাক সাইট আধা-টানেলড দেখায়। টানেল ঠিক আছে বলে সিদ্ধান্তে পৌঁছানোর আগে Get-NetRoute -AddressFamily IPv6 যাচাই করুন।
| What you see | Most likely cause | Check next |
|---|---|---|
| Public traffic leaves the physical adapter while SplitTunneling reads False | A more specific route on that adapter wins over the tunnel default | Find-NetRoute for the exact destination, then look for a /24 or host route on the physical interface |
| Internal name fails, internal IP works | No NRPT rule for that namespace, or a broader rule matches first | Get-DnsClientNrptPolicy and the namespace order |
| A dual-stack site opens directly while IPv4 uses the tunnel | The profile covers only the IPv4 default route | The IPv6 route table on both interfaces |
| Routes look right but one app still goes direct | The app uses its own proxy, or the client keeps a per-app list | The app's proxy settings and the client's application list |
NRPT দিয়ে নাম রিজলিউশন আলাদাভাবে যাচাই করুন
অভ্যন্তরীণ নাম ব্যর্থ অথচ অভ্যন্তরীণ IP ঠিকানা কাজ করলে তা রাউটিং নয়, রিজলভার নীতির দিকে ইঙ্গিত করে। Windows প্রতিটি namespace-এর DNS নাম রিজলিউশন নীতি টেবিল দিয়ে নির্ধারণ করে, যা রুট টেবিল থেকে স্বতন্ত্র:
Get-DnsClientNrptPolicy -Effective | Select-Object Namespace, NameServers
Get-DnsClientServerAddress -InterfaceIndex $vpn.ifIndex
যখন কোনো নিয়ম *.corp.example-এর সঙ্গে মেলে, সেই namespace-এর কোয়েরি টানেলের DNS সার্ভারে যায়, এমনকি স্প্লিট-টানেল মোডে ওই সার্ভারগুলোর ডেটা পথ ফিজিক্যাল অ্যাডাপ্টারে থাকলেও। এটাই নকশা, আর এজন্যই পাবলিক সাইট খোলা একটি ব্রাউজার পরীক্ষা অভ্যন্তরীণ নাম সম্পর্কে কিছুই বলে না। অ্যাডাপ্টার প্রত্যাশিত সার্ভার তালিকাবদ্ধ করলে কিন্তু লুকআপ এখনও অন্যত্র গেলে, NRPT নিয়মের ক্রম মিলিয়ে দেখুন এবং আরও নির্দিষ্ট namespace আগে মেলে কি না যাচাই করুন।
ফ্লো যাচাই করুন, তারপর ঠিক করুন আপনি আসলে কী চেয়েছেন
গন্তব্যগুলো একটি নির্দিষ্ট ক্রমে দেখুন যাতে ফলাফল মেশিনের মধ্যে তুলনাযোগ্য হয়: একটি পাবলিক ঠিকানা, একটি অভ্যন্তরীণ ঠিকানা, একটি অভ্যন্তরীণ নাম, এবং একটি ইচ্ছাকৃত ব্যতিক্রম যেমন স্থানীয় প্রিন্টার বা ভিডিও কল। প্রতিটির জন্য Find-NetRoute যে ইন্টারফেস ও উৎস ঠিকানা ফেরত দেয় তা টুকে রাখুন। নীতিতে যেকোনো পরিবর্তনের পরে আবার সংযোগ করুন এবং একই চারটি যাচাই পুনরাবৃত্তি করুন; পুনঃসংযোগের পরে রুট টেবিলই একমাত্র প্রমাণ যে নতুন প্রোফাইল কার্যকর হয়েছে।
তারপর রাউটিংকে এনফোর্সমেন্ট থেকে আলাদা করুন। ফোর্স টানেলিং আওতাভুক্ত ট্রাফিকের জন্য টানেল চালু থাকা পর্যন্ত টানেলকেই প্রাধান্য দেয়। এটি কিল সুইচ নয়। যদি দাবি হয় টানেল পড়লে মেশিন থেকে কিছুই বেরোবে না, তবে তা আসতে হবে ব্লকিং নকশা থেকে: টানেল অবস্থার সঙ্গে বাঁধা ফায়ারওয়াল প্রোফাইল, ট্রাফিক ফিল্টারসহ সর্বদা-চালু প্রোফাইল, বা ভেন্ডর ক্লায়েন্টের নিজস্ব ফেল-ক্লোজড অপশন। ফোর্স টানেলিং-কে VPN সার্ভারের নিজের ঠিকানাও টানেলের বাইরে পৌঁছানোযোগ্য রাখতে হয়, আর «সবকিছু জোর করা»-র নামে সেটি ব্লক করা যে সংযোগ আপনি প্রয়োগ করতে চাইছেন তা থেকে নিজেকে বের করে দেওয়ার নির্ভরযোগ্য উপায়।
কিছু বদলানোর আগে এই তালিকাটি মিলিয়ে নিন। যে বিন্দু ব্যর্থ হয় সেটি আসল সমস্যাটি কোথায় তা সংকুচিত করে।
- প্রোফাইল নাম ও পরিধি নিশ্চিত, মেশিন-ব্যাপী প্রোফাইলে
-AllUserConnectionব্যবহার করা হয়েছে। SplitTunnelingপঠিত এবং কভারেজের প্রমাণ নয়, কনফিগারেশন হিসেবে গণ্য।- টানেল অ্যাডাপ্টারের রুট IPv4 ও IPv6-এর জন্য আলাদাভাবে তালিকাভুক্ত।
- একটি পাবলিক, একটি অভ্যন্তরীণ ও একটি ব্যতিক্রম গন্তব্যের জন্য
Find-NetRouteচালানো হয়েছে। - নাম ব্যর্থতার জন্য রুটকে দোষারোপের আগে NRPT নিয়ম যাচাই করা হয়েছে।
- ব্লকিং প্রয়োজনীয়তা আবার পড়া হয়েছে: পছন্দের রাউটিং মানে প্রয়োগকৃত ব্লকিং নয়।
পূর্ণ না স্প্লিট টানেলের সিদ্ধান্ত প্রোফাইলের মালিকের, আর মাইক্রোসফটের রাউটিং নোট ব্যাখ্যা করে প্রোফাইল সেট করলে Windows কী আচরণ করে। Microsoft: ফোর্স ও স্প্লিট টানেলিং হলো আউটপুট পড়ার সময় আমি খোলা রাখা তথ্যসূত্র।