क्या आपको अलग-अलग IPv4 और IPv6 को नगीने में निर्देश सुनने की आवश्यकता है?


71

मैंने nginx पर दोहरे-स्टैक IPv4 और IPv6 वर्चुअल होस्ट को संभालने के लिए विभिन्न कॉन्फ़िगरेशन उदाहरण देखे हैं। कई लोग इस पैटर्न का सुझाव देते हैं:

listen 80;
listen [::]:80 ipv6only=on;

जहाँ तक मैं देख सकता हूँ, यह बिल्कुल उसी चीज़ को प्राप्त करता है:

listen [::]:80 ipv6only=off;

आप पूर्व का उपयोग क्यों करेंगे? एकमात्र कारण जो मैं सोच सकता हूं कि यदि आपको अतिरिक्त प्रोटोकॉल की आवश्यकता है जो प्रत्येक प्रोटोकॉल के लिए विशिष्ट है, उदाहरण के लिए यदि आप केवल deferredIPhone4 पर सेट करना चाहते हैं ।


IP स्टैक संस्करण के साथ ऐसा करने के लिए कुछ भी नहीं है, यह एक टीसीपी विकल्प है।
जेवियर लुकास

1
ज़रूर, लेकिन आप इसे listenनिर्देशों में सेट करते हैं , और विकल्प प्रति होस्ट: पोर्ट जोड़ी पर लागू होते हैं।
शाम

हम वास्तव में एक ऐसे मामले की कल्पना नहीं कर सकते जिसमें आप ऐसा करना चाहते हैं। मुझे लगता है कि एकमात्र कारण ऐतिहासिक है और माइकल हैम्पटन ने इसका नामकरण किया था।
जेवियर लुकास

जवाबों:


48

यही कारण है कि शायद है एकमात्र कारण आप पूर्व निर्माण, इन दिनों प्रयोग करेंगे के बारे में।

कारण यह है कि आप देख रहे हैं कि शायदipv6only nginx 1.3.4 में बदल गया है। इससे पहले, यह डिफ़ॉल्ट रूप से off; नए संस्करणों में यह चूक करता है on

यह लिनक्स पर IPV6_V6ONLY सॉकेट विकल्प के साथ बातचीत करने के लिए होता है, और अन्य ऑपरेटिंग सिस्टम पर समान विकल्प, जिनकी चूक आवश्यक रूप से अनुमानित नहीं है। इस प्रकार यह सुनिश्चित करने के लिए कि आपको वास्तव में IPv4 और IPv6 दोनों पर कनेक्शन के लिए पूर्व-पूर्व 1.3.4 पूर्व निर्माण की आवश्यकता थी।

के लिए nginx डिफ़ॉल्ट में परिवर्तन ipv6onlyयह सुनिश्चित करता है कि दोहरी स्टैक सॉकेट्स के लिए ऑपरेटिंग सिस्टम डिफ़ॉल्ट अप्रासंगिक है। अब, nginx या तो स्पष्ट रूप से IPv4, IPv6 या दोनों को बांधता है, कभी भी डिफ़ॉल्ट रूप से दोहरे स्टैक सॉकेट बनाने के लिए OS पर निर्भर नहीं करता है।

दरअसल, मेरे मानक nginx के विन्यास के लिए प्री-1.3.4 में पहला कॉन्फ़िगरेशन है, और 1.3.4 के बाद सभी में दूसरा कॉन्फ़िगरेशन है।

हालाँकि, चूंकि ड्यूल स्टैक सॉकेट को बांधना एक लिनक्स-ओनली चीज़ है, मेरे वर्तमान कॉन्फ़िगरेशन अब पहले उदाहरण की तरह दिखते हैं, लेकिन ipv6onlyसेट के बिना , बुद्धि के लिए:

listen [::]:80;
listen 80;

4
कुछ ऑपरेटिंग सिस्टम OpenBSD की तरह ड्यूल ipv4 और ipv6 सॉकेट बिल्कुल नहीं करते हैं, इसलिए इसके लिए आपको दो बार सुनना होगा।
जस्टिन कॉर्मैक

@JustinCormack हां, आप सही हैं, और मैंने कुछ समय के लिए इसे ध्यान में रखा है। अभी तक इस पोस्ट को अपडेट नहीं किया था।
माइकल हैम्पटन

1
listen localhost:8080;दोनों (1.12.2) को सुनने के लिए लगता है और proxy_pass http://localhost:8080:: 1 और 127.0.0.1 के बीच संतुलन का उपयोग करते हुए - मुझे लॉग में वास्तविक आईपी प्राप्त करने के लिए ipv6 के लिए एक पंक्ति जोड़ना होगाset_real_ip_from 127.0.0.1; set_real_ip_from ::1; real_ip_header X-Forwarded-For;
एंटनी गिब्स

65

यदि आप एक एकल Nginx उदाहरण के साथ कई vhost डोमेन होस्ट करते हैं, तो आप एकल संयुक्त निर्देश का उपयोग नहीं कर सकते हैं

listen [::]:80 ipv6only=off;

उनमें से प्रत्येक के लिए। नग्नेक्स में एक अजीब विचित्रता है जहां आप केवल ipv6onlyप्रत्येक पोर्ट के लिए एक बार पैरामीटर निर्दिष्ट कर सकते हैं , या यह शुरू करने में विफल रहेगा। इसका मतलब है कि आप इसे प्रत्येक vhost डोमेन सर्वर ब्लॉक के लिए निर्दिष्ट नहीं कर सकते।

जैसा कि माइकल ने उल्लेख किया है, नगणक्स 1.3.4 के साथ शुरू, ipv6onlyपैरामीटर चूक करता है on

इसलिए, यदि आप IPv4 और IPv6 दोनों पर एक ही Nginx सर्वर के साथ कई डोमेन होस्ट करना चाहते हैं, तो आपको प्रत्येक डोमेन सर्वर ब्लॉक के लिए दो सुनने के निर्देशों का उपयोग करने के लिए मजबूर किया जाता है:

listen 80;
listen [::]:80; 

इसके अतिरिक्त, जैसा कि सैंडर ने उल्लेख किया है, का उपयोग करते ipv6only=offहुए दोष यह है कि IPv4 पते IPv6 में अनुवादित हैं। यह तब समस्या पैदा कर सकता है जब आपका ऐप Akismet या StopForumSpam जैसे Blacklists के खिलाफ IP चेकिंग करता है क्योंकि जब तक आप एक रिवर्स ट्रांसलेशन लेयर नहीं बनाते हैं, आपका ऐप स्पैमर के IPv4 एड्रेस के IPv6 ट्रांसलेशन की जाँच करेगा, जो IPv4 एड्रेस में से किसी को भी नहीं करेगा। कालीसूची।


2
हां, यह वैसा ही है जैसा मैंने उल्लेख किया है deferred, और अन्य प्रति-प्रोटोकॉल निर्देश। यह उपयोगी होगा यदि वे आपके द्वारा कहे गए निर्देश के लिए सुनो निर्देश से अलग से निर्दिष्ट किए जा सकते हैं।
सिंक्रो

1
और मामले का मूल है, आपको प्रत्येक डोमेन के लिए अलग से निर्देश सुनने की आवश्यकता है। नहीं तो क्या होगा? साइट ipv4 के माध्यम से ठीक काम करेगी और ipv6 के माध्यम से यह nginx स्वागत पृष्ठ दिखाएगा। ROFL
सिल्वर मून

2
पूरी तरह से स्पष्टीकरण के लिए धन्यवाद! जब मैं ipv6only=offएक ही पोर्ट के लिए दो बार निर्दिष्ट करता हूं तो मुझे एक भ्रमित करने वाली त्रुटि मिल रही थी । आपके उत्तर से समस्या हल हो गई!

1
यदि आप 2 vhosts का उपयोग करना चाहते हैं, तो दोनों 443 को सुन रहे हैं listen 443; listen [::]:443;:। का उपयोग listen [::]:80 ipv6only=off;कर एक nginx त्रुटि है कि बंदरगाह पहले से उपयोग में है फेंक देंगे
lukeaus

16

साथ ipv6only=offके रूप में आईपीवी 6 (सॉफ्टवेयर केवल) का उपयोग कर संबोधित करते हैं विन्यास शैली IPv4 पतों दिखाया जा सकता है आईपीवी 4-मैप किया IPv6 पतों उदाहरण के लिए में फ़ाइलों को, वातावरण चर (REMOTE_ADDR) आदि लोग इन


3
हां, उन्हें इस तरह दिखाया गया है।
माइकल हैम्पटन

2

मेरी समझ में (और http://nginx.org/en/docs/http/ngx_http_core_module.html#listen पर डॉक्स के अनुसार ), बस का उपयोग करके

listen 80;

... यदि आप समान पोर्ट पर IPv4 & IPv6 ट्रैफ़िक दोनों को चैनल करना चाहते हैं तो पर्याप्त है।


1
यह पहले से ही स्थापित किया गया है, और प्रश्न में उल्लेख किया गया है। कृपया अंतर के लिए अन्य उत्तर देखें।
सिल्चरो

3
यह मेरे लिए नहीं था, मुझे दोनों की जरूरत थी। wget और कर्ल जहां फेल होने पर ipv6 का उपयोग करते हैं जब तक कि मैंने लाइन नहीं जोड़ी "सुनो [::]: 80 ipv6lyly = on;"
तुलसी A
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.