Express.js req.ip กำลังส่งคืน :: ffff: 127.0.0.1


105

ฉันกำลังพยายามรับ IP ของผู้ใช้ที่ร้องขอ ปัญหาคือ IP ที่จะกลับมาแทน::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?
Aleksandr M

req.ipเพียงแค่พยายามreq.ipsทดสอบ ::ffff:ฉันเพียงแค่ไม่แน่ใจว่าสิ่งที่เป็นสาเหตุของคำนำหน้า
rockerBOO

stackoverflow.com/q/5861107/1700321 , en.wikipedia.org/wiki/IPv6_address#Presentation Dotted-quad notation
Aleksandr M

ใช่นี่คือมัน Windows 7 มีชั้นการเปลี่ยนแปลงสำหรับคำขอ IPv4 และเพิ่มคำนำหน้านี้ใน IP
rockerBOO

คำตอบ:


167

::ffff:เป็นคำนำหน้าเครือข่ายย่อยสำหรับที่อยู่ IPv4 (32 บิต) ที่อยู่ภายในช่องว่าง IPv6 (128 บิต) IPv6 แบ่งออกเป็นสองส่วนคือคำนำหน้าเครือข่ายย่อยและส่วนต่อท้ายของอินเทอร์เฟซ แต่ละอันมีความยาว 64 บิตหรือ 4 กลุ่มของอักขระเลขฐานสิบหก 4 ตัว

ใน IPv6 คุณได้รับอนุญาตให้ลบเลขศูนย์นำหน้าแล้วลบเลขศูนย์ที่ต่อเนื่องกันซึ่งหมายถึง::ffff:แปลตามความเป็นจริงที่0000:0000:ffff:0000อยู่นี้ถูกกำหนดให้เป็นคำนำหน้าเครือข่ายย่อย IPv4 ถึง IPv6 ดังนั้นโปรเซสเซอร์ IPv6 ใด ๆ จะเข้าใจว่ามันทำงานกับที่อยู่ IPv4 และจัดการกับมัน ตามนั้น

ในอนาคตอันใกล้ที่อยู่ IP ทั้งหมดจะเป็น IPv6 นั่นเป็นเพราะเรามีจำนวนเกือบหมด (4.2 พันล้านลบพื้นที่สำหรับวัตถุประสงค์อื่น ๆ ) ในพื้นที่ที่อยู่ IPv4

IPv6 ช่วยให้มีพื้นที่กว้างขวางมากขึ้น "340 undecillion ควรจะเพียงพอสำหรับทุกคน" - Bill Gates พูดใน IPv6

สิ่งสำคัญคือต้องเริ่มกำหนดแอดเดรส IP โดยใช้เนมสเปซ IPv6 ดังนั้นจึงต้องรวม::ffff:โค้ดของคุณไว้ด้วยเนื่องจากในอนาคตจะมีข้อมูลเลขฐานสิบหกจริงระหว่างโคลอน หากคุณตัดออกด้วยเหตุผลด้านความสวยงามรหัสของคุณจะพังเมื่อเปลี่ยนเป็นเครือข่าย IPv6 หรือพบกับที่อยู่ IPv6

บางเครือข่ายกำลังใช้งาน IPv6 และคุณจะต้องเผชิญกับที่อยู่ IP IPv6 ในไม่ช้า ก้าวกระโดดทันทีหรือเสี่ยงต่อการทำลายรหัสของคุณในอนาคต

TL; DR (สั้น) ของเรื่องคือ: ทุกอย่างทำงานได้ดี อย่าเปลี่ยนมันเป็นเวอร์ชัน IPv6 ของที่อยู่ IPv4

IPv4 IPv6

หากคุณต้องการทำให้รหัสของคุณเข้ากันได้กับ IPv6 สิ่งที่คุณต้องทำคือตรวจสอบ::ffff:คำนำหน้า ... หากมีอยู่ให้ลบออกและประมวลผลส่วนที่เหลือเป็น IPv4 ... หาก::ffff:ไม่มีอยู่จะเป็นที่อยู่ IPv6 และ จำเป็นต้องดำเนินการดังกล่าว คุณตรวจสอบอีกครั้งได้โดยดูว่ามีจุดอยู่ในสตริงหรือไม่ถ้าเป็นเช่นนั้นก็คือ IPv4

จำไว้สำหรับทุกสิ่งยกเว้นการปรับเปลี่ยนที่อยู่ IP คุณแค่บันทึก IP ใช่ไหม? สิ่งนี้จะมีความสำคัญต่อตัวแยกวิเคราะห์และบันทึกการรวมที่คาดหวัง::ffff:127.0.0.1และเช่นนี้ในอนาคต เว้นแต่ว่าคุณต้องการแก้ไข IP เพียงแค่ปล่อยให้เป็นสิ่งที่คุณได้รับ


มันฟังดูอันตรายอย่างเป็นธรรมในการตรวจสอบ::ffff:คำนำหน้าแม้ว่า คุณรู้ไหมว่า IPv6 มีสัญกรณ์มากมาย
КонстантинВан

1
ไม่ปลอดภัย :) มีข้อเสนอและมีการใช้งานแล้ว en.wikipedia.org/wiki/… IETF ได้รับการยอมรับว่าเราเตอร์ไม่สามารถเบิร์นหลาย ๆ รอบเพื่อค้นหาที่อยู่ IP ได้และในป่าไม่มีใครเก็บศูนย์เพราะมันเสียพื้นที่ ความคิดที่จะยอมให้เลขศูนย์เป็นเพียงความคิด ในปี 2019 หากคุณส่ง :: ffff: ในแพ็กเก็ตเครือข่ายเป็น 0000: 0000: ffff: 0000 แม้ว่าในทางเทคนิคจะถูกต้องสำหรับข้อเสนอดั้งเดิม แต่ก็ไม่ถูกต้องสำหรับคำแนะนำ IETF ปัจจุบันและจะไม่ปรากฏในเราเตอร์ที่รองรับ IPv6 ส่วนใหญ่
Nick Steele

1
ดังนั้นฉันจึงมั่นใจได้ว่าพวกเขาอยู่ในรูปแบบบัญญัติเสมอ ไม่รู้ว่าสิ่งต่างๆเกิดขึ้นในป่าได้อย่างไร ขอบคุณ.
КонстантинВан

1
นี่เป็นเรื่องธรรมดาที่น่าเสียดาย มนุษย์ให้ความสนใจเมื่อจำเป็นเท่านั้น มีคนร่างบางสิ่งบางอย่างการออกแบบดั้งเดิมรองรับคุณสมบัติมากมายพวกเขาสร้าง RFC ไม่มีใครให้ความสำคัญกับหลาย ๆ ส่วนของการออกแบบมันกลายเป็นมาตรฐานจากนั้นเมื่อนำไปใช้คนสังเกตเห็นว่าจำเป็นต้องมีการเปลี่ยนแปลงครั้งใหญ่ :) IPv6 เป็นเรื่องแปลกเล็กน้อย เพราะการเรียกมันว่า "ปืนใหญ่" เป็นเรื่องแปลกเล็กน้อย พวกเขาน่าจะเรียกมันว่า "1.1" หรืออะไรสักอย่างเพื่อให้ผู้คนเข้าใจได้อย่างรวดเร็วว่าเกิดอะไรขึ้น แต่เนื่องจากเลขศูนย์ที่เป็นตัวเลือกของร่างต้นฉบับทำให้คุณใช้จ่ายในการคำนวณมากขึ้น 10 เท่าในเราเตอร์จึงถูกเพิกเฉย
Nick Steele

29

ดูเหมือนจะเป็นมุมมองของ ipv6: สำหรับที่อยู่ ipv4 ดูเหมือนว่า ipv6 จะผสมสัญกรณ์ ipv6 กับสัญกรณ์ ipv4

เพื่อให้ได้ทั้งที่อยู่ ipv4 และ ipv6 ในรูปแบบธรรมดาที่ไม่ผสมฉันใช้:

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

18

หากคุณต้องการ 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

Windows 7 เปิดใช้งาน IPv6 โดยค่าเริ่มต้น แม้ว่าเซิร์ฟเวอร์ของฉันจะรับฟังเฉพาะ IPv4 แต่ Windows 7 จะส่ง::ffff:คำนำหน้าไปยัง IPv4 ซึ่งเป็นส่วนหนึ่งของการเปลี่ยนไปใช้ IPv6

::ffff:0:0:0/96 - คำนำหน้าที่ใช้สำหรับที่อยู่ที่แปล IPv4 ซึ่งใช้โดยโปรโตคอล Stateless IP / ICMP Translation (SIIT)

การเปลี่ยนจาก IPv4


8

ฉันมีปัญหากับการพยายามเปรียบเทียบที่อยู่ที่แมป ipv4 และพบว่าไลบรารีipaddr.js มีประโยชน์ :-)

เช่น

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


-2

คุณสามารถรับที่อยู่ Ip ของคุณคนเดียวหรือกับครอบครัวที่ระบุโดยใช้ซ็อกเก็ต

     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]);  
      }

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.