Express.js req.ip geri dönüyor :: ffff: 127.0.0.1


103

Şu anda istenen kullanıcının IP'sini almaya çalışıyorum. Sorun, IP'nin ::ffff:127.0.0.1yerine geri dönmesidir 127.0.0.1. trusted proxySeçeneği kullanmayı denedim (bir proxy kullanmamasına rağmen) ve req.ipsboş. 4.x Express.js kullanma.

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

Öyleyse ne kullanıyorsun req.ipveya req.ips?
Aleksandr M

req.ip, sadece req.ipstest olarak denedim . Öneke neyin sebep olduğundan emin değilim ::ffff:.
rockerBOO


Evet buydu. Windows 7, IPv4 istekleri için bir geçiş katmanına sahiptir ve bu öneki IP'ye ekler.
rockerBOO

Yanıtlar:


160

::ffff:bir IPv6 (128 bit) alanı içine yerleştirilen IPv4 (32 bit) adresleri için bir alt ağ önekidir. IPv6, alt ağ öneki ve arabirim soneki olmak üzere iki bölüme ayrılmıştır. Her biri 64 bit uzunluğunda veya 4 onaltılık karakterden oluşan 4 gruptur.

IPv6'da, baştaki sıfırları kaldırmanıza ve ardından ardışık sıfırları kaldırmanıza izin verilir, yani ::ffff:aslında 0000:0000:ffff:0000bu adres IPv4'ten IPv6'ya alt ağ öneki olarak belirlenmiştir, bu nedenle herhangi bir IPv6 işlemcisi bir IPv4 adresiyle çalıştığını anlayacak ve işleyecektir. buna göre.

Yakın gelecekte, IP adreslerinin tümü IPv6 olacaktır, çünkü IPv4 adres alanında neredeyse sayı sayımız yok (4,2 milyar eksi çeşitli amaçlar için biraz boşluk).

IPv6 çok daha geniş bir alana izin verir. "340 undesilyon herkes için yeterli olmalı" - Bill Gates IPv6 üzerinden konuşuyor.

IP adreslerini IPv6 ad alanını kullanarak adreslemeye başlamak ve bu nedenle ::ffff:kodunuza eklemek önemlidir çünkü gelecekte bu iki nokta üst üste arasında gerçek onaltılık veriler olacaktır. Estetik nedenlerle onu çıkarırsanız, kodunuz bir IPv6 ağına geçtiğinde veya bir IPv6 adresiyle karşılaştığında kırılır.

Bazı ağlar şu anda IPv6 kullanıyor ve yakında IPv6 IP adresleriyle karşılaşacaksınız; şimdi sıçrama yapın veya gelecekte kodunuzu kırma riskini alın.

Konunun TL; DR (kısa) versiyonu şudur: Her şey yolunda gidiyor. Değiştirmeyin, bu bir IPv4 adresinin IPv6 sürümüdür.

IPv4 IPv6

Kodunuzu IPv6 ile uyumlu hale getirmek istiyorsanız, tek yapmanız gereken ::ffff:öneki kontrol etmektir ... eğer varsa, kaldırın ve geri kalanını IPv4 olarak işleyin ... ::ffff:yoksa, bu bir IPv6 adresidir ve bu şekilde işlenmesi gerekiyor. Dizede nokta olup olmadığını kontrol ederek iki kez kontrol edebilirsiniz, öyleyse IPv4'tür.

IP adreslerinde yapmanız gereken ayarlamalar dışında her şeyi aklınızda bulundurun, sadece IP'yi kaydediyorsunuz, değil mi? ::ffff:127.0.0.1Gelecekte bekleyeceği ayrıştırıcı ve günlük kümeleri için önemli olacak. Bir IP'yi değiştirmeniz gerekmedikçe, onu aldığınız gibi bırakın.


Yine de ::ffff:öneki kontrol etmek oldukça tehlikeli geliyor . Biliyorsunuz, bir IPv6'nın birçok gösterimi vardır.
Константин Ван

1
Hayır güvenli :) Teklif var, sonra uygulama var. en.wikipedia.org/wiki/… IETF, yönlendiricilerin IP adreslerini arayan bu kadar çok döngüyü yakamayacağını ve ayrıca vahşi ortamda, boşa harcandığı için hiç kimsenin sıfırları tutmadığını fark etti. Sıfırlara izin verme fikri sadece bir fikirdi. 2019'da bir ağ paketinde :: ffff: 'yi 0000: 0000: ffff: 0000 olarak gönderdiyseniz, teknik olarak orijinal teklif için geçerli olsa da, mevcut IETF önerisi için geçersizdir ve çoğu IPv6 uyumlu yönlendiricide görülmeyecektir.
Nick Steele

1
Böylece her zaman kanonik formda olduklarından emin olabilirim . Vahşi doğada işlerin nasıl gittiğini bilmiyordum. Teşekkürler.
Константин Ван

1
Bu maalesef yaygındır. İnsanlar sadece gerektiğinde dikkat ederler. Birisi bir şeyler tasarlar, orijinal tasarım bir çok özelliği destekler, bir RFC yapar, kimse tasarımın pek çok parçasına gerçekten dikkat etmez, bu bir standart haline gelir, sonra uygulandığında insanlar büyük değişikliklerin gerekli olduğunu fark eder :) IPv6 biraz garip çünkü buna "topçu" demek biraz tuhaf. Muhtemelen buna "1.1" veya başka bir şey demeliler ki, insanlar neler olup bittiğini çabucak anlayabilsinler, ancak orijinal taslağın isteğe bağlı sıfırları, yönlendiricilerde 10 kat daha fazla hesaplama yapmanıza neden olduğu için, basitçe göz ardı edildi.
Nick Steele

29

Bu ipv6'nın bir tuhaflığı gibi görünüyor: ipv4 adresleri için ipv6, ipv6 gösterimini ipv4 gösterimi ile karıştırıyor gibi görünüyor.

Hem ipv4 hem de ipv6 adreslerini basit, karıştırılmamış gösterimde almak için kullanıyorum:

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


10

Windows 7'de IPv6 varsayılan olarak etkindir. Sunucum yalnızca IPv4'ü dinlese de, Windows 7 ::ffff:öneki IPv6'ya geçişin bir parçası olarak IPv4'e gönderiyor

::ffff:0:0:0/96 - Durumsuz IP / ICMP Translation (SIIT) protokolü tarafından kullanılan IPv4 ile çevrilmiş adresler için kullanılan bir önek.

IPv4'ten geçiş


8

İpv4 ile eşlenmiş adresleri karşılaştırmaya çalışırken sorunlar yaşıyordum ve ipaddr.js kitaplığını yararlı buldum :-)

Örneğin

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

4

Alt ağı kaldırarak tam ip adresi almak için bunu deneyin,

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

-2

Ip adresinizi tek başına veya belirtilen aile ile soketleri kullanarak alabilirsiniz.

     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();

Diğer yanıtların da açıkladığı gibi, bu bir IPv6 adresidir. @ Nick Steele'in yukarıdaki cevabına bakın. Bunu gerçekten yapmak istemiyorsun.
Misha Nasledov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.