এই অ্যাপ বাদ দেওয়ার সুইচ নেই: প্রক্রিয়াকে তার নিজস্ব উৎস দিন
রাউটিং ঠিকানা মেলায়, প্রক্রিয়ার নাম নয়। বাদ দেওয়া প্রোগ্রামটিকে তার নিজস্ব উৎস ও টেবিল দিন, অথবা সিদ্ধান্তটি রাউটারে সরিয়ে দিন যেখানে এটি সৎ।
একটি প্রোগ্রাম সাধারণ সংযোগ ব্যবহার করবে আর বাকি সব টানেলে থাকবে, এবং ক্লায়েন্টের এর জন্য কোনো সুইচ নেই। খুঁজলে কোনো লুকানো মেনুও পাওয়া যাবে না। রুটটি প্যাকেটের ভেতরের ফিল্ড থেকে বাছাই করা হয়, আর প্যাকেট বহন করে ঠিকানা ও পোর্ট, যে প্রক্রিয়া এটি তৈরি করেছে তার পরিচয় নয়, তাই বাদ দেওয়াটি সেই ফিল্ডগুলোর একটিতে প্রকাশ করতে হবে। একবার একটি প্যাকেট অনুসরণ করুন, দেখবেন উপলব্ধ বিকল্পগুলো আর রহস্যময় নয়।
কেন ক্লায়েন্ট এটি দিতে পারে না
গন্তব্য রাউটিং গন্তব্য ঠিকানাকে প্রিফিক্সের সঙ্গে তুলনা করে এবং দীর্ঘতম মিল ধরে রাখে। সেই মুহূর্তে প্রতিটি প্যাকেট একই রকম দেখায়, যা-ই এটি তৈরি করে থাকুক। সোর্স নীতি রাউটিং তুলনাটিকে সোর্স ঠিকানায় প্রসারিত করে, এবং প্রতিটি বাস্তব সমাধান এই হুকটিই ব্যবহার করে: সোর্স বদলান, তখন অন্য একটি টেবিল যোগ্য হয়ে ওঠে।
পোর্ট কোনো কাজে আসে না। পোর্টভিত্তিক বাদ দেওয়ার মূল্যায়ন গন্তব্য অনুসন্ধানের আগে করতে হতো, আর সেই সিদ্ধান্তে পোর্টের কোনো ভূমিকা নেই। পোর্টভিত্তিক বাদ দেওয়া বলে যা বিজ্ঞাপিত হয়, তা আসলে অন্য কোনো ফিল্ড দিয়ে বাদ দেয় এবং সেটিকে ঢিলেঢালাভাবে বর্ণনা করে।
প্রকৃত অ্যাপভিত্তিক রাউটিং সেখানেই আছে যেখানে প্ল্যাটফর্ম এর জন্য ব্যবস্থা যোগ করেছে, যেমন Windows-এ ফিল্টার কলআউট বা Android-এ VPN সেবা বাইন্ডিং। ডেস্কটপ OpenVPN ইনস্ট্যান্স এসবের কিছুই বহন করে না, এবং কোনো কনফিগারেশন ফ্ল্যাগ এটি উদ্ভাবন করে না।
Linux: প্রক্রিয়াটি চিহ্নিত করুন, তারপর চিহ্নটি রাউট করুন
সবচেয়ে পরিচ্ছন্ন পদ্ধতি সিদ্ধান্তটিকে সকেটের মালিক প্রক্রিয়ার সঙ্গে যুক্ত করে। owner মিলটি OUTPUT চেইনে স্থানীয়ভাবে উৎপন্ন ট্র্যাফিকের জন্য কাজ করে, তাই সেখানে প্রয়োগ করা একটি চিহ্ন আলাদা টেবিল বাছাই করতে পারে:
iptables -t mangle -A OUTPUT -m owner --uid-owner 1001 -j MARK --set-mark 0x1
ip rule add fwmark 0x1 table 200
ip route add 192.168.1.0/24 dev eth0 src 192.168.1.0 table 200
ip route add default via 192.168.1.1 dev eth0 table 200
ব্যবহারকারী 1001-এর প্যাকেটগুলো তখন টেবিল 200 দেখে সাধারণ গেটওয়ে দিয়ে বের হয়, আর মূল টেবিল বাকি সবকিছু টানেলে পাঠায়। owner মিলটি কেবল স্থানীয়ভাবে উৎপন্ন প্যাকেটে প্রযোজ্য, যা ঠিক সেই ট্র্যাফিক যা এখানে আপনার দরকার, এবং এটি অন্য হোস্টের জন্য ফরওয়ার্ড করা প্যাকেট শ্রেণিবদ্ধ করতে পারে না। উদ্দেশ্য নয়, টুল দিয়ে যাচাই করুন: ss -tnp প্রতিষ্ঠিত সংযোগগুলোর স্থানীয় ঠিকানা ও মালিক প্রক্রিয়া দেখায়, আর ip route get 1.1.1.1 mark 0x1 দেখায় চিহ্নটি কোন টেবিল বাছাই করে।
নেটওয়ার্ক নেমস্পেস একটি স্বতন্ত্র প্রোগ্রামের জন্য আরও মজবুত উত্তর, কারণ এর ভেতরে তৈরি প্রতিটি সকেট নির্মাণগতভাবেই এতে আবদ্ধ থাকে, তাই সহায়ক প্রক্রিয়া ও চাইল্ড সংযোগ কোনো শ্রেণিবিন্যাস ছাড়াই আচরণটি উত্তরাধিকারে পায়। খরচটা প্লাম্বিং: একটি veth জোড়া, প্রতিটি প্রান্তে একটি ঠিকানা, এবং নেমস্পেসের ভেতরে একটি ডিফল্ট রুট যা হোস্টের দিকে ফিরে যায়।
ip netns add novpn
ip link add veth-host type veth peer name veth-ns
ip link set veth-ns netns novpn
ip addr add 10.200.0.1/24 dev veth-host
ip netns exec novpn ip addr add 10.200.0.2/24 dev veth-ns
ip netns exec novpn ip route add default via 10.200.0.1
Windows: গন্তব্যই এখনও সিদ্ধান্ত নেয়
Windows গন্তব্য থেকে আউটগোয়িং ইন্টারফেস বাছাই করে, তাই ভিন্ন পথ চাওয়া প্রোগ্রামকে এমন কিছু বদলাতে হবে যা সেই বাছাইয়ের আগে স্ট্যাক দেখে। ForceBindIP প্রথমার্ধটি সামলায়: এটি একটি প্রোগ্রাম চালু করে যার সকেট ইতিমধ্যেই আপনার নাম দেওয়া স্থানীয় ঠিকানায় আবদ্ধ। একা এতে প্যাকেট কোন ইন্টারফেস দিয়ে বের হয় তা বদলায় না, কারণ রুট এখনও গন্তব্যই বাছাই করে। যে ল্যাপটপের ডিফল্ট রুট টানেলের দিকে যায় সেখানে একটি সোর্স বাইন্ড করুন, প্যাকেট তবুও টানেলে ঢুকে যাবে।
লক্ষণটির একটি পাঠযোগ্য আকৃতি আছে, একবার জেনে গেলে। এটি এমন LAN ঠিকানার ক্ষেত্রে খাটে যা বাছাই করা ইন্টারফেস সরাসরি পৌঁছায়, আর ইন্টারনেটের যেকোনো কিছুর ক্ষেত্রে ব্যর্থ হয় যার রুট টানেলের দিকে যায়। এটি কাজ করছে বলেও মনে হয় যতক্ষণ না প্রোগ্রামটি কাজ একটি সহায়ক প্রক্রিয়াকে দেয়, কারণ যে সহায়ক নিজের সকেট খোলে তাকে বাইন্ডিংয়ের কথা কখনো বলা হয়নি।
একটি প্রক্রিয়া যখন ভুল একক, তখন সিদ্ধান্ত সরান
যদি আসল প্রয়োজন প্রোগ্রাম নয়, একটি ডিভাইস হয়, তবে এটিকে তার নিজস্ব SSID বা VLAN-এ রাখুন এবং রাউটারকে সিদ্ধান্ত নিতে দিন: সেই সোর্স স্বাভাবিক পথ নেয় আর অন্য সোর্সগুলো টানেল ব্যবহার করে। নিবেদিত গেটওয়ে মেশিন অন্য সৎ নকশা: এটি VPN ধরে রাখে এবং রাউটার যেসব গন্তব্য পাঠায় কেবল সেগুলোই গ্রহণ করে। VLAN-এ নীতিটি ডিভাইসের খোলা প্রতিটি ফ্লো কভার করে, যার মধ্যে সেই সহায়ক প্রক্রিয়াগুলোও আছে যা Windows পদ্ধতিটি ভেঙেছিল। বিনিময়টি পরিধি: সেই ডিভাইসের দুটি প্রোগ্রামকে আর আলাদাভাবে বিবেচনা করা যায় না।
দুটিই সোর্স বা গন্তব্য নীতি, যার পরিধি একটি বাক্যে বলা যায়। কোনোটিই অ্যাপভিত্তিক নয়, আর যে নকশা নিজেকে অ্যাপভিত্তিক বলে প্রচার করে, প্রোগ্রামটি যখন তার কাজ দ্বিতীয় প্রক্রিয়ায় অর্পণ করে তখনই প্রথমবার ব্যর্থ হয়।