मैंने एक Debian गेटवे पर net.ipv6.conf.all.forwarding=1 सेट किया ताकि वह VPN क्लाइंट का ट्रैफ़िक आगे भेज सके, और लगभग आधे घंटे बाद मशीन के पास कोई IPv6 डिफ़ॉल्ट रूट नहीं बचा। ऊपरी राउटर चालू था, link-local पड़ोसी अब भी जवाब दे रहा था, और अपलिंक के पास अब भी अपना वैश्विक पता था। जो रुका था वह कर्नेल की उस इंटरफ़ेस पर राउटर विज्ञापन स्वीकार करते रहने की तैयारी थी। रूट उस पल नहीं गायब हुआ जब मैंने sysctl लिखा; वह तब गायब हुआ जब RA से सीखे गए डिफ़ॉल्ट रूट की आयु समाप्त हुई और किसी ने उसे नवीनीकृत नहीं किया।

पहली नज़र में कुछ भी टूटा नहीं लगा। फ़ॉरवर्डिंग काम कर रही थी, क्लाइंट तब तक निकल रहे थे जब तक पुराना रूट कैश में था, और विफलता उस बदलाव से देर से आई जिसने उसे पैदा किया था। यही देरी वजह है कि इल्ज़ाम ऊपरी पक्ष या ऐसे फ़ायरवॉल नियम पर डाला जाता है जो कभी शामिल ही नहीं था।

किसी भी sysctl को छूने से पहले रूट की तालिका पढ़ें

ip -6 route show default से शुरू करें और सिर्फ़ गेटवे नहीं, विशेषताएँ पढ़ें। RA से सीखा गया डिफ़ॉल्ट रूट proto ra से चिह्नित होता है, वरीयता रखता है और expires की उलटी गिनती दिखाता है। हाथ से जोड़े गए रूट में इनमें से कुछ भी नहीं होता, और यही अंतर बताता है कि रूट का मालिक कौन-सा तंत्र है।

$ ip -6 route show default
default via fe80::1 dev eth0 proto ra metric 1024 expires 1432sec hoplimit 64 pref medium

फिर पता देखें: ip -6 addr show dev eth0। घंटों में मापी गई वरीय और वैध आयु वाला वैश्विक पता ऐसे डिफ़ॉल्ट रूट से ज़्यादा जिएगा जिसकी राउटर आयु मिनटों में मापी जाती है। पता मौजूद हो और डिफ़ॉल्ट रूट न हो, यह विज्ञापन समस्या का हस्ताक्षर है। अगर पता भी न हो तो पहले लिंक, प्रीफ़िक्स जानकारी या डुप्लिकेट पता पहचान के पीछे लगना चाहिए।

फ़ॉरवर्डिंग RA प्रोसेसिंग क्यों बंद कर देती है

RA 134 प्रकार का ICMPv6 पैकेट है, जो link-local स्रोत से 255 हॉप सीमा के साथ भेजा जाता है। कर्नेल इसका उपयोग करने से पहले इंटरफ़ेस का accept_ra देखता है। डिफ़ॉल्ट मान 1 है, और 1 का मतलब हाँ नहीं है। इसका मतलब है: तभी स्वीकार करो जब तक यह होस्ट फ़ॉरवर्ड न कर रहा हो। forwarding=1 सेट करें और वह शर्त विफल हो जाती है, इसलिए विज्ञापन उसके भीतर के किसी भी प्रीफ़िक्स या डिफ़ॉल्ट राउटर पर विचार से पहले गिरा दिया जाता है।

तीन मान हैं, और फ़ॉरवर्डिंग से सिर्फ़ तीसरा बचता है:

accept_raforwarding=0forwarding=1
0ignoredignored
1 (default)acceptedignored
2acceptedaccepted

दो और फ़्लैग तय करते हैं कि वास्तव में क्या इंस्टॉल होता है। accept_ra_defrtr नियंत्रित करता है कि विज्ञापन का डिफ़ॉल्ट राउटर रूट बनता है या नहीं, और accept_ra_pinfo नियंत्रित करता है कि प्रीफ़िक्स जानकारी पता कॉन्फ़िगरेशन के लिए इस्तेमाल होती है या नहीं। accept_ra_defrtr को बंद करना फ़ॉरवर्डिंग होस्ट पर बिना डिफ़ॉल्ट रूट सीखे SLAAC पते रखने का आम तरीका है। यह accept_ra से अलग लीवर है, और पते चाहिए पर रूट नहीं, तब यही उपयोग होता है। कर्नेल का IP sysctl संदर्भ तीनों की सूची देता है।

तीन कमांड से पुष्टि करें

पहले वे मान पढ़ें जो चल रहे हैं, न कि वह फ़ाइल जिसे आप लोड मान रहे हैं:

sysctl net.ipv6.conf.eth0.forwarding net.ipv6.conf.all.forwarding \
       net.ipv6.conf.eth0.accept_ra net.ipv6.conf.eth0.accept_ra_defrtr

दूसरा, सिद्ध करें कि विज्ञापन अब भी आ रहे हैं। ICMPv6 प्रकार के बाइट पर फ़िल्टर करना पर्याप्त है, और यह पड़ोसी खोज के ट्रैफ़िक की दीवार पढ़ने से बचाता है:

tcpdump -ni eth0 'icmp6 and ip6[40] == 134'

अगर कई मिनट तक कुछ न दिखे तो accept_ra आपकी समस्या नहीं है। ऊपरी पक्ष ने विज्ञापन देना बंद कर दिया, रास्ते में कुछ ICMPv6 फ़िल्टर कर रहा है, या वह इंटरफ़ेस सचमुच उस सेगमेंट में नहीं है जो आप सोच रहे हैं। तीसरा, स्वयं एक विज्ञापन माँगें और उसके फ़ील्ड पढ़ें:

rdisc6 eth0

rdisc6 Debian और Ubuntu पर ndisc6 पैकेज में आता है। आउटपुट में कुछ और बदलने से पहले राउटर आयु और वरीयता देखें। राउटर आयु 0 वाला विज्ञापन डिफ़ॉल्ट राउटर हटाने का निर्देश है, और accept_ra का कोई मान उसे उपयोगी रूट नहीं बनाता। इसी तरह ब्रिज मोड में ऊपरी CPE भी पकड़ा जाता है, जो प्रीफ़िक्स बाँटता है पर स्वयं को कभी राउटर के रूप में पेश नहीं करता।

अपलिंक को एकमात्र अनुमति देने वाला इंटरफ़ेस बनाएँ

अगर ऊपरी पक्ष को डिफ़ॉल्ट राउटर होना चाहिए, तो फ़ॉरवर्डिंग के बावजूद वहीं विज्ञापन स्वीकार करें, और कहीं नहीं:

# /etc/sysctl.d/60-ipv6-router.conf
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.eth0.accept_ra = 2
net.ipv6.conf.eth0.accept_ra_defrtr = 1

सीमा तय करना ज़रूरी है क्योंकि Linux में IPv6 फ़ॉरवर्डिंग एक वैश्विक स्विच है, हर लिंक के लिए एक नहीं। net.ipv6.conf.wg0.forwarding में 1 लिखें और फिर net.ipv6.conf.all.forwarding पढ़ें: वैश्विक मान पलट जाता है और हर इंटरफ़ेस फ़ॉरवर्ड करने लगता है। आप टनल पर राउटर और LAN पर साधारण होस्ट एक साथ नहीं हो सकते। जिसे सीमित कर सकते हैं वह स्वीकृति है। accept_ra=2 को अपलिंक पर रखें और टनल तथा LAN इंटरफ़ेस 1 या 0 पर छोड़ दें, ताकि टनल से आया भटका हुआ विज्ञापन उसके भीतर जाता कोई डिफ़ॉल्ट रूट न लगा सके।

अस्थायी sysctl -w अगले बूट तक नहीं टिकेगा, और systemd-networkd तथा NetworkManager दोनों ये मान अपने कॉन्फ़िगरेशन से लिखते हैं। networkd में अपलिंक की .network फ़ाइल में IPv6Forwarding=yes और IPv6AcceptRA=yes सेट करें; networkd कर्नेल के उसी कारण IPv6Forwarding को वैश्विक बताता है। NetworkManager में अपलिंक पर ipv6.method=auto ही accept_ra का मान चलाता है, इसलिए पहली जाँच पर भरोसा करने के बजाय nmcli connection up के बाद sysctl फिर पढ़ें।

स्थिर विकल्प ip -6 route add default via fe80::1 dev eth0 सचमुच काम करता है, और जब ऊपरी राउटर के पास स्थिर link-local पता हो तो यह उचित उत्तर है। साफ़ जानें कि आप क्या छोड़ रहे हैं। स्थिर डिफ़ॉल्ट रूट कभी नवीनीकृत नहीं होता और कभी वापस नहीं लिया जाता, इसलिए ऊपरी पक्ष बदलने के बाद भी वह मृत पड़ोसी की ओर इशारा करता रहता है। RA का रूट सुरक्षित रूप से विफल होता है; स्थिर चुपचाप विफल होता है।

फ़ॉरवर्ड किया गया पैकेट जाँचें, गेटवे का अपना नहीं

गेटवे के अपने पिंग ऐसे रूट पर सफल हो सकते हैं जिसे कोई क्लाइंट उपयोग नहीं कर सकता, और इसलिए भी सफल हो सकते हैं कि गेटवे ही स्रोत है। किसी जुड़े क्लाइंट से जाँचें, फिर गेटवे से पूछें कि वह उस क्लाइंट के पते के लिए क्या करेगा:

# on the VPN client
ping -6 -c 3 2001:4860:4860::8888

# on the gateway, using a client address
ip -6 route get 2001:4860:4860::8888 from fd42:20::2

फिर एक राउटर आयु प्रतीक्षा करें और दोबारा देखें। जो स्थिर स्थिति चाहिए वह proto ra चिह्नित डिफ़ॉल्ट रूट है जिसका expires मान बार-बार रीसेट होता रहता है, साथ में all.forwarding=1। अगर expires सिर्फ़ उलटी गिनती कर रहा है तो विज्ञापन अब भी कहीं गिराए जा रहे हैं, और आम दोषी वह नेटवर्क प्रबंधक है जो बूट के समय का sysctl चल चुकने के बाद accept_ra को फिर से लिख देता है।

इसे बंद करने से पहले चार बातें पुष्टि करें: डिफ़ॉल्ट रूट proto ra है और नवीनीकृत हो रहा है, accept_ra=2 सिर्फ़ अपलिंक पर लागू है, रीबूट के बाद और प्रबंधक के रीस्टार्ट के बाद भी फ़ॉरवर्डिंग 1 है, और IPv6 पिंग क्लाइंट पूरा करता है, गेटवे नहीं। स्वस्थ रूट के बावजूद क्लाइंट विफल रहे तो अगला संदिग्ध वापसी का रास्ता या ऊपरी फ़ायरवॉल है, विज्ञापन नहीं।

संबंधित लेख