Express.js req.ip लौट रहा है :: ffff: 127.0.0.1


98

मैं वर्तमान में अनुरोधित उपयोगकर्ता का आईपी प्राप्त करने की कोशिश कर रहा हूं। समस्या यह है कि आईपी के ::ffff:127.0.0.1बजाय लौट रहा है 127.0.0.1। मैंने trusted proxyविकल्प का उपयोग करने की कोशिश की (हालांकि प्रॉक्सी का उपयोग नहीं किया गया req.ipsहै ) और रिक्त है। 4.x Express.js का उपयोग करना।

router.get('/', function(req, res, next) {
    console.log('ip', req.ip)
    res.send({})
});

तो आप क्या उपयोग कर रहे हैं req.ipया req.ips?
एम

req.ip, बस req.ipsएक परीक्षण के रूप में की कोशिश की । मैं अभी निश्चित नहीं हूं कि उपसर्ग क्या है ::ffff:
रॉकरबो


हाँ यही था। विंडोज 7 में आईपीवी 4 अनुरोधों के लिए एक संक्रमण परत है, और आईपी के लिए इस उपसर्ग को जोड़ता है।
घुमाव 21

जवाबों:


156

::ffff:IPv4 (32 बिट) पते के लिए एक सबनेट उपसर्ग है जो IPv6 (128 बिट) स्थान के अंदर रखा गया है। IPv6 को दो भागों में विभाजित किया गया है, सबनेट उपसर्ग और इंटरफ़ेस प्रत्यय। प्रत्येक एक 64 बिट्स लंबा है, या 4 हेक्साडेसिमल वर्णों के 4 समूह हैं।

IPv6 में, आपको अग्रणी शून्य को निकालने की अनुमति है, और फिर लगातार शून्य हटा दें, जिसका अर्थ ::ffff:वास्तव में अनुवाद है 0000:0000:ffff:0000, इस पते को IPv4 के रूप में IPv6 सबनेट प्रीफ़िक्स के रूप में नामित किया गया है, इसलिए कोई भी IPv6 प्रोसेसर समझेगा कि IPv4 पते के साथ काम करना और उसे संभालना तदनुसार।

निकट भविष्य में, आईपी पते सभी आईपीवी 6 होंगे, ऐसा इसलिए है क्योंकि हम आईपीवी 4 पता स्थान में लगभग संख्या (4.2 बिलियन, शून्य से कुछ स्थान नीचे। उद्देश्यों के लिए) हैं।

IPv6 एक बहुत बड़ी जगह के लिए अनुमति देता है। "340 अविवेक किसी के लिए पर्याप्त होना चाहिए" - बिल गेट्स IPv6 पर बोल रहे हैं।

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

कुछ नेटवर्क वर्तमान में IPv6 चला रहे हैं और आप जल्द ही IPv6 IP पते के साथ सामना करेंगे; अब छलांग लगाओ या भविष्य में अपने कोड को तोड़ने का जोखिम उठाएं।

इस मामले का टीएल; डीआर (संक्षिप्त) संस्करण है: सब कुछ ठीक काम कर रहा है। इसे न बदलें, यह IPv4 पते का IPv6 संस्करण है।

आईपीवी 6 आईपीवी 4

यदि आप अपने कोड को IPv6 के अनुकूल बनाना चाहते हैं, तो आपको बस इतना करना होगा कि ::ffff:उपसर्ग की जांच करें ... यदि यह मौजूद है, तो इसे हटा दें और शेष को IPv4 के रूप में संसाधित करें ... यदि ::ffff:मौजूद नहीं है, तो यह एक IPv6 पता है और इस तरह से संसाधित करने की आवश्यकता है। यदि पीरियड्स स्ट्रिंग में हैं, तो आप यह देखकर डबल-चेक कर सकते हैं, यदि ऐसा है तो यह IPv4 है।

सब कुछ के लिए ध्यान में रखें, लेकिन आईपी पते के लिए समायोजन की आवश्यकता है, आप सिर्फ आईपी रिकॉर्ड कर रहे हैं, है ना? यह ::ffff:127.0.0.1भविष्य में और इस तरह की उम्मीद करने के लिए पार्सर और लॉग एग्रीगेट्स के लिए महत्वपूर्ण होने जा रहा है । जब तक आपको एक आईपी को बदलने की आवश्यकता न हो, तब तक इसे छोड़ दें जैसा कि आप प्राप्त करते हैं।


यह उपसर्ग के लिए जाँच करने के लिए::ffff: काफी खतरनाक लगता है , यद्यपि। तुम्हें पता है, एक IPv6 में कई सूचनाएं हैं।
Константин Ван

1
यह सुरक्षित नहीं है :) प्रस्ताव है, और फिर कार्यान्वयन है। en.wikipedia.org/wiki/… IETF ने माना है कि राउटर आईपी पते की तलाश में कई चक्रों को जला नहीं सकते हैं, और जंगली में भी, कोई भी शून्य नहीं रखता है क्योंकि यह व्यर्थ स्थान है। शून्य की अनुमति देने का विचार सिर्फ एक विचार था। 2019 में यदि आपने :: ffff: को नेटवर्क पैकेट में 0000: 0000: ffff: 0000 के रूप में भेजा है, हालांकि मूल प्रस्ताव के लिए तकनीकी रूप से मान्य है, तो यह वर्तमान IETF अनुशंसा के लिए अमान्य है और साथ ही अधिकांश IPv6 संगत रूटर्स में भी नहीं देखा जा सकता है।
निक स्टील

1
इसलिए मैं उनके बारे में सुनिश्चित कर सकता हूं जो हमेशा विहित रूपों में होते हैं। पता नहीं कैसे चीजें जंगली में जा रही थीं। धन्यवाद।
Константин Ван

यह दुर्भाग्य से आम है। आवश्यकता होने पर ही मनुष्य ध्यान देता है। कोई व्यक्ति कुछ ड्राफ्ट करता है, मूल डिज़ाइन बहुत सारी विशेषताओं का समर्थन करता है, वे एक RFC बनाते हैं, कोई भी वास्तव में डिज़ाइन के कई हिस्सों पर ध्यान नहीं देता है, यह एक मानक बन जाता है, फिर जब लोगों को नोटिस किया जाता है तो बड़े बदलावों की आवश्यकता होती है :) IPv6 थोड़ा अजीब है क्योंकि इसे "तोपखाना" कहना थोड़ा अजीब है। उन्हें शायद इसे "1.1" या कुछ और कहना चाहिए ताकि लोग जल्दी से समझ सकें कि क्या चल रहा है, लेकिन क्योंकि मूल ड्राफ्ट का वैकल्पिक शून्य आपको राउटर में 10 गुना अधिक गणना खर्च करने की अनुमति देता है, इसे बस नजरअंदाज कर दिया गया था।
निक स्टील

29

यह ipv6 का एक उद्धरण लगता है: ipv4 पतों के लिए, ipv6 ipv4 अंकन के साथ ipv6 अंकन को मिलाता है।

सरल, बेदाग अंकन में ipv4 और ipv6 दोनों पते प्राप्त करने के लिए, मैं उपयोग कर रहा हूं:

var ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
if (ip.substr(0, 7) == "::ffff:") {
  ip = ip.substr(7)
}

14

यदि आपको केवल IPv4 की आवश्यकता है, तो आप IPv4 का उपयोग करके सुनने के लिए नोड सर्वर को बाध्य कर सकते हैं।

एक एक्सप्रेस एप्लिकेशन के लिए संपादित करें /bin/www:

परिवर्तन

server.listen(port);

सेवा

server.listen(port, '0.0.0.0');

इसने मेरे लिए कम से कम काम किया।

https://nodejs.org/api/net.html#net_server_listen_port_host_backlog_callback


10

विंडोज 7 में IPv6 डिफ़ॉल्ट रूप से सक्षम है। हालाँकि मेरा सर्वर IPv4 पर ही सुनता है, Windows 7 ::ffff:IPv4 को संक्रमण के हिस्से के रूप में IPv4 के लिए उपसर्ग भेजता है

::ffff:0:0:0/96 - IPv4- अनुवादित पतों के लिए उपयोग किया जाने वाला एक उपसर्ग जो स्टेटलेस आईपी / आईसीएमपी ट्रांसलेशन (SIIT) प्रोटोकॉल द्वारा उपयोग किया जाता है।

IPv4 से संक्रमण


8

मैं IPv4 मैप किए गए पतों की तुलना करने की कोशिश कर रहा था, और ipaddr.js पाया लाइब्रेरी को उपयोगी :-)

जैसे

_.isEqual(ipaddr.process('::ffff:127.0.0.1'), ipaddr.process('127.0.0.1')) === true

3

सबनेटिंग को हटाकर सटीक आईपी पता प्राप्त करने के लिए इसे आज़माएं,

    let ip = req.headers['x-forwarded-for'] || req.connection.remoteAddress;
    ip = ip.toString().replace('::ffff:', '');

-2

आप अपने आईपी पते को अकेले या सॉकेट का उपयोग करके निर्दिष्ट परिवार के साथ प्राप्त कर सकते हैं

     var app = require('express')();

 app.get("/ip", (req, res) => {
        console.log(req.ip) 
       let ip = req.ip.split(':');
        let ip_details = req.socket.address();
          console.log(ip_details);                     
   // { address: '::ffff:127.0.0.1', family: 'IPv6', port: 3001 

           console.log(ip[3]);//127.0.0.1
                            res.json(ip[3]);  
      }

-2
var ip = req.ip.split(':').pop();

जैसा कि अन्य उत्तर बताते हैं, यह एक आईपीवी 6 पता है। ऊपर @Nee स्टील का जवाब देखें। आप वास्तव में ऐसा नहीं करना चाहते हैं।
मीशा नसलेदोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.