OpenWrt-এ সম্পূর্ণ LAN-এর OpenVPN ক্লায়েন্ট: কাজ করার ক্রম
ইন্টারফেসের মালিকানা, জোন নীতি, মাস্কারেড এবং প্রতি-SSID টেবিল — এই চারটি আলাদা কাজ। ক্রম অনুযায়ী করলে রাউটারজুড়ে টানেল আর আপনার সঙ্গে লড়াই করবে না।
চারটি স্বতন্ত্র কাজ রাউটারের গোটা LAN-কে একটি টানেলের পেছনে বসায়। টানেল ডিভাইসের দরকার একটি মালিক, একটি ফায়ারওয়াল জোন, আপলিংকের দিকে একটি অনুবাদ লক্ষ্য, আর যদি কিছু ক্লায়েন্ট VPN-এর বাইরে থাকতে হয়, তবে সোর্স ঠিকানা অনুযায়ী রাউটিং। যে টানেল সংযোগ হয় কিন্তু কিছুই পার হয় না, তার সাধারণত এই চারটির একটি অনুপস্থিত থাকে। নির্ভরতার ক্রমে কাজ করার অর্থ হলো শেষের ব্যর্থতা ঠিক যে ধাপটি আপনি এইমাত্র বদলেছেন তার। নিচের প্রতিটি ধাপ এমন কিছুতে শেষ হয় যা আপনি দেখতে পান, আর এটাই পরের ধাপকে অনুমানে পরিণত হতে দেয় না।
কোনটি টানেল ভাগ করবে তা ঠিক করুন
যে রাউটার Wi-Fi ও DHCP দেয়, সে নিজেই ক্লায়েন্ট চালাতে পারে। এতে প্রতিটি সংযুক্ত ডিভাইস কোনো আলাদা সেটআপ ছাড়াই টানেলের পেছনে চলে যায়, আর ছোট সাইটগুলোর বেশিরভাগই এই ব্যবস্থাই চায়। টানেল পড়ে গেলে এটিই সবচেয়ে বড় প্রভাবের ব্যবস্থা, কারণ সব ডিভাইস একসঙ্গে পথ হারায়। LAN-এ কিছুই বাইরে যাওয়ার কাজ করা রুট ধরে রাখে না।
প্রথমটির পেছনে দ্বিতীয় একটি রাউটার, নিজের সাবনেট নিয়ে ক্লায়েন্ট চালালে, টানেলকে তার নিজের ডিভাইসেই সীমিত রাখে। এটি সরানো সহজ এবং যে উত্তরাধিকার পাবে তাকে বোঝানোও সহজ। দাম হলো রুট বা পোর্ট ফরোয়ার্ড ছাড়া দুই পাশের মধ্যে পৌঁছানো।
যেভাবেই হোক, LAN সাবনেটগুলো আলাদা করুন। একই রেঞ্জ থাকলে এক পাশ সরাসরি সংযুক্ত মনে হয়, আর যে ব্ল্যাক হোল তৈরি হয় তা ঘণ্টার পর ঘণ্টা VPN বিকল বলে মনে হয়।
টানেলকে একটি মালিক দিন
টানেলকে নাম, ডিভাইস এবং নিজস্ব প্রোটোকলহীন একটি নেটওয়ার্ক ইন্টারফেস হিসেবে ঘোষণা করুন। তখন নেটওয়ার্ক সিস্টেম ডিভাইসটি তৈরি ও পরিচালনা করে, আর পরের সব কিছু ইন্টারফেসকে ডিভাইস নয়, নাম দিয়েই উল্লেখ করে। এটাই জোনকে এটি খুঁজে পেতে দেয়।
একই ডিভাইস দুই জায়গায় তৈরি করবেন না। ঘোষিত ইন্টারফেসের পাশে হাতে বানানো টানেল এমন ডিভাইস দেয় যা আছে কিন্তু কোনো জোনে নেই, বা রিলোডে মিলিয়ে যায়। দুটোই ক্লায়েন্ট ব্যর্থ হয়েছে এমন দেখায়, আর কোনোটিই আসল কারণ বলে কোনো ত্রুটি দেয় না। ঘোষণামূলক পথ বেছে নিন এবং হাতের পথটি মুছুন।
নেটওয়ার্ক, ফায়ারওয়াল ও VPN কনফিগারেশনে নাম একই রাখুন। জোন নেটওয়ার্কগুলো নাম দিয়ে তালিকাভুক্ত করে, তাই একটি টাইপো টানেলকে সব জোনের বাইরে ফেলে দেয়, অথচ ইন্টারফেস নিজে সুস্থ দেখায়। নীতি ছাড়া সুস্থ ইন্টারফেস ধরা সবচেয়ে কঠিন অবস্থা।
জোনে রাখুন, তারপর সেখানে ফরোয়ার্ড করুন
ফায়ারওয়াল জোন হলো যেখানে নীতি থাকে: input, output, forward ও masquerade। কোনো জোনে না থাকা টানেল আপনার বেছে না নেওয়া ডিফল্টে চলে, আর রাউটার ক্লায়েন্টের সাধারণত তা দরকার হয় না। নিচের স্ট্যানজাগুলো ইন্টারফেস ঘোষণা করে, সেটিকে জোনে রাখে এবং LAN ট্রাফিককে সেই জোনে ঢোকার অনুমতি দেয়।
config interface 'vpn'
option device 'tun0'
option proto 'none'
config zone
option name 'vpn'
list network 'vpn'
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
option masq '1'
config forwarding
option src 'lan'
option dest 'vpn'
21.02-এর চেয়ে পুরোনো রিলিজে একই ইন্টারফেস লাইন option ifname লেখা হয়, তাই পেস্ট করার আগে ইনস্টল করা ফার্মওয়্যার কোন রূপ পড়ে তা দেখে নিন। ফরোয়ার্ডিং স্ট্যানজা হলো সেই অনুমতি যা LAN ট্রাফিককে আদৌ টানেল ব্যবহার করতে দেয়। এটি ছাড়া ডিভাইস চালু থাকে, ক্লায়েন্ট সংযুক্ত থাকে, আর কোনো LAN হোস্ট টানেলে পৌঁছায় না। রাউটার ক্লায়েন্টে এটিই সবচেয়ে সাধারণ সংযুক্ত-কিন্তু-ইন্টারনেট-নেই অভিযোগ।
VPN জোনে masquerade প্যাকেট বেরোনোর আগেই প্রতিটি LAN ঠিকানাকে রাউটারের টানেল ঠিকানায় গুটিয়ে দেয়। এতে দূরের পাশে আপনার সাবনেটের দিকে ফেরত রুটের দরকার থাকে না।
দূরের পাশ ইতিমধ্যে আপনার LAN রাউট করলে masquerade বন্ধ রাখা সোর্স ঠিকানা দৃশ্যমান রাখে এবং প্রতি-ক্লায়েন্ট লগকে অর্থবহ করে। একটি বেছে নিন এবং কোনটি লিখে রাখুন, কারণ দুটি বেছে নেওয়া পরে ভিন্ন সাপোর্ট প্রশ্ন তোলে। ডিফল্ট LAN-থেকে-WAN ফরোয়ার্ডিং সরানো একটি আলাদা সিদ্ধান্ত, যার নিজস্ব পরিণতি আছে। সেটি সরালে রাউটারের নিজের ইন্টারনেট অ্যাক্সেসও একসঙ্গে চলে যায়।
NAT-এ আসল আপলিংকের নাম দিন
যে ফার্মওয়্যারে অনুবাদ নিয়মটি হাতে লেখা, সেখানে ভুল হওয়া ক্ষেত্রটি হলো আউটগোয়িং ইন্টারফেস। vlan2 নাম দেওয়া নিয়ম কিছুই করে না যখন সেশন ppp0-এ শেষ হয়। ইন্টারফেসহীন নিয়ম গোপন থাকা উচিত ট্রাফিক অনুবাদ করতে পারে। কোনোটিই নিজে থেকে জানায় না, কারণ টানেল কাজ করতে থাকে।
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
ওই নিয়মে ppp0-কে ip route বা চলমান ইন্টারফেস তালিকার ইন্টারফেস দিয়ে বদলান, তারপর LAN হোস্ট একটি পেজ লোড করার সময় কাউন্টার দেখুন। এক সরবরাহকারীর রাউটারে আপলিংকের জন্য একটি masquerade নিয়মই সাধারণত যথেষ্ট। টানেল ইন্টারফেসের জন্য দ্বিতীয় নিয়ম প্রথমটির বিকল্প নয়।
তারপর ক্লায়েন্ট অপশন যোগ করুন যা ঠিক করে টানেলে কী ঢোকে। redirect-gateway নির্দেশ ক্লায়েন্টের ইন্টারনেট ট্রাফিক VPN দিয়ে পাঠায়, আর এটি ছাড়া টানেল কেবল সার্ভারের ঠেলে দেওয়া রুট বহন করে। DNS ছোঁয়ার আগে ফলের রুট টেবিল দেখে নিন।
দ্বিতীয় টেবিল দিয়ে Wi-Fi ভাগ করুন
একটি রাউটিং টেবিল দুটি ডিফল্ট ধরে রাখতে পারে না। তাই টানেল এড়াতে হওয়া দ্বিতীয় SSID-এর নিজের সাবনেট ও নিজের টেবিল দরকার। টানেলযুক্ত SSID-কে নিজের রেঞ্জ দিন, তারপর টেবিল বেছে নেওয়া নিয়ম দিয়ে কেবল সেই রেঞ্জই টানেলে পাঠান।
OpenWrt-এ পলিসি-রাউটিং প্যাকেজগুলো ঠিক এই সমন্বয়ই প্রকাশ করে। হাতেও করা যায়: একটি সোর্স নিয়ম আর এমন টেবিল যার ডিফল্ট টানেল ডিভাইসের দিকে যায়।
দুই নেটওয়ার্ক থেকেই ভাগটি যাচাই করুন। টানেলযুক্ত SSID-এর ক্লায়েন্ট VPN-এর এক্সিট ঠিকানা দেখাবে, আর সাধারণ SSID-এর ক্লায়েন্ট সরবরাহকারীর ঠিকানা দেখাবে। দুটোই একই রকম দেখালে নিয়ম ভুল সোর্সের সঙ্গে মেলে বা টেবিলটি কখনো পড়া হয় না। পুনরায় সংযোগের পরেও পরীক্ষা করুন, কারণ ইন্টারফেসের নামের উপর নির্ভর করা নিয়ম ডিভাইস নতুন নম্বর পেলে ভেঙে যায়।
ঘড়ি ও ডিভাইস ফ্ল্যাগে সন্দেহ করুন
persist-tun ফ্ল্যাগ রিস্টার্টের পরেও টানেল ডিভাইস জায়গায় রাখে। এটি সার্ভারের জন্য ভালো, কিন্তু যে ক্লায়েন্টের অবস্থা শুরু থেকে গড়া উচিত তাকে বিভ্রান্ত করে। রাউটার ক্লায়েন্টের সমস্যা দেখার সময় এটি সরান, কারণ ব্যর্থ দর-কষাকষি থেকে টিকে যাওয়া ডিভাইস লুকায় কোন ধাপটি সত্যিই ভেঙেছিল। ক্লায়েন্ট নির্ভরযোগ্যভাবে সংযোগ হওয়ার পরেই এটি ফিরিয়ে দিন, তার আগে নয়।
ঘড়িই আরেকটি নীরব ব্যর্থতা। ব্যাটারিচালিত ঘড়ি না থাকা রাউটার এপক থেকে শুরু করে, মানে NTP মিলিয়ে না নেওয়া পর্যন্ত সার্টিফিকেট যাচাই ব্যর্থ হয়। সার্টিফিকেট ছোঁয়ার আগে লগের টাইমস্ট্যাম্প বাস্তব সময়ের সঙ্গে মিলিয়ে দেখুন, কারণ বুটের এক মিনিট পরে সংযোগ হওয়া ক্লায়েন্ট সাধারণত সময় সমন্বয়ের অপেক্ষায় থাকে।