2016-07-17 46 views
4

クライアントとサーバのIPアドレスとポート番号を知る方法を見つけるために多くの検索を試みました。これまでのところ私が見つかりました:Node.jsでクライアントとサーバのIPアドレスとポート番号を取得する方法

  1. クライアントのIPを:req.ipによって知ることができます。
  2. クライアントポート:私は多くを検索しましたが、このクライアントエフェメラルポートを見つける方法が見つかりませんでした。 reqresオブジェクトを調べたところ、クライアントのIPアドレスとポート番号がres.connection._peernameになることがあります。しかし、これはポート番号を見つける信頼できる方法ではありません。なぜなら、このプロパティが不足しているリクエストがあるからです。それで、ポートについて知る正しい方法は何ですか?
  3. サーバーip:ここでは、サーバーの外部IPまたは公開IPを知りたいと考えています。私は同じものを少し探し、私はこの外部のIPを取得するためにいくつかの外部APIを使用してこのlinkを見つけました。それは外部IPを見つける唯一の方法ですか?それとも他の方法もありますか?
  4. サーバーポートlistener.address().port[source]で知ることができます。しかし、それはreqまたはresオブジェクトから知ることができますか?実際に私はreqresnext(基本的にはapp.use(function(req,res,next){...})))のミドルウェア内からポート番号を知りたいと思っています。

答えて

4

あなたは、クライアント(の方法でなしプロキシ)との直接接続を持っている場合は、これらの性質を持つこれら4つの値を取得することができます:

req.connection.remoteAddress 
req.connection.remotePort 
req.connection.localAddress 
req.connection.localPort 

net.jsにおける関連のNode.jsソースコードのポインタを:https://github.com/nodejs/node/blob/863952ebadd4909a66bb9da7868bf75bbbe1462d/lib/net.js#L608

注:これはプロパティ値としてアクセスしますが、技術的にはゲッターとして実装されます。これらのプロパティは設定できません。


などなど、ロードバランサ、プロキシ、などのサーバーインフラストラクチャがある場合は...あなたの実際のサーバーの前に、上記のローカル値がローカルサーバーではなく、実際のものと、パブリックIP /ポートを返すことがあります。クライアントは最初に接続されました。元のパブリックIP /ポートを取得する唯一の方法は、インフラストラクチャがオリジナルのHTTPヘッダ(一部のプロキシがIPを設定し、プロキシがポートを設定しているかどうかわからない)が現在のraw TCPに存在しないためプロキシからの接続。

プロキシが関与しているケースでは、あなたはまた、いくつかのHTTPヘッダを見てみたいことがあります。

X-Forwarded-For - The IP address of the client before it went through the proxy 
X-Forwarded-Port - The port of the client before it went through the proxy 

それは、このような複数のプロキシを通過した場合にはX-転送されたヘッダはまた、コンマ区切りのリストであり:

X-Forwarded-For: OriginatingClientIPAddress, proxy1-IPAddress, proxy2-IPAddress 
RFC 7239

2014のような標準的なヘッダもあり:

Forwarded: for=192.0.2.60; proto=http; by=203.0.113.43 
+1

'req.ip'は、Expressが内部の信頼の代理処理に使用するものです。 Expressが使用されている場合は、 'req.connection.remoteAddress'よりも使用する方が良いでしょう。ポートについては、上流のプロキシは通常その情報を送信しません。 – Brad

+0

@ブラッド - 私は 'req.ip'のためのサポートコードを見つけることができませんでしたので、私は実際のコードで見つかった値を信頼することを喜んで受け入れていませんでした。 'req.connection'はhttpリクエストの' Socket'オブジェクトであり、これらの4つのプロパティはnode.js内の任意のTCP接続のプロパティですExpressはさらに何かを行うかもしれませんが、これらは基本的なソケット実装から直接得られます。はい、プロキシはリモート接続に関する情報を隠すかもしれません - 私の答えはそれを言います。 – jfriend00

+1

そうですね、上流の代理についてのご意見にお答えしました。ここでは、信頼プロキシの設定について読むことができます。http://expressjs.com/ja/api.htmlあなたの提案は、ただちに接続することができます。しかし、リクエストIPが実際にどのようなもので、プロキシがあるのか​​を知りたい場合は、Expressの組み込み処理に頼るのが最も簡単です。 – Brad

関連する問題