Saat ini saya mencoba mendapatkan IP dari pengguna yang diminta. Masalahnya adalah IP kembali, ::ffff:127.0.0.1
bukan 127.0.0.1
. Saya mencoba menggunakan trusted proxy
opsi (meskipun tidak menggunakan proxy) dan req.ips
kosong. Menggunakan 4.x Express.js.
router.get('/', function(req, res, next) {
console.log('ip', req.ip)
res.send({})
});
req.ip
ataureq.ips
?req.ip
, baru saja dicobareq.ips
sebagai ujian. Saya hanya tidak yakin apa yang menyebabkan awalan::ffff:
.Dotted-quad notation
.Jawaban:
::ffff:
adalah awalan subnet untuk alamat IPv4 (32 bit) yang ditempatkan di dalam ruang IPv6 (128 bit). IPv6 dipecah menjadi dua bagian, awalan subnet, dan akhiran antarmuka. Masing-masing memiliki panjang 64 bit, atau, 4 grup dengan 4 karakter heksadesimal.Di IPv6, Anda diizinkan untuk menghapus angka nol di depan, dan kemudian menghapus angka nol yang berurutan, yang berarti
::ffff:
benar-benar diterjemahkan menjadi0000:0000:ffff:0000
, alamat ini telah ditetapkan sebagai awalan subnet IPv4 ke IPv6, sehingga prosesor IPv6 apa pun akan memahami bahwa itu berfungsi dengan alamat IPv4 dan menanganinya demikian.Dalam waktu dekat, semua alamat IP akan menjadi IPv6, ini karena kami hampir kehabisan jumlah (4,2 miliar, dikurangi beberapa ruang untuk tujuan lain-lain) di ruang alamat IPv4.
Penting untuk mulai menangani alamat IP menggunakan namespace IPv6 dan karena itu sertakan
::ffff:
dalam kode Anda karena di masa mendatang akan ada data heksadesimal nyata di antara titik dua tersebut. Jika Anda melepasnya karena alasan estetika, kode Anda akan rusak saat beralih ke jaringan IPv6 atau dihadapkan dengan alamat IPv6.Beberapa jaringan saat ini menjalankan IPv6 dan Anda akan segera dihadapkan dengan alamat IP IPv6; lakukan lompatan sekarang atau risiko melanggar kode Anda di masa mendatang.
Versi TL; DR (singkat) dari masalah ini adalah: Semuanya bekerja dengan baik. Jangan mengubahnya, ini adalah versi IPv6 dari alamat IPv4.
Jika Anda ingin membuat kode Anda kompatibel dengan IPv6, yang harus Anda lakukan adalah memeriksa
::ffff:
prefiks ... jika ada, hapus dan proses sisanya sebagai IPv4 ... jika::ffff:
tidak ada, itu adalah alamat IPv6 dan perlu diproses seperti itu. Anda dapat memeriksa ulang dengan melihat apakah titik ada dalam string, jika demikian, itu adalah IPv4.Ingatlah untuk semuanya kecuali penyesuaian yang perlu Anda lakukan pada alamat IP, Anda hanya merekam IP, bukan? Ini akan menjadi penting bagi parser dan agregat log yang diharapkan
::ffff:127.0.0.1
dan semacamnya di masa mendatang. Kecuali Anda perlu mengubah IP, biarkan saja seperti yang Anda terima.sumber
::ffff:
awalannya . Anda tahu, IPv6 memiliki banyak notasi.Ini tampaknya merupakan kekhasan dari ipv6: untuk alamat ipv4, ipv6 tampaknya mencampur notasi ipv6 dengan notasi ipv4.
Untuk mendapatkan alamat ipv4 dan ipv6 dalam notasi sederhana dan tidak tercampur, saya menggunakan:
sumber
Jika Anda hanya membutuhkan IPv4, Anda dapat memaksa server node untuk mendengarkan menggunakan IPv4.
Untuk pengeditan aplikasi ekspres
/bin/www
:perubahan
untuk
Setidaknya ini berhasil bagi saya.
https://nodejs.org/api/net.html#net_server_listen_port_host_backlog_callback
sumber
Windows 7 memiliki IPv6 yang diaktifkan secara default. Meskipun server saya hanya mendengarkan IPv4, Windows 7 mengirimkan
::ffff:
awalan ke IPv4 sebagai bagian dari transisi ke IPv6Transisi dari IPv4
sumber
Saya mengalami masalah dengan mencoba membandingkan alamat yang dipetakan ipv4, dan menemukan perpustakaan ipaddr.js membantu :-)
misalnya
sumber
Coba ini untuk mendapatkan alamat ip yang tepat dengan menghapus subnetting,
sumber
Anda bisa mendapatkan alamat Ip Anda sendiri atau dengan Keluarga yang ditentukan menggunakan soket
sumber
sumber