VPN-এ IPv6 লিঙ্ক-লোকাল কাজ করছে না: fe80 কেন লিঙ্কেই থেমে যায়
একটি fe80:: ঠিকানা কেবল একটি লিঙ্কেই অর্থ বহন করে। কেন রাউটেড VPN এটি বহন করতে পারে না, ব্যর্থতা কেমন দেখায় এবং বদলে কোন ঠিকানা ব্যবহার করবেন তা দেখুন।
আপনি টানেল তুললেন, টানেলকে সোর্স ইন্টারফেস ধরে fe80::1-এ ping করলেন, আর কিছুই ফেরত এল না। এটি আপনার ভুলে যাওয়া কোনো ফায়ারওয়াল নিয়ম নয়। লিঙ্ক-লোকাল ঠিকানা কেবল যে একক লিঙ্কে এটি তৈরি হয়েছে সেখানেই অর্থ বহন করে, আর রাউটেড VPN সেই লিঙ্ক নয়। দূরবর্তী রাউটারের fe80::1 দূরবর্তী LAN সেগমেন্টে থাকে; আপনি অন্য সেগমেন্টে এক হপ দূরে বসে আছেন, এবং রাউটার যেন লিঙ্ক-লোকাল প্যাকেট একেবারেই ফরওয়ার্ড করতে পারে, IPv6-এ এমন কোনো ব্যবস্থাই নেই।
fe80 প্রিফিক্স একটি পরিসর নয়, একটি ব্যাপ্তি বোঝায়
লিঙ্ক-লোকাল ইউনিকাস্ট হলো fe80::/10, আর এখানে নির্ধারক বৈশিষ্ট্য সংখ্যা নয়, ব্যাপ্তি। ঠিকানাটি কেবল একটি লিঙ্কেই বৈধ, এবং প্রতিটি ইন্টারফেস নিজের শনাক্তকারী থেকে একটি তৈরি করে; তাই দুটি অসংশ্লিষ্ট নেটওয়ার্কের দুটি অসংশ্লিষ্ট মেশিন বিনা দ্বন্দ্বে একই fe80::1-এ সাড়া দিতে পারে। প্রিফিক্সটি মূলত বলে “কোনো এক লিঙ্কে”; লিঙ্কটি নিজেই আসে প্রসঙ্গ থেকে।
হোস্টে সেই প্রসঙ্গ হলো জোন, বা স্কোপ আইডি, যা আপনি শতাংশ চিহ্নের পরে যোগ করেন: Linux-এ fe80::1%eth0, Windows-এ এবং ইন্টারফেস ইনডেক্স দেখায় এমন টুলে fe80::1%3 বা fe80::1%12। কার্নেল ইন্টারফেস ইনডেক্সসহ ঠিকানাটি সমাধান করে তারপর পাঠায়। জোন বাদ দিলে গন্তব্য অস্পষ্ট হয়ে যায়, ফলে স্ট্যাকের সেগমেন্ট বাছাই করার কোনো উপায় থাকে না।
কেন রাউটেড টানেল এটি পৌঁছাতে পারে না
রাউটেড VPN হলো একটি পয়েন্ট-টু-পয়েন্ট ইন্টারফেস যা নিজের ঠিকানা বহন করে, সাধারণত টানেলের ভেতরে ইউনিক-লোকাল বা প্রাইভেট IPv6 স্পেসের একটি /64। দূরবর্তী LAN আলাদা একটি লিঙ্ক, যা টানেল এন্ডপয়েন্ট আপনার পক্ষে রাউটিং ও ফরওয়ার্ডিং করে পৌঁছায়। এগুলো দুটি আলাদা সেগমেন্ট, তাই একটির ঠিকানা অন্যটিতে বৈধ গন্তব্য নয়।
ফরওয়ার্ডিং নিয়মটি আপনার ক্লায়েন্টের খুঁটিনাটি নয়, স্ট্যান্ডার্ডেই স্পষ্ট: রাউটার লিঙ্ক-লোকাল সোর্স বা গন্তব্যযুক্ত প্যাকেট ফরওয়ার্ড করে না। এজন্যই রাউট টেবিল ঠিক দেখালেও প্যাকেটটি মরে যায়। টানেলের দিকে fe80::/64-এর একটি রুট যোগ করুন; মানসম্মত স্ট্যাক হয় তা প্রত্যাখ্যান করবে, নয়তো গ্রহণ করে প্রতিটি মিলে যাওয়া প্যাকেট ফেলে দেবে: গন্তব্যের ব্যাপ্তি বলে “কেবল এই লিঙ্ক”, আর আউটগোয়িং ইন্টারফেস সেই লিঙ্ক নয়।
প্রতিবেশী আবিষ্কার একই সীমারেখা জোরদার করে। হোস্টরা লিঙ্ক-স্কোপড মাল্টিকাস্টে 255 হপ লিমিটসহ প্রতিবেশী অনুরোধ পাঠিয়ে লিঙ্ক-লোকাল পরবর্তী হপ সমাধান করে, যাতে রাউটার ফরওয়ার্ড করা যেকোনো কিছু প্রত্যাখ্যান করতে পারে। এটি টানেলজুড়ে কাজ করাতে হলে দূরবর্তী সেগমেন্টের জন্য আবিষ্কার প্রক্সি করতে হবে, যা ভিন্ন টুপি পরা লেয়ার 2 ব্রিজিং।
আরও নিঃশব্দ একটি দ্বিতীয় ব্যর্থতা আছে, যা রুট জোর করে বসাতে চাওয়া মানুষদের বিপাকে ফেলে: জোন। আপনি লোকালে যে জোনই টাইপ করুন, তা টানেল ইন্টারফেসের নাম দেয়, অথচ আপনার কাঙ্ক্ষিত ঠিকানাটি বাঁধা থাকে দূরবর্তী LAN ইন্টারফেসে। দুটো কখনো মেলে না, তাই প্যাকেট সঠিক ইন্টারফেসে দূর প্রান্তে পাঠানো যায় না।
ব্যবহারে ব্যর্থতাটি কেমন দেখায়
স্কোপ ভুলের জন্য টুলের আউটপুট রাউটিং বা ফায়ারওয়াল ত্রুটির মতো শোনায়, আর ঠিক এজন্যই মানুষ ভুল স্তরে একটা বিকেল নষ্ট করে।
| What you run | What you see | What it means |
|---|---|---|
| ping fe80::1 with no zone | Invalid argument on Linux, or a transmit failure on Windows | The stack cannot pick an interface for an ambiguous destination |
| ping -6 -I tun0 fe80::1 | Destination unreachable, or a silent timeout | The address is not on the tunnel link, so there is nothing on-link to answer |
| ssh user@fe80::1 after the tunnel is up | Hangs, then no route to host | The SYN never left the machine in a deliverable form; the server logs nothing |
| ip -6 neigh show dev tun0 | Empty table | No neighbor entry can exist for a link-local host that is not on this link |
| fe80::/64 inside AllowedIPs or route-ipv6 | Config accepted, traffic still dropped | The tunnel carried the packet; the receiving stack refused to forward it |
তৃতীয় সারিটি সবচেয়ে বেশি সময় নষ্ট করে, কারণ আউটপুটহীন ssh ক্লায়েন্ট শোনা-সেবার সমস্যার মতো দেখায়। ঢোকার কোনো পথ থাকলে দূর প্রান্ত দেখুন এবং sshd সব ঠিকানায় বাঁধা নাকি একটিতে, তা নিশ্চিত করুন।
রাউট করার জন্যই বরাদ্দ একটি ঠিকানা ব্যবহার করুন
টানেল দিয়ে যা কিছুতে পৌঁছাতে হবে, তার জন্য সেবাটিকে যে ঠিকানা দেওয়া হয়েছে সেটিই ব্যবহার করুন: একটি গ্লোবাল ইউনিকাস্ট ঠিকানা, অথবা fc00::/7 থেকে একটি ইউনিক-লোকাল ঠিকানা, অর্থাৎ ঠিক এই অভ্যন্তরীণ ক্ষেত্রের জন্য সংরক্ষিত পরিসর। শ্রোতাটি সত্যিই এটি বাঁধে কি না এবং ফেরত পথ ও হোস্ট ফায়ারওয়ালের নিয়ম যাচাই করুন।
অনুমান না করে দূরবর্তী হোস্টটি দেখুন। ip -6 addr show থাকা ঠিকানাগুলো তালিকাভুক্ত করে, আর ss -6 -ltn দেখায় ডেমনটি কী শুনছে। কেবল fe80::-এ বাঁধা সেবা কেবল নিজের সেগমেন্ট থেকেই পৌঁছানো যায়; এটি সাধারণত এমন একটি ডিফল্ট যা কেউ ইচ্ছে করে বাছেনি এবং প্রশাসকের সম্মতিতে বদলানো যায়।
সেবাটি সত্যিই পুনরায় বাঁধা না গেলে ব্রিজটিকে নেটওয়ার্ক স্তরের বদলে অ্যাপ্লিকেশন স্তরে তুলুন। দূরবর্তী হোস্টে একটি রিলে যা রাউটযোগ্য ঠিকানায় শোনে এবং লিঙ্ক-লোকাল ঠিকানায় সংযোগ করে, কোনো সেগমেন্ট না বাড়িয়েই সমস্যার সমাধান করে:
socat TCP6-LISTEN:8080,bind=[fd00:1:2::10] TCP6:[fe80::1%eth0]:80এখানে জোনটি সঠিক পাশে, যে হোস্টে সত্যিই সেই লিঙ্কে eth0 আছে সেখানে। আপনার ক্লায়েন্ট fd00:1:2::10-এর সঙ্গে কথা বলে, যা স্বাভাবিকভাবেই রাউট হয়, আর রিলে লিঙ্ক-লোকাল হপটি লোকালেই করে দেয়। একই কৌশল কাজ করে কোনো অ্যাপ্লায়েন্সের ওয়েব UI বা পুরোনো BMC-র ক্ষেত্রে, যা কেবল একটি লিঙ্ক-লোকাল ঠিকানাই ঘোষণা করে।
কখন ব্রিজিংই সঠিক উত্তর, আর কী যাচাই করবেন
কিছু স্থাপনায় সত্যিই একটি সাধারণ সেগমেন্ট দরকার: এমন ডিভাইস যা কেবল লিঙ্ক-লোকাল আবিষ্কারেই কথা বলে, মাল্টিকাস্টের উপর নির্ভরশীল অ্যাপ্লায়েন্স, বা সমতল LAN পুনরুৎপাদন করা ল্যাব। এটি লেয়ার 2-এর সমস্যা এবং লেয়ার 2-এর উত্তর দরকার, যেমন দূরবর্তী ইন্টারফেসে ব্রিজ করা tap ডিভাইস বা স্পষ্ট ব্রিজড মোডযুক্ত ক্লায়েন্ট পণ্য। এতে টানেল পার হওয়া ব্রডকাস্ট ও মাল্টিকাস্ট ট্রাফিক এবং প্রান্ত থেকে প্রান্তে কাজ করতে হওয়া প্রতিবেশী আবিষ্কারের খরচ আছে।
রাউটেড প্রোফাইলে fe80::/64 যোগ করে এর অনুকরণ করবেন না। তাতে সবচেয়ে খারাপ অবস্থা তৈরি হয়: কনফিগ শেষ দেখায়, রাউট টেবিলে এন্ট্রি দেখায়, আর প্রতিটি প্যাকেট তখনো দুই স্ট্যাকের মাঝে কোথাও ফেলে দেওয়া হয়, যদিও দুটোই সঠিক আচরণ করছে।
ping নয়, ইন্টারফেস দিয়ে যাচাই করুন। ip -6 addr show tun0 বলে টানেল লিঙ্ক নিজের একটি লিঙ্ক-লোকাল ঠিকানা তৈরি করেছে কি না, আর ip -6 route get fe80::1%tun0 বলে কার্নেল স্কোপড গন্তব্য নিয়ে সত্যিই কী করবে। কার্নেল যখন বলে সেই ইন্টারফেসে গন্তব্যে পৌঁছানো যায় না, তখন কোনো টানেল সেটিং তা বদলাবে না, এবং প্রোফাইল সম্পাদনা বন্ধ করার সময় এসেছে।
প্রশ্নটি নিষ্পত্তি করা একটি সংক্ষিপ্ত ধারা:
- দূরবর্তী হোস্টে ঠিকানাটি পড়ুন এবং তা fe80:: নাকি রাউটযোগ্য প্রিফিক্স, তা খেয়াল করুন।
- যদি fe80:: হয়, তবে সেবাটি পুনরায় বাঁধুন, সেই হোস্টে রিলে করুন বা সেগমেন্ট ব্রিজ করুন; রাউটযোগ্য হলে রুট, ফায়ারওয়াল বা বাইন্ড ঠিকানা ঠিক করুন।
- প্রতিবার পুনঃপরীক্ষার সময় জোনটি আবার যাচাই করুন, কারণ কপি করা কমান্ড সাধারণত ভুল ইন্টারফেসই ধরে রাখে।
সূত্র: RFC 4291, IPv6 ঠিকানা স্থাপত্য.