
Node.jsを使用して、リクエストから接続元のIPアドレスを取得する方法は、ウェブアプリケーションやネットワーク関連のプロジェクトで非常に重要です。
この記事では、Node.jsを用いた2つの異なる方法を詳しく説明し、それぞれの方法について変数へのIPアドレスの代入するソースコードのサンプルを提供します。
IPアドレスを取得する2つの方法
Express.jsを使用した方法
Express.jsはNode.jsのWebアプリケーションフレームワークであり、リクエストからIPアドレスを取得するのが非常に簡単です。
以下はその手順です。
Express.jsをプロジェクトに追加します。
const express = require('express');
const app = express();
Expressのミドルウェアを使用してIPアドレスを取得します。
app.use((req, res, next) => {
  const clientIP = req.ip; // IPアドレスを取得
  console.log('接続元IPアドレス: ' + clientIP);
  next();
});
// ここにアプリケーションのルーティングを追加
この方法では、req.ipを使用してIPアドレスを取得し、に代入することができます。
HTTPモジュールを使用した方法
HTTPモジュールを使用する方法は、Express.jsを使用する場合と比べると手順が多少煩雑ですが、Node.jsの基本的なHTTPサーバーとしても役立ちます。
HTTPモジュールをインポートします。
const http = require('http');
HTTPサーバーを作成し、リクエストハンドラーを追加します。
const server = http.createServer((req, res) => {
  const clientIP = req.connection.remoteAddress; // IPアドレスを取得
  console.log('接続元IPアドレス: ' + clientIP);
  // ここにレスポンスの処理を追加
});
// サーバーを指定のポートでリッスン
const port = 3000;
server.listen(port, () => {
  console.log(`サーバーがポート${port}で実行中`);
});
この方法では、req.connection.remoteAddressを使用してIPアドレスを取得し、変数に代入します。
リバースプロキシを使用している場合
リバースプロキシを使用している場合、req.ipやreq.connection.remoteAddressを使用すると、ローカルIPアドレスではなく正確な接続元のIPアドレスを取得することが難しくなります。
そのため、x-forwarded-forヘッダーを使用することが推奨されます。
以下は、上記のソースコードに関する詳しい説明です。
// リバースプロキシを使用した場合に正確な接続元IPアドレスを取得する関数
var getIP = function (req) {
  // リクエストヘッダーからx-forwarded-forヘッダーをチェックします。
  if (req.headers['x-forwarded-for']) {
    return req.headers['x-forwarded-for'];
  }
  // 以下、x-forwarded-forヘッダーが存在しない場合、接続情報からIPアドレスを取得します。
  if (req.connection && req.connection.remoteAddress) {
    return req.connection.remoteAddress;
  }
  if (req.connection.socket && req.connection.socket.remoteAddress) {
    return req.connection.socket.remoteAddress;
  }
  if (req.socket && req.socket.remoteAddress) {
    return req.socket.remoteAddress;
  }
  // 上記の条件に該当しない場合、デフォルトで'0.0.0.0'を返します。
  return '0.0.0.0';
};
解説
リバースプロキシがx-forwarded-forヘッダーを提供している場合、それを使用してクライアントのIPアドレスを取得します。
x-forwarded-forヘッダーが存在しない場合、req.connection.remoteAddress、req.connection.socket.remoteAddress、およびreq.socket.remoteAddressを順番にチェックし、最初に見つかったIPアドレスを返します。これらは接続情報から取得されます。
上記の条件すべてに該当しない場合、デフォルトで0.0.0.0を返します。
この関数を使用することで、リバースプロキシを介して正確な接続元のIPアドレスを取得できます。
この情報を元に、リクエストの解析やセキュリティ対策などを行うことができます。
おまけ
関数の中身はただのif文なので、returnを1つにしてもっと簡潔にまとめてみました!
return req.headers['x-forwarded-for'] || 
    (req.connection && req.connection.remoteAddress) || 
    (req.connection.socket && req.connection.socket.remoteAddress) || 
    (req.socket && req.socket.remoteAddress) || 
    '0.0.0.0';
まとめ
Node.jsを使用してリクエストから接続元のIPアドレスを取得する方法について2つのアプローチを紹介しました。Express.jsを使用する場合とHTTPモジュールを使用する場合は、プロジェクトの要件や好みに応じて、どちらの方法を選択するかを検討してください。
また、リバースプロキシを使用していて、接続元のIPアドレスが正確に取得できない場合の対処方法も紹介しました。
結論としては、Express.jsやHTTPモジュールを使うより、x-forwarded-forヘッダーをから取得した方が万能な気がします。
- Original:https://minory.org/node-get-client-ip.html
 - Source:Minory
 - Author:管理者