Bagi mereka yang bekerja dari localhost- seperti yang saya lakukan, hasil untuk semua jawaban di bawah (Hampir semua jawaban berfungsi) mungkin datang ::1. Ini kadang membuat saya bingung. Kemudian ditemukan bahwa itu ::1adalah Alamat IP asli dan IPV6notasi untuk localhost. Hope this helps someone
Pramesh Bajracharya
Jawaban:
452
Di requestobjek Anda ada properti yang disebut connection, yang merupakan net.Socketobjek. Objek net.ocket memiliki properti remoteAddress, oleh karena itu Anda harus bisa mendapatkan IP dengan panggilan ini:
Seperti @juand tunjukkan dalam komentar, metode yang benar untuk mendapatkan IP jarak jauh, jika server berada di belakang proxy, adalah request.headers['x-forwarded-for']
Ini memberi saya alamat IP yang berbeda dari apa yang diberikan whatismyip.com kepada saya. Kenapa bisa begitu?
Shamoon
3
Saya memiliki layanan API saya diinstal pada instance no.de. Ketika saya mencoba mengaksesnya dari komputer saya, saya mendapatkan alamat IP "10.2.XXX.YYY" sedangkan IP dunia nyata saya adalah "67.250.AAA.BBB"
Bagi siapa pun yang tertarik, untuk Heroku: request.headers['x-forwarded-for']
FueledPublishing
407
var ip = req.headers['x-forwarded-for']||
req.connection.remoteAddress ||
req.socket.remoteAddress ||(req.connection.socket ? req.connection.socket.remoteAddress :null);
Perhatikan bahwa terkadang Anda bisa mendapatkan lebih dari satu alamat IP req.headers['x-forwarded-for']. Selain itu, x-forwarded-fortajuk tidak akan selalu disetel yang dapat menimbulkan kesalahan.
Format umum bidang ini adalah:
x-diteruskan-untuk:client, proxy1, proxy2, proxy3
di mana nilainya adalah daftar alamat IP yang dipisahkan koma + spasi, yang paling kiri adalah klien asli, dan setiap proksi berturut-turut yang lulus permintaan menambahkan alamat IP dari mana ia menerima permintaan. Dalam contoh ini, permintaan melewati proxy1, proxy2dan kemudian proxy3. proxy3muncul sebagai alamat permintaan yang jauh.
Ini adalah solusi yang disarankan oleh Arnav Gupta dengan perbaikan yang disarankan Martin di bawah dalam komentar untuk kasus-kasus ketika x-forwarded-fortidak disetel:
var ip =(req.headers['x-forwarded-for']||'').split(',').pop().trim()||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress
Ini biasanya bekerja dengan baik tetapi untuk beberapa alasan saya baru-baru ini mendapatkan kesalahan "Tidak dapat membaca properti 'remoteAddress' dari yang tidak terdefinisi" karena ternyata semuanya adalah null / tidak terdefinisi, termasuk req.connection.socket. Saya tidak yakin mengapa / kondisi apa yang menyebabkan hal itu terjadi tetapi akan lebih baik untuk memeriksa yang req.connection.socketada untuk menghindari server Anda crash jika ini terjadi.
Matt Browne
9
Baris terakhir req.connection.socket.remoteAddress galat melempar. Hati-hati.
yAnTar
11
Alamat ip yang dikembalikan adalah :: 1. Mengapa?
Bagusflyer
3
Melihat cara pop () berfungsi, sepertinya Anda akan mendapatkan proksi terakhir dan bukan klien yang Anda inginkan. Apakah aku salah?
Ini akan melakukan upaya terbaik untuk mendapatkan alamat IP pengguna atau mengembalikan 127.0.0.1untuk menunjukkan bahwa itu tidak dapat menentukan alamat IP pengguna. Lihatlah file README untuk opsi lanjutan.
"atau mengembalikan 127.0.0.1 untuk menunjukkan bahwa itu tidak dapat menentukan alamat IP pengguna" Ada perbedaan yang cukup besar antara 127.0.0.1 dan tidak diketahui ...
Nepoxx
4
Itu mengembalikan sesuatu yang aneh bagi saya :ffff:(not my IP address)ketika diuji dari Heroku. Jawaban @ edmar-miyake bekerja dengan baik untuk saya.
Nilloc
Saya bertanya-tanya apa yang akan IP jika Anda menggunakan lookup right2left dalam kasus 'x-forwarded-for'. var ip_info = get_ip (req, right_most_proxy = True), seperti pada beberapa pengaturan, IP klien mungkin IP yang paling tepat.
un33k
2
Metode itu kembali clientIp: '::1'untuk saya. Sepertinya tidak berhasil.
JamEngulfer
@JamEngulfer - ipware hanya berfungsi jika alamat ip diturunkan dengan benar ke aplikasi Anda melalui request.headers []. contoh: AWS LBS mengirim alamat Ip dalam 'x-diteruskan-untuk' sementara NginX kustom banyak menggunakan variabel lain. ipware melakukan upaya terbaik untuk mengetahui alamat IP, tetapi hanya jika IP telah diturunkan di header.
un33k
19
Anda dapat menggunakan permintaan-ip , untuk mengambil alamat ip pengguna. Ini menangani beberapa kasus tepi yang berbeda, beberapa di antaranya disebutkan dalam jawaban lain.
Pengungkapan: Saya membuat modul ini
Install:
npm install request-ip
Di aplikasi Anda:
var requestIp = require('request-ip');// inside middleware handlervar ipMiddleware =function(req, res, next){var clientIp = requestIp.getClientIp(req);// on localhost > 127.0.0.1
next();};
memeriksa kode sumber permintaan paket-ip di github.com/pbojinov/request-ip/blob/master/index.js memeriksa x-forwarded-for dan segala macam header lainnya untuk load balancers populer seperti AWS ELB, Cloudflare , Akamai, nginx, Rackspace LB dan Stingray Riverbed
Giorgio
1
itu kembali nulluntukku.
S.M_Emamian
Hal yang sama malah digunakanrequest.headers['x-forwarded-for']
Jika x-forwarded-fortajuk ada di sana kemudian gunakan itu, jika tidak gunakan .remoteAddressproperti.
The x-forwarded-forheader ditambahkan ke permintaan yang melewati balancers beban (atau jenis proxy) diatur untuk HTTP atau HTTPS (itu juga mungkin untuk menambahkan header ini permintaan ketika menyeimbangkan pada TCP tingkat menggunakan protokol proxy yang ). Ini karena request.connection.remoteAddressproperti akan berisi alamat IP pribadi penyeimbang beban daripada alamat IP publik klien. Dengan menggunakan pernyataan ATAU , dalam urutan di atas, Anda memeriksa keberadaan x-forwarded-forheader dan menggunakannya jika ada, gunakan request.connection.remoteAddress.
Fungsi Berikut memiliki semua kasus yang dibahas akan membantu
var ip;if(req.headers['x-forwarded-for']){
ip = req.headers['x-forwarded-for'].split(",")[0];}elseif(req.connection && req.connection.remoteAddress){
ip = req.connection.remoteAddress;}else{
ip = req.ip;}console.log("client IP is *********************"+ ip);
Jika Anda menggunakan versi ekspres 3.x atau lebih besar, Anda dapat menggunakan pengaturan proxy kepercayaan ( http://expressjs.com/api.html#trust.proxy.options.table ) dan itu akan berjalan di rantai alamat di header x-forwarded-for dan letakkan ip terbaru di rantai yang belum Anda konfigurasikan sebagai proxy tepercaya ke properti ip pada objek req.
function getCallerIP(request){var ip = request.headers['x-forwarded-for']||
request.connection.remoteAddress ||
request.socket.remoteAddress ||
request.connection.socket.remoteAddress;
ip = ip.split(',')[0];
ip = ip.split(':').slice(-1);//in case the ip returned in a format: "::ffff:146.xxx.xxx.xxx"return ip;}
Anda benar, jika Anda ingin ip sebagai string, maka Anda dapat mengganti baris terakhir dengan: ip = ip.split (':'). Slice (-1) [0]
Ahmad Agbaryah
Jawaban khusus kode tidak disarankan. Bisakah Anda menjelaskan bagaimana jawaban ini lebih baik dari yang lebih tua, lebih baik dijelaskan, dan (banyak) lebih upvoted jawaban ?
Dan Dascalescu
5
Peringatan:
Jangan hanya menggunakan ini secara membabi buta untuk pembatasan tingkat penting:
let ip = request.headers['x-forwarded-for'].split(',')[0];
The top jawaban tidak menangani ini dengan pop()ing dari array, yang lebih umum daripada mendapatkan elemen pada indeks 1, yang dapat tertipu oleh curl --header "X-Forwarded-For: 1.2.3.4, 5.6.7.8" "https://example.com".
Dan Dascalescu
3
Jika Anda mendapatkan beberapa IP, ini berfungsi untuk saya:
var ipaddress =(req.headers['x-forwarded-for']||
req.connection.remoteAddress ||
req.socket.remoteAddress ||
req.connection.socket.remoteAddress).split(",")[0];
Header X-Forwarded-For dapat berisi daftar IP proxy yang dipisahkan koma. Pesanannya adalah klien, proxy1, proxy2, ..., proxyN. Di dunia nyata, orang menerapkan proxy yang dapat memasok apa pun yang mereka inginkan di header ini. Jika Anda berada di belakang penyeimbang beban atau sesuatu, Anda setidaknya dapat memercayai IP pertama dalam daftar setidaknya adalah proxy apa pun yang diminta oleh beberapa permintaan.
Punya masalah yang sama ... saya juga baru di javascript tetapi saya menyelesaikan ini dengan req.connection.remoteAddress; yang memberi saya alamat IP (tetapi dalam format ipv6 :: ffff.192.168.0.101) dan kemudian .slice untuk menghapus 7 digit pertama.
var ip = req.connection.remoteAddress;if(ip.length <15){
ip = ip;}else{var nyIP = ip.slice(7);
ip = nyIP;}
ini bukan metode yang baik, karena ipv6 BUKAN hanya 7 digit + IPv4, tetapi bisa sangat berbeda.
Radek
@Radek jika Anda memvalidasi awal alamat, itu sesuai dengan spec (lihat en.wikipedia.org/wiki/IPv6_address pencarian ctrl-f untuk "IPv4-mapped") ip= (ip.length<15?ip:(ip.substr(0,7)==='::ffff:'?ip.substr(7):undefined))akan menggantikan if ... pada kode di atas
tidak disinkronkan
saya pribadi membungkus getClientIp () dari npm request-ip untuk membuat function getClientIp4(req){ var ip=typeof req==='string'?req:getClientIp(req); return (ip.length<15?ip:(ip.substr(0,7)==='::ffff:'?ip.substr(7):undefined)); }yang menerima ip yang sebelumnya diambil, atau objek permintaan sebagai input dan memberikan ip atau tidak didefinisikan sebagai hasilnya
req.ip
source - expressjs.com/en/api.html#req.iplocalhost
- seperti yang saya lakukan, hasil untuk semua jawaban di bawah (Hampir semua jawaban berfungsi) mungkin datang::1
. Ini kadang membuat saya bingung. Kemudian ditemukan bahwa itu::1
adalah Alamat IP asli danIPV6
notasi untuk localhost.Hope this helps someone
Jawaban:
Di
request
objek Anda ada properti yang disebutconnection
, yang merupakannet.Socket
objek. Objek net.ocket memiliki propertiremoteAddress
, oleh karena itu Anda harus bisa mendapatkan IP dengan panggilan ini:Lihat dokumentasi untuk http dan net
EDIT
Seperti @juand tunjukkan dalam komentar, metode yang benar untuk mendapatkan IP jarak jauh, jika server berada di belakang proxy, adalah
request.headers['x-forwarded-for']
sumber
request.headers['x-forwarded-for']
Perhatikan bahwa terkadang Anda bisa mendapatkan lebih dari satu alamat IP
req.headers['x-forwarded-for']
. Selain itu,x-forwarded-for
tajuk tidak akan selalu disetel yang dapat menimbulkan kesalahan.Format umum bidang ini adalah:
x-diteruskan-untuk:
client, proxy1, proxy2, proxy3
di mana nilainya adalah daftar alamat IP yang dipisahkan koma + spasi, yang paling kiri adalah klien asli, dan setiap proksi berturut-turut yang lulus permintaan menambahkan alamat IP dari mana ia menerima permintaan. Dalam contoh ini, permintaan melewati
proxy1
,proxy2
dan kemudianproxy3
.proxy3
muncul sebagai alamat permintaan yang jauh.Ini adalah solusi yang disarankan oleh Arnav Gupta dengan perbaikan yang disarankan Martin di bawah dalam komentar untuk kasus-kasus ketika
x-forwarded-for
tidak disetel:sumber
req.connection.socket
. Saya tidak yakin mengapa / kondisi apa yang menyebabkan hal itu terjadi tetapi akan lebih baik untuk memeriksa yangreq.connection.socket
ada untuk menghindari server Anda crash jika ini terjadi.Jika menggunakan express ...
req.ip
Saya melihat ini lalu saya seperti menunggu, saya menggunakan express. Duh.
sumber
Anda dapat tetap KERING dan cukup gunakan node-ipware yang mendukung IPv4 dan IPv6 .
Install:
Di app.js atau middleware Anda:
Ini akan melakukan upaya terbaik untuk mendapatkan alamat IP pengguna atau mengembalikan
127.0.0.1
untuk menunjukkan bahwa itu tidak dapat menentukan alamat IP pengguna. Lihatlah file README untuk opsi lanjutan.sumber
:ffff:(not my IP address)
ketika diuji dari Heroku. Jawaban @ edmar-miyake bekerja dengan baik untuk saya.clientIp: '::1'
untuk saya. Sepertinya tidak berhasil.Anda dapat menggunakan permintaan-ip , untuk mengambil alamat ip pengguna. Ini menangani beberapa kasus tepi yang berbeda, beberapa di antaranya disebutkan dalam jawaban lain.
Pengungkapan: Saya membuat modul ini
Install:
Di aplikasi Anda:
Semoga ini membantu
sumber
null
untukku.request.headers['x-forwarded-for']
request.headers['x-forwarded-for'] || request.connection.remoteAddress
Jika
x-forwarded-for
tajuk ada di sana kemudian gunakan itu, jika tidak gunakan.remoteAddress
properti.The
x-forwarded-for
header ditambahkan ke permintaan yang melewati balancers beban (atau jenis proxy) diatur untuk HTTP atau HTTPS (itu juga mungkin untuk menambahkan header ini permintaan ketika menyeimbangkan pada TCP tingkat menggunakan protokol proxy yang ). Ini karenarequest.connection.remoteAddress
properti akan berisi alamat IP pribadi penyeimbang beban daripada alamat IP publik klien. Dengan menggunakan pernyataan ATAU , dalam urutan di atas, Anda memeriksa keberadaanx-forwarded-for
header dan menggunakannya jika ada, gunakanrequest.connection.remoteAddress
.sumber
Fungsi Berikut memiliki semua kasus yang dibahas akan membantu
sumber
,
antara saya.Ada dua cara untuk mendapatkan alamat ip:
let ip = req.ip
let ip = req.connection.remoteAddress;
Tetapi ada masalah dengan pendekatan di atas.
Jika Anda menjalankan aplikasi di belakang Nginx atau proxy apa pun, setiap alamat IP akan menjadi
127.0.0.1
.Jadi, solusi terbaik untuk mendapatkan alamat ip pengguna adalah: -
sumber
Jika Anda menggunakan versi ekspres 3.x atau lebih besar, Anda dapat menggunakan pengaturan proxy kepercayaan ( http://expressjs.com/api.html#trust.proxy.options.table ) dan itu akan berjalan di rantai alamat di header x-forwarded-for dan letakkan ip terbaru di rantai yang belum Anda konfigurasikan sebagai proxy tepercaya ke properti ip pada objek req.
sumber
sumber
Peringatan:
Jangan hanya menggunakan ini secara membabi buta untuk pembatasan tingkat penting:
Sangat mudah untuk spoof:
Dalam hal ini alamat IP asli pengguna akan:
Saya terkejut bahwa tidak ada jawaban lain yang menyebutkan ini.
sumber
pop()
ing dari array, yang lebih umum daripada mendapatkan elemen pada indeks 1, yang dapat tertipu olehcurl --header "X-Forwarded-For: 1.2.3.4, 5.6.7.8" "https://example.com"
.Jika Anda mendapatkan beberapa IP, ini berfungsi untuk saya:
sumber
Sederhana mendapatkan ip jarak jauh di nodejs:
sumber
Di simpul 10.14, di belakang nginx, Anda dapat mengambil ip dengan memintanya melalui header nginx seperti ini:
Kemudian di app.js Anda:
Setelah itu, di mana pun Anda ingin itu muncul:
sumber
Saya menyadari ini telah dijawab sampai mati, tetapi inilah versi ES6 modern yang saya tulis yang mengikuti standar eslint airbnb-base.
Header X-Forwarded-For dapat berisi daftar IP proxy yang dipisahkan koma. Pesanannya adalah klien, proxy1, proxy2, ..., proxyN. Di dunia nyata, orang menerapkan proxy yang dapat memasok apa pun yang mereka inginkan di header ini. Jika Anda berada di belakang penyeimbang beban atau sesuatu, Anda setidaknya dapat memercayai IP pertama dalam daftar setidaknya adalah proxy apa pun yang diminta oleh beberapa permintaan.
sumber
Jika Anda menggunakan Graphql-Yoga, Anda dapat menggunakan fungsi berikut:
sumber
Punya masalah yang sama ... saya juga baru di javascript tetapi saya menyelesaikan ini dengan req.connection.remoteAddress; yang memberi saya alamat IP (tetapi dalam format ipv6 :: ffff.192.168.0.101) dan kemudian .slice untuk menghapus 7 digit pertama.
sumber
ip= (ip.length<15?ip:(ip.substr(0,7)==='::ffff:'?ip.substr(7):undefined))
akan menggantikan if ... pada kode di atasfunction getClientIp4(req){ var ip=typeof req==='string'?req:getClientIp(req); return (ip.length<15?ip:(ip.substr(0,7)==='::ffff:'?ip.substr(7):undefined)); }
yang menerima ip yang sebelumnya diambil, atau objek permintaan sebagai input dan memberikan ip atau tidak didefinisikan sebagai hasilnya