রাউটার VPN-এ একটি ডিভাইসের জন্য তিনটি নিয়ম দরকার, টগল নয়
রাউটার VPN দিয়ে একটি ডিভাইস মানে পলিসি রাউটিং, চেকবক্স নয়: একটি চিহ্নিত টেবিল, সীমিত NAT নিয়ম, সঙ্গে DNS, IPv6 ও LAN পথ যা গাইডগুলো বাদ দেয়।
রাউটার VPN-এ প্রতি ডিভাইসের জন্য আলাদা কোনো সুইচ নেই; যে টগলটি আপনি খুঁজছেন সেটি একটি শর্টকাট, যা আপনার হয়ে পলিসি রাউটিং নিয়ম লিখে দেয়। যেই মুহূর্তে একটি ল্যাপটপ, একটি পোর্ট রেঞ্জ, একটি অ্যাড্রেস লিস্ট বা একটি LAN সেগমেন্টকে টানেল ব্যবহার করতে হয় আর বাকি সব WAN-এ থাকে, আপনি একটি ফিচার চালু না করে একটি পলিসি রুট বানাচ্ছেন। কাজটির তিনটি চলমান অংশ আছে, আর প্রতিটি আলাদাভাবে ব্যর্থ হয়: রুট ছাড়া চিহ্নিত টেবিল নীরবতার মতো দেখায়, ভুল চেইনে বসানো মার্ক মনে হয় কিছুই হয়নি, আর অনুপস্থিত NAT নিয়ম দেখায় এমন টানেলের মতো যা সংযোগ হয় কিন্তু কিছু বহন করে না। আরও দুটি অংশ হারিয়ে যায় কারণ সেগুলো কখনো mangle নিয়মে আসে না, সেগুলো হলো DNS ও IPv6।
মিথ: টানেল হলো ক্লায়েন্টের সেটিং
রাউটার-সাইড VPN ক্লায়েন্ট একটি ভারী কাজ ভালোভাবে করে: এটি 0.0.0.0/0 কে মূল রাউটিং টেবিলে বসিয়ে টানেলের দিকে নির্দেশ করে। WireGuard এটি AllowedIPs থেকে নেয়, OpenVPN নেয় পুশ করা redirect-gateway থেকে, আর দুটোই রাউটারের পেছনের প্রতিটি হোস্টের পথ বদলে দেয়। AllowedIPs সংকুচিত করা বা route-nopull যোগ করা বদলায় ক্লায়েন্ট কী ইনস্টল করে। এটি বদলায় না ইনস্টলেশনটি কার উপর প্রযোজ্য হবে, কারণ ক্লায়েন্ট কখনো ডিভাইস দেখে না। এটি শুধু প্যাকেট দেখে।
উৎস বা গন্তব্য দিয়ে নির্বাচন একটি রাউটিং সিদ্ধান্ত, তাই এটি রাউটারের পলিসি স্তরের কাজ: RouterOS-এ একটি mangle নিয়ম ও দ্বিতীয় টেবিল, OpenWrt বা DD-WRT-তে একটি MARK ও একটি ip rule, অথবা pfSense-এ এমন ফায়ারওয়াল নিয়ম যার গেটওয়ে হলো টানেল। Netgate-এর WireGuard ক্লায়েন্ট রেসিপি হলো অনুমান করার আগে পড়ার জিনিস, কারণ ওই প্ল্যাটফর্মে নিয়মের গেটওয়ে, ইন্টারফেস অ্যাসাইনমেন্ট আর আউটবাউন্ড NAT এন্ট্রি—সবকিছুকে একমত হতে হয়, তবেই একটি ক্লায়েন্ট টানেল ব্যবহার করবে।
মিথের দ্বিতীয় অর্ধেক হলো দ্বিতীয় রাউটার। আরেকটি বক্স কেনা বা ডিভাইসটিকে গেস্ট SSID-এ সরানো প্রায়ই সত্যিই কাজ করে, আর কারণটি হার্ডওয়্যার নয়: এটি ডিভাইসটিকে নিজের সাবনেটে বসায়, যা আপনাকে সেই সোর্স সিলেক্টর দেয় যা ফার্মওয়্যার আগেই বোঝে। যদি আপনার নিজের রাউটারে সেই সেগমেন্টটি সংজ্ঞায়িত করতে পারেন, তবে বাড়তি বক্সটি এমন সমস্যার সমাধান করে যা আপনার ছিলই না।
প্রথম অংশ: এমন টানেল যা ডিফল্ট রুট নয়
RouterOS-এ ক্লায়েন্টটি ডিফল্ট রুট ছাড়া যোগ করুন এবং টানেলকে নিজের টেবিল দিন। প্রথম রুটটি চিহ্নিত ডিফল্ট; দ্বিতীয়টি ব্যর্থতার অর্ধেক।
/ip route add dst-address=0.0.0.0/0 gateway=VPN_GATEWAY_IP routing-mark=vpn distance=1
/ip route add dst-address=0.0.0.0/0 type=unreachable routing-mark=vpn distance=2
unreachable রুটটিই সেই কারণ যার জন্য চিহ্নিত টেবিল মূল টেবিলের এক্সেপশন লিস্টকে হারিয়ে দেয়। টানেল পড়ে গেলে চিহ্নিত প্যাকেটগুলো চুপচাপ WAN-এ ফিরে যাওয়ার বদলে সঙ্গে সঙ্গে unreachable পায়, ফলে ব্যর্থতা ধরা পড়ে অ্যাপের এরর মেসেজে, এক ঘণ্টা পরে দেখা জিও-লোকেশন পাতায় নয়।
RouterOS 7 সেটাই ভাগ করে যা 6.x একসঙ্গে রাখত: আপনি /routing table add name=vpn fib দিয়ে টেবিল ঘোষণা করেন, তারপর রুটে ও mangle নিয়মে নাম দিয়ে সেটির উল্লেখ করেন। যে 6.x স্নিপেট টেবিল সংজ্ঞায়িত না করেই routing-mark ইনলাইন করে, সেটি পরিষ্কারভাবে লোড হয় এবং কিছুই মেলায় না। আরেকটি চিরচেনা ঘটনা হলো দুটি 0.0.0.0/1 অর্ধেক, বা একই টেবিলে একই দূরত্বে দুটি ডিফল্ট: কার্নেল একটি বেছে নেয়, আর রিবুটের পর আচরণ বদলে যেতে পারে।
দ্বিতীয় অংশ: রুট লুকআপের আগে মার্ক
সিলেক্টর ঠিক করে কোন প্যাকেট ওই টেবিলে ঢুকবে। RouterOS সাধারণত গন্তব্য পলিসির জন্য অ্যাড্রেস লিস্ট দিয়ে, বা ডিভাইস পলিসির জন্য সোর্স অ্যাড্রেস দিয়ে শুরু করে:
/ip firewall mangle add chain=prerouting src-address=192.168.88.50 action=mark-routing new-routing-mark=vpn
/ip firewall mangle add chain=prerouting dst-address-list=via-vpn action=mark-routing new-routing-mark=vpn
/ip firewall address-list add list=via-vpn address=203.0.113.10
Linux ফার্মওয়্যার একই কাজ করে netfilter মার্ক আর এমন নিয়ম দিয়ে যা চিহ্নিত প্যাকেটকে আপনার ভরা টেবিলে পাঠায়:
iptables -t mangle -A PREROUTING -p tcp --dport 27000:27050 -j MARK --set-mark 0x200
ip route add default dev tun0 table 100
ip rule add fwmark 0x200 table 100
চেইনটি স্টাইলের পছন্দ নয়। প্যাকেট FORWARD-এ পৌঁছানোর সময় রুট লুকআপ হয়ে গেছে, তাই সেখানে MARK বা DROP কেবল পুনর্লিখন বা বাতিল করতে পারে। মার্কটি ফরওয়ার্ড করা ট্রাফিকের জন্য PREROUTING-এ এবং রাউটার নিজে যেসব ট্রাফিক তৈরি করে তার জন্য OUTPUT-এ বসতে হবে, কারণ রাউটারের DNS, NTP ও আপডেট চেক ওখানেই থাকে। এই আউটপুট পথটিই সাধারণ কারণ যার জন্য পুরোপুরি টানেল করা সেটআপও লিক টেস্টে ISP রিজলভার থেকে উত্তর দেয়।
ডিভাইস পলিসির দরকার এমন মিল যা সরে না। DHCP-তে অ্যাড্রেসটি সংরক্ষণ করুন, বা নির্দিষ্ট সেগমেন্টের জন্য ইন্টারফেস মেলান; যে অ্যাড্রেস পরে অন্য ডিভাইসে চলে যায়, সেটি চুপচাপ ভুল ক্লায়েন্টে টানেল প্রয়োগ করে। নিজস্ব সাবনেটসহ প্রতি-SSID ব্রিজ একই ধারণার বেশি টেকসই রূপ, আর এটি IPv6 নিয়মগুলোকে থাকার জায়গাও দেয়।
তৃতীয় অংশ: NAT, DNS ও LAN ব্যতিক্রম
টানেল দিয়ে বেরোনো ট্রাফিকের দরকার এমন সোর্স অ্যাড্রেস যা দূরের পক্ষ উত্তর দেবে। অনুবাদটিকে টানেল ইন্টারফেসে সীমিত করুন: RouterOS-এ out-interface=VPN_NAME, Linux-এ -o tun0, pfSense-এ মিলে যাওয়া আউটবাউন্ড NAT এন্ট্রি। এই সীমা ছাড়া masquerade নিয়ম এমন ট্রাফিক পুনর্লিখন করে যা আপনি অক্ষত রাখতে চেয়েছিলেন, আর লক্ষণ হলো টানেলবিহীন ডিভাইসটি তার পাবলিক অ্যাড্রেস হারায়।
LAN ব্যতিক্রমটি টানেলের চেয়েও বেশি সাপোর্ট থ্রেড তৈরি করে। যদি চিহ্নিত টেবিলে কেবল একটি ডিফল্ট রুট থাকে, তবে নির্বাচিত ডিভাইস থেকে প্রিন্টার বা NAS গন্তব্য সেই ডিফল্টের সঙ্গে মিলে টানেলে হারিয়ে যায়। একই টেবিলে LAN রুট যোগ করুন, বা সিলেক্টরে লোকাল সাবনেট বাদ দিন; দুটোই কাজ করে, আর পরে VLAN যোগ করলে ব্যতিক্রমটি সঠিক রাখা সহজ।
DNS আলাদা পথ নেয়। রাউটার যে কোয়েরি ফরওয়ার্ড করে সেগুলো রাউটার থেকেই আসে এবং OUTPUT অনুসরণ করে, ফরওয়ার্ড করা মার্ক নয়, তাই পুরোপুরি টানেল করা ল্যাপটপও ISP দিয়ে রিজলভ করতে পারে। ক্লায়েন্টদের টানেলের মধ্য দিয়ে পৌঁছানো রিজলভারের দিকে পাঠান, অথবা রাউটারের নিজের পোর্ট 53 ট্রাফিক চিহ্নিত করুন, তারপর ধরে নেওয়ার বদলে রিজলভ হওয়া অ্যাড্রেসটি যাচাই করুন যে উত্তরটি ওয়েব রিকোয়েস্টের সঙ্গে গেছে।
যখন নিয়ম মেলে, কিন্তু অ্যাপ এখনো WAN ব্যবহার করে
গন্তব্যের তালিকা দ্রুত পুরনো হয়। একটি নাম এমন অ্যাড্রেসে রিজলভ হয় যা তালিকায় নেই, তাই রিকোয়েস্টটি WAN নেয়, অথচ তালিকার অ্যাড্রেসের বিরুদ্ধে আপনার প্রতিটি পরীক্ষা কাজ করেছিল। যে রিজলভার ক্লায়েন্ট ব্যবহার করে সেটি থেকেই তালিকা রিফ্রেশ করুন, আর সত্যিই এক ডিভাইসের সব ট্রাফিক চাইলে সোর্স-ভিত্তিক সিলেক্টর পছন্দ করুন।
IPv6 হলো শান্ত বাইপাস। ডিভাইসটির নিজস্ব ডিফল্ট রুট ও নিজস্ব নিয়মসমূহসহ দ্বিতীয় অ্যাড্রেস ফ্যামিলি আছে, আর কেবল IPv4 অ্যাড্রেস মেলানো অর্ধেক পলিসি। একই সিলেক্টর ip6tables বা nftables-এর সমতুল্যে প্রয়োগ করুন, অথবা ওই সেগমেন্টে IPv6 ইচ্ছাকৃতভাবে বন্ধ করুন, দৈবক্রমে নয়।
স্থাপিত কানেকশনও গুরুত্বপূর্ণ। পরিবর্তনের আগে তৈরি conntrack এন্ট্রি মেয়াদ শেষ না হওয়া পর্যন্ত পুরনো পথ অনুসরণ করে, তাই সম্পাদনার সময় খোলা থাকা ব্রাউজার দেখে মনে হয় এমন নিয়ম যা কখনো প্রয়োগ হয়নি। পলিসি বিচার করার আগে নতুন কানেকশন খুলুন, বা স্টেট ফ্লাশ করুন।
দুটি ডিভাইস ও একটি রিবুট দিয়ে যাচাই করুন
যে ডিভাইসটি টানেলে থাকা উচিত এবং যেটি উচিত নয়—দুটোই পরীক্ষা করুন, আর গতির সংখ্যার বদলে দ্বিতীয় হপ তুলনা করুন। প্রতিটি থেকে traceroute দ্বিতীয় হপে হয় টানেল গেটওয়ে বা ISP গেটওয়ে দেখায়; দুটোই একই রকম দেখালে মার্ক বা টেবিল নিয়মের কথামতো কাজ করছে না। পরীক্ষার জন্য নতুন কানেকশন ব্যবহার করুন।
তারপর রিবুট করুন। স্টার্টআপ ক্রমই সেখানে যেখানে কাজ করা পলিসি ভাঙা হয়ে যায়, কারণ unreachable রুট ইনস্টলের আগে ক্লায়েন্ট চালু থাকতে হবে, আর পুরনো নিয়মসেট ফিরিয়ে আনা সেভ করা স্ন্যাপশট আপনার টেবিল মুছে দেবে। যাচাই করুন প্রতিটি নিয়ম সেভ করা কনফিগে আছে এবং বুটের পরেও চিহ্নিত ডিফল্টটি বিদ্যমান, কেবল আপনি টাইপ করার পরেই নয়।
কিছু ব্যর্থ হলে আগে মার্ক সরিয়ে দেখুন স্বাভাবিক ট্রাফিক ফিরে আসে কি না, তারপর টেবিল সরান। এই ক্রমই বলে দেয় আপনি রাউটিং সমস্যা না ফায়ারওয়াল সমস্যা তাড়া করছেন, আর কাজ শেষ করার সময় বাড়িতে একটি কাজ করা প্রিন্টার রেখে যায়।