ZeroTier এক্সিট নোড কাজ করছে না? রুট, NAT ও ক্লায়েন্ট যাচাই করুন
ক্লায়েন্টে 0.0.0.0/0 রুট মানেই এক্সিট নয়। নোডকে ফরওয়ার্ড ও ট্রান্সলেট করতে হবে, নেটওয়ার্ককে রুট বিজ্ঞাপন দিতে হবে, আর ক্লায়েন্টকে তা মেনে নিতে হবে।
রুট টেবিলে ZeroTier ইন্টারফেস দিয়ে একটি ডিফল্ট দেখায়, নেটওয়ার্ক অনলাইন বলে জানায়, তবুও ব্রাউজার স্থানীয় ISP ঠিকানা থেকেই বের হয়। এই সমন্বয় সাধারণ, এবং এটি ক্লায়েন্টের বাগ নয়। ডিফল্ট রুট শুধু বলে প্যাকেটগুলো কোথায় যাবে; অন্য প্রান্তে কিছু একটা সেগুলো ফরওয়ার্ড ও ট্রান্সলেট করতে হবে। এক্সিট নোড কাজ করার আগে তিনটি আলাদা অংশ সত্য হতে হবে।
রুট আছে, কিন্তু কিছুই বের হয় না
প্রথমে ক্লায়েন্টের রুট টেবিল দেখুন। default via 10.147.20.5 dev zt0-এর মতো একটি লাইন প্রমাণ করে রুটটি ইনস্টল হয়েছে, কিন্তু গন্তব্য ট্রাফিক গ্রহণ করবে তা নয়। পরের হপটি এমন সদস্য হতে হবে যে এটি ফরওয়ার্ড করতে ইচ্ছুক ও সক্ষম।
যদি একই অনুরোধ এখনও ফিজিক্যাল ইন্টারফেস দিয়ে বের হয়, তাহলে ক্লায়েন্ট রুটটি ইনস্টল করেনি, বা এমন মেট্রিকে ইনস্টল করেছে যা স্থানীয় ডিফল্টের কাছে হেরেছে। রুট ইনস্টল হওয়ার পর অনুরোধ অদৃশ্য হলে, এক্সিট সদস্য প্যাকেট পাচ্ছে কিন্তু সেগুলো ফরওয়ার্ড বা ট্রান্সলেট করতে ব্যর্থ হচ্ছে। যে ক্লায়েন্ট ফিজিক্যাল ডিফল্ট ধরে রাখে সে এক্সিটে আদৌ কোনো প্যাকেট পাঠায় না।
এই পার্থক্যই ঠিক করে কোথায় কাজ করতে হবে। পরিবর্তনের আগে ও পরে একটি পাবলিক ঠিকানা তুলনা করলে কখনও ব্যবহৃত হয়নি এমন রুটকে ব্যবহৃত হয়ে বাদ পড়া রুট থেকে আলাদা করা যায়, এবং পুরো কনফিগারেশন পর্যালোচনার বদলে একটি কমান্ডই লাগে। অন্য কিছু বদলানোর আগে তুলনাটি করুন, যাতে দুই ফলাফল একই শুরুর অবস্থা থেকে আসে।
তিনটি অংশ যা সবই সত্য হতে হবে
এক্সিট একটি শৃঙ্খল, আর দুর্বলতম লিঙ্কই লক্ষণ নির্ধারণ করে। নিচের টেবিলে লিঙ্কগুলো সাধারণত যে ক্রমে ব্যর্থ হয় সেই ক্রমে দেওয়া আছে।
| Part | Where it lives | What a failure looks like |
|---|---|---|
| Forwarding and NAT | Exit node kernel and firewall | Traffic arrives, no reply |
| Managed default route | ZeroTier network controller | No default via the tunnel on the member |
| Client acceptance | Member's per-network setting | Route offered but not installed |
| DNS behavior | Client resolver configuration | Pages fail by name, IP works |
প্রথম সারিটি হলো যা অপশনের নাম লুকায়। একটি সদস্য তখনই এক্সিট হয় যখন তার কার্নেল ZeroTier ইন্টারফেস ও ইন্টারনেটমুখী ইন্টারফেসের মধ্যে প্যাকেট ফরওয়ার্ড করে, এবং যখন উত্তরপথ টানেলে ফিরে ট্রান্সলেট হয়। সেই ফরওয়ার্ডিং ছাড়া সদস্যটি গেটওয়ে নয়, সহকর্মী।
কন্ট্রোলার সারিটি অনুমোদন, কনফিগারেশন নয়। কোনো সদস্যের মাধ্যমে 0.0.0.0/0 বিজ্ঞাপন দিলে প্রতিটি ক্লায়েন্ট জানে এক্সিট কোথায়; কিন্তু তা সদস্যটিকে ট্রাফিক বহনে সক্ষম করে না। এটি এটাও যাচাই করে না যে সদস্যের ইন্টারনেটে কাজ করা পথ আছে। ZeroTier-এর এক্সিট-নোড ডকুমেন্টেশন নোড, রুট ও ক্লায়েন্টের মধ্যে একই বিভাজন কভার করে।
এক্সিট নোডকে ফরওয়ার্ড ও ট্রান্সলেট করার জন্য সাজান
IPv4 ফরওয়ার্ডিং স্থায়ীভাবে চালু করুন, তারপর WAN ইন্টারফেস ছেড়ে যাওয়া ট্রাফিকের জন্য সোর্স NAT যোগ করুন। ফিল্টার নিয়মগুলোকে দুই দিকেই ফরওয়ার্ডেড প্রবাহ অনুমোদন করতে হবে, কারণ ফরওয়ার্ডিং ও ট্রান্সলেশন অনুমতির থেকে আলাদা:
sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i zt0 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o zt0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPTzt0 ও eth0-কে হোস্টের নাম দিয়ে বদলান; উদাহরণ ইন্টারফেসের জন্য সংরক্ষিত নিয়ম বাস্তব ইন্টারফেসে প্যাকেট অনুসরণ করে না। যে ফায়ারওয়াল ম্যানেজার নিয়মগুলোর মালিক তার মাধ্যমে পরিবর্তনগুলো স্থায়ী করুন, কারণ ইন্টারঅ্যাকটিভ শেলে দেওয়া কমান্ড পরের রিবুটে হারিয়ে যায়।
হোস্টে UFW বা firewalld-এর মতো ফায়ারওয়াল ম্যানেজার চললে, পাশে iptables লাইন স্তূপ না করে সেই ম্যানেজারের মাধ্যমেই নিয়মগুলো যোগ করুন। একই চেইন সম্পাদনা করা দুই মালিক বুট ক্রমের ওপর নির্ভরশীল নীতি তৈরি করে। ম্যানেজার নিজের চেইন তৈরি করলে ক্রম গুরুত্বপূর্ণ। ম্যানেজার রিলোড করার পর ক্লায়েন্ট থেকে পরীক্ষা করুন, আগে নয়।
রুট বিজ্ঞাপন দিন এবং ক্লায়েন্টে তা গ্রহণ করুন
নেটওয়ার্ক কন্ট্রোলারে 0.0.0.0/0-এর জন্য একটি ম্যানেজড রুট যোগ করুন যার পরের হপ এক্সিট সদস্যের ZeroTier ঠিকানা। তারপর যে সদস্যের এটি ব্যবহার করা উচিত সেখানে সেই নেটওয়ার্কের জন্য ওভাররাইড অনুমোদন করুন। অনুমতিটি স্থানীয়: এটি অন্য সদস্যদের পুনরায় কনফিগার করে না এবং কন্ট্রোলারও বদলায় না।
zerotier-cli listnetworks
zerotier-cli set <network-id> allowDefault=1
ip route get 1.1.1.1শেষ কমান্ডটি ZeroTier ইন্টারফেস ও এক্সিট সদস্যের ঠিকানা জানানো উচিত। যদি এটি এখনও ফিজিক্যাল ইন্টারফেস জানায়, তাহলে রুটটি অনুপস্থিত বা প্রতিদ্বন্দ্বী ডিফল্টের মেট্রিক ভালো।
সেটিংটি কেবল যে নেটওয়ার্কের প্রয়োজন তার মধ্যেই রাখুন। ডিফল্ট-রুট গ্রহণ বিশ্বব্যাপী চালু করা, বা এমন নেটওয়ার্কে যার কেবল একটি প্রাইভেট সাবনেট দেওয়ার কথা, ট্রাফিককে এমন এক্সিট দিয়ে পাঠায় যা কখনও তার জন্য মাপা হয়নি।
এক্সিট যাচাই করুন এবং অন্য ঠিকানা পরিবারগুলো দেখুন
এমন একটি সেবা থেকে পাবলিক ঠিকানা চান যা উৎস জানায়, এবং তা এক্সিট নোডের WAN ঠিকানার সঙ্গে তুলনা করুন। তারপর নামযুক্ত একটি সাইট লোড করে নিশ্চিত করুন DNS এখনও রিজলভ করে, এবং কেবল ব্রাউজার নয় বরং গুরুত্বপূর্ণ একটি অ্যাপ্লিকেশন পরীক্ষা করুন।
ডুয়াল-স্ট্যাক ক্লায়েন্ট তার নিজস্ব IPv6 পথ ব্যবহার চালিয়ে যেতে পারে, যখন IPv4 ZeroTier দিয়ে বের হয়। যদি লক্ষ্য হয় সব ট্রাফিক লুকানো বা নিয়ন্ত্রণ করা, তাহলে আলাদা ::/0 রুট ও এক্সিটে IPv6 ফরওয়ার্ডিং দরকার, আর IPv4 পরীক্ষা সেগুলো সম্পর্কে কিছুই বলে না।
Linux-এর রিভার্স-পাথ ফিল্টারিংও ক্লায়েন্টে বৈধ এক্সিট ট্রাফিক ফেলে দিতে পারে। ZeroTier অংশগ্রহণকারী সদস্যদের জন্য rp_filter বিবেচনা নথিভুক্ত করে; সেই সেটিংটি ইচ্ছাকৃতভাবে এবং কেবল রুট ও NAT নিশ্চিত হওয়ার পর বদলান, প্রথম পরীক্ষা হিসেবে নয়।
যদি প্রয়োজনটি NAS বা একটি অফিস সাবনেটে প্রবেশ হয়, তাহলে সেই প্রিফিক্সের জন্য ম্যানেজড রুট সম্পূর্ণ এক্সিটের চেয়ে ছোট ও নিরাপদ পরিবর্তন। সব ব্রাউজিং অন্য ডিভাইস দিয়ে পাঠানো একটি প্রাইভেট রিসোর্সে পৌঁছানোর চেয়ে আলাদা সিদ্ধান্ত, এবং তা আলাদা পর্যালোচনার দাবি রাখে।