ノード内のユーザーのIPアドレスを判別する方法

コントローラ内の特定の要求のIPアドレスを確認するにはどうすればよいですか?例えば(明示的に):

app.post('/get/ip/address', function (req, res) {
   //need access to IP address here
})
259
Expressを使用している場合は、 req.ip ソースを使用できます - expressjs.com/ja/api.html#req.ip
追加された 著者 FrickeFresh,
これを試してください: github.com/indutny/node-ip
追加された 著者 Stephen Last,

13 答え

あなたの request オブジェクトには connection というオブジェクトがあります。これは net.Socket オブジェクトです。 net.Socketオブジェクトには remoteAddress というプロパティがあります。したがって、この呼び出しでIPを取得できるはずです。

request.connection.remoteAddress

See documentation for http and net

編集

As @juand points out in the comments, the correct method to get the remote IP, if the server is behind a proxy, is request.headers['x-forwarded-for']

341
追加された
時にはうまくいかないようです。私は一部のクライアント(主にWebクローラ/ボット/エクスプロイトスキャナ)から未定義になっています。どうして?
追加された 著者 ninjaneer,
これはwhatismyip.comが私に与えるIPアドレスとは異なるIPアドレスを与えます。それはなぜでしょうか?
追加された 著者 Shamoon,
no.de インスタンスにAPIサービスをインストールしました。私のコンピュータからアクセスしようとすると、実際のIPアドレスは「67.250.AAA.BBB」ですが、IPアドレスは「10.2.XXX.YYY」になります。
追加された 著者 Shamoon,
それは NULL を返します。
追加された 著者 Shamoon,
request.connection.remoteAddress を偽装することは可能ですか?これはIP接続を受け入れるためのガードとして安全ですか?
追加された 著者 knutole,
興味のある人は、Herokuのために: request.headers ['x-forwarded-for']
追加された 著者 FueledPublishing,
localhostから接続しているということですか?それはあなたに何を与えるのですか?
追加された 著者 topek,
つまり、プロキシの背後にいることを意味します。 req.headers ['HTTP_X_FORWARDED'] を使用して、プロキシによって送信される HTTP_X_FORWARDED
追加された 著者 topek,
それは良くないね。まだヘッダーを調査したいかもしれませんが、別の有用な方法があるかもしれません。これで問題が解決しない場合は、no.deのサポートをお願いします。
追加された 著者 topek,
解決策のように聞こえる、私は答えを更新します。
追加された 著者 topek,
net.Streamはnet.Socketになり、ドキュメントはここにあります: nodejs.org/api /net.html#net_class_net_socket
追加された 著者 monsur,
それはrequest.headers ['X-Forwarded-For']です
追加された 著者 SuitedSloth,
@FueledPublishingこれはロードバランサの背後にあるすべてのホストに当てはまります。これは、ほぼすべての単一Node.jsホストです。
追加された 著者 Pier-Luc Gendreau,
var ip = req.headers['x-forwarded-for'] || 
     req.connection.remoteAddress || 
     req.socket.remoteAddress ||
     (req.connection.socket ? req.connection.socket.remoteAddress : null);

req.headers ['x-forwarded-for'] に複数のIPアドレスを取得できることがあります。また、 x-forwarded-for ヘッダーが必ずしも設定されず、エラーが発生する可能性があります。

フィールドの一般的な書式は次のとおりです。

x-forwarded-for: client, proxy1, proxy2, proxy3

値はコンマ+スペースで区切られたIPアドレスのリストで、一番左は元のクライアント、そして要求を受けた各連続プロキシは要求を受け取ったIPアドレスを追加します。この例では、リクエストは proxy1proxy2proxy3 で渡されます。 proxy3 はリクエストのリモートアドレスとして表示されます。

これは Arnav Gupta が提案した解決策です。 Martin が以下のようにコメントしています。

var ip = (req.headers['x-forwarded-for'] || '').split(',').pop() || 
         req.connection.remoteAddress || 
         req.socket.remoteAddress || 
         req.connection.socket.remoteAddress
315
追加された
pop()が動作する方法を見ると、あなたが望むものではなく、最後のプロキシを取得しようとしているようです。私が間違っている?
追加された 著者 Michel,
私はここにいるが、 req は何ですか?その req オブジェクトが保持するもの、または req.headers などを使用できるようにreqオブジェクトを開始する方法
追加された 著者 Sanjay Khadka,
@ ZhouHaoそれはIPv6形式であなたのIPアドレスです
追加された 著者 L-Samuels,
いい答えです。誰かが簡潔に説明できるのですが、なぜreq.connection.remoteAddressがIPの代わりにffff :: 10.101.214.230の曲を返すのですか? IPV6がプライベートネットワークのIP番号に凝縮されているようです。
追加された 著者 Jeffz,
なぜこのシーケンスを使用するのか教えてください。 `` `req.headers ['x-forwarded-for'] || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress; ``私は理解できません - なぜこの特定の注文ですか?
追加された 著者 kurumkan,
最後の行req.connection.socket.remoteAddressスローエラーです。慎重に。
追加された 著者 yAnTar,
私は@Michelに私が shift()を使うことに同意します。
追加された 著者 Steve Kehlet,
@bagusflyerこれはローカルホストのIPアドレスです
追加された 著者 Andrei Shostik,
これは通常正常に動作しますが、何らかの理由で私は最近、 " req.connection.socket を含むすべてがnull /未定義であったため、" undefinedのプロパティ 'remoteAddress'を読み込めません。なぜ/どのような条件が原因であるのかはわかりませんが、このような場合にサーバーがクラッシュするのを避けるために req.connection.socket が存在することを確認するとよいでしょう。
追加された 著者 Matt Browne,
これらのヘッダーを設定するプロキシの背後にいる場合は、アドレスのリストの最後に追加されます。最後のものはあなたのプロキシによって設定され、前のものは以前のロードバランサから来るか、クライアントから "偽装"されます。私はあなたのLBにヘッダーも上書きするように伝えることができると思います。
追加された 著者 reconbot,
^コアノードのWebサーバー関連モジュールが何であるかを知りたいだけでなく、 expressjs.com
追加された 著者 markthethomas,
正確にログするには、すべてを記録することをお勧めします。私は自分のために転送することができますし、プロキシを使用せず、私のアドレスを削除し、私の価値に置き換えます。
追加された 著者 Shimon Doodkin,
どのようにこれらのヘッダーのなりすましを防ぐために?
追加された 著者 Domi,
問題: x-forwarded-forundefined を返すとエラーが発生します。修正: ||を追加するヘッダーを読んだ後に "" します。最後に、 var ip =(req.headers ['x-forwarded-for'] || '').split( '、')。pop()...
追加された 著者 Martin,
返されるIPアドレスは:: 1です。どうして?
追加された 著者 Zhou Hao,
var ip = req.headers ['x-forwarded-for']。split( '、')。pop()|| req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress
追加された 著者 Arnav Gupta,
不要なものを削除するには、IPアドレスを取得するだけで正規表現を使用します。 var IP =(req.headers ['x-forwarded-for'] || req.connection.remoteAddress).match( "[0-9] +。[0-9]。+ [0-9] +。[ 0‌ -9] + $ ")[0];
追加された 著者 Apha,
上に戻る:regexpはIPv4上でのみ動作し、実稼働環境では使用しないでください。
追加された 著者 Niro,
私のやり方は皆さんからインスピレーションを得ました! var user_ip = false; if(req.headers ['x-forwarded-for']){user_ip = req.headers ['x-forwarded-for']。split( '、')[0]; } user_ip = user_ip || req.connection.remoteAddress || req.socket.remoteAddress || req.connection.socket.remoteAddress;
追加された 著者 Tim,

DRY のままで、サポートする ノードipware を使用することができます IPv4IPv6 の両方にあります。

インストール:

npm install ipware

あなたのapp.jsまたはミドルウェア:

var getIP = require('ipware')().get_ip;
app.use(function(req, res, next) {
    var ipInfo = getIP(req);
    console.log(ipInfo);
   //{ clientIp: '127.0.0.1', clientIpRoutable: false }
    next();
});

これは、ユーザーのIPアドレスを取得するための最良の試みを行います。または、 127.0.0.1 を返して、ユーザーのIPアドレスを判別できなかったことを示します。高度なオプションについては、 README ファイルをご覧ください。

29
追加された
または127.0.0.1を返して、ユーザーのIPアドレスを判別できなかったことを示します。「127.0.0.1と未知の間には大きな違いがあります...
追加された 著者 Nepoxx,
私はあなたが 'x-forwarded-for'の場合にright2leftルックアップを使用する場合、IPがどうなるのだろうかと思います。 var ip_info = get_ip(req、right_most_proxy = True)、いくつかの設定のように、クライアントIPが最も右のIPかもしれません。
追加された 著者 un33k,
@ JamEngulfer - ipwareは、ipアドレスがrequest.headers []経由でアプリケーションに正しく渡された場合にのみ機能します。例:AWS LBSはIpアドレスを 'x-forwarded-for'で送信し、カスタムNginXは他の変数を多く使用します。 ipwareはIPアドレスを把握するための最良の試みですが、IPがヘッダーに渡された場合に限ります。
追加された 著者 un33k,
それは、Herokuからテストされたとき、私にとって奇妙なものを返しました::ffff :(私のIPアドレスではない) @ edmar-miyakeさんの答えが私のために正しく働いています。
追加された 著者 Nilloc,
github.com/pbojinovでパッケージ要求のソースコードを確認する/request-ip/blob/master/index.js これはx-forwarded-forと他のあらゆる種類のヘッダをチェックするので、パッケージipwareよりも完全なようです
追加された 著者 Giorgio,
このメソッドは、私のために clientIp: ':: 1' を返しています。それは動作していないようです。
追加された 著者 JamEngulfer,
ああ。残念です。私のアプリケーションはウェブトラフィックを直接受け取っていたので、それは不可能だと思います。
追加された 著者 JamEngulfer,

エクスプレスを使用している場合...

req.ip

私はこれを見ていた、私は待っていた、私はエクスプレスを使用しています。ダー。

25
追加された
@ByronWhitlock私はコードがコードブロックに入ると思った?すべての良いしかし。
追加された 著者 Jason Sebring,
いい視点ね。それを逃した、ありがとう。偉大な答えbtw、私は同じことを笑った。
追加された 著者 Byron Whitlock,

request-ip を使用すると、ユーザーのIPアドレスを取得できます。これは、さまざまなエッジケースのかなりの部分を処理します。そのいくつかは、他の答えに記載されています。

開示:このモジュールを作成しました

インストール:

npm install request-ip

アプリ内:

var requestIp = require('request-ip');

// inside middleware handler
var ipMiddleware = function(req, res, next) {
    var clientIp = requestIp.getClientIp(req);//on localhost > 127.0.0.1
    next();
};

お役に立てれば

18
追加された
github.com/pbojinovでパッケージ要求のソースコードを確認する/request-ip/blob/master/index.js AWS ELB、Cloudflare、Akamai、nginx、Rackspace LB、Riverbed's Stingrayなどの一般的なロードバランサのx-forwarded-forおよびその他のヘッダをチェックします
追加された 著者 Giorgio,

request.headers ['x-forwarded-for'] || request.connection.remoteAddress

x-forwarded-for ヘッダがある場合はそれを使用し、それ以外の場合は .remoteAddress プロパティを使用します。

x-forwarded-for ヘッダーは、 HTTP または HTTPS に設定されたロードバランサ(または他のタイプのプロキシ)を通過するリクエストに追加されます。 (プロキシプロトコルを使用して TCP レベルでバランスをとるときに、このヘッダーをリクエストに追加することもできます)。これは、 request.connection.remoteAddress プロパティに、クライアントのパブリックIPアドレスではなくロードバランサのプライベートIPアドレスが含まれているためです。上記の順序で OR 文を使用すると、 x-forwarded-for ヘッダーが存在するかどうかをチェックし、 request.connection.remoteAddress 。

12
追加された

機能に従うと、すべてのケースが役立ちます

var ip;
if (req.headers['x-forwarded-for']) {
    ip = req.headers['x-forwarded-for'].split(",")[0];
} else if (req.connection && req.connection.remoteAddress) {
    ip = req.connection.remoteAddress;
} else {
    ip = req.ip;
}console.log("client IP is *********************" + ip);
12
追加された
ipsの間にがあることに注意してください。
追加された 著者 ThomasReggi,

エクスプレスバージョン3.x以上を使用している場合は、トラストプロキシ設定( http: /expressjs.com/api.html#trust.proxy.options.table )、x-forwarded-forヘッダー内のアドレスチェーンを移動し、最新のipを移動しますreqオブジェクトのipプロパティに信頼できるプロキシとしてコンフィグレーションされています。

6
追加された

同じ問題が...私もjavascriptでも新しいですが、私はこれをreq.connection.remoteAddressで解決しました。それは私にIPアドレスを与えました(ただし、ipv6形式:: ffff.192.168.0.101)。 .slice を押すと7桁の数字が削除されます。

var ip = req.connection.remoteAddress;

if (ip.length < 15) 
{   
   ip = ip;
}
else
{
   var nyIP = ip.slice(7);
   ip = nyIP;
}
6
追加された
私は個人的に function getClientIp4(req)を作成するためにnpm request-ipからgetClientIp()をラップします。{var ip = typeof req === 'string'?req:getClientIp(req); return(ip.length <15?ip:(ip.substr(0,7)=== ':: ffff:'?ip.substr(7):un&zwnj; defined)); } これは、以前にフェッチされたIPまたは要求オブジェクトを入力として受け付け、結果としてipまたはundefinedを与えます
追加された 著者 unsynchronized,
ipv6はちょうど7桁+ IPv4ではありませんが、全く違う可能性があるため、これは良い方法ではありません。
追加された 著者 Radek,

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

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;
}
</div> </div>
5
追加された
この解決法は、混乱を招く1要素配列を返します...
追加された 著者 DanielM,
IPを文字列にしたい場合、最後の行を次のように置き換えることができます:ip = ip.split( ':')。slice(-1)[0]
追加された 著者 Ahmad Agbaryah,

単純なnodejsのリモートIPを取得する:

var ip = req.header('x-forwarded-for') || req.connection.remoteAddress;
3
追加された

IPアドレスを取得するには2つの方法があります

  1. let ip = req.ip

  2. let ip = req.connection.remoteAddress; しかし問題がある。 Nginxやその他のプロキシの背後にあるアプリケーションを実行している場合、すべてのIPアドレスは127.0.0.1になります。

したがって、ユーザーのIPアドレスを取得する最適なソリューションは次のとおりです。

let ip = req.header( 'x-forwarded-for')|| req.connection.remoteAddress;

2
追加された

複数のIPを取得した場合、これは私にとってはうまくいきます:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

var ipaddress = (req.headers['x-forwarded-for'] || 
req.connection.remoteAddress || 
req.socket.remoteAddress || 
req.connection.socket.remoteAddress).split(",")[0];
</div> </div>
1
追加された