ユーザーのIPアドレスは常にWebサーバーのIPアドレスとして登録されます

問題

フロントエンド サーバー (Apache または Nginx) とロード バランサーの背後に Liferay を構成した後、ユーザーがログインすると、 User_ テーブルの loginIp 列の値は常に、ロード バランサーの代わりに同じローカル IP アドレスになります。正しいユーザーの IP アドレス

Tomcat と Liferay のログ ファイルにも、ロード バランサーから間違った IP アドレスが保存されています。

Environment

  • フロントエンドサーバーまたはロードバランサーが背後に構成されたLiferayインストール

解決策

この問題の根本原因は Liferay であり、Tomcat は httpServletRequestを使用します。getRemoteAddr() を使用してユーザーの IP を取得しますが、このメソッド はリクエストを送信したクライアントまたは最後のプロキシの IP アドレスを返すため、実際の IP はフロントエンド サーバーまたはロード バランサーによって置き換えられます。

通常、フロントエンド サーバーまたはロード バランサーは、元の IP クライアントを要求の X-Forwarded-For ヘッダーに格納します。

HttpServletRequest.getRemoteAddr() が正しい情報を返すように、代わりにこのヘッダーを使用して IP クライアントを取得するようにアプリケーション サーバーまたは Web アプリケーションを構成できます。

次の 2 つのオプションがあります。

オプション 1: アプリケーション サーバー構成アプリケーションに Tomcat リモート IP バルブ を追加します。

  • [LIFERAY_HOME]/tomcat-9.xx/conf/server.xml ファイルを編集します
  • 「ホスト」セクション内に Tomcat リモート IP バルブを追加します。
    • <Valve className="org.apache.catalina.valves.RemoteIpValve" 
      internalProxies="x.x.x.x"
      remoteIpHeader="X-Forwarded-For"
      proxiesHeader="X-Forwarded-By"
      protocolHeader="X-Forwarded-Proto" />

オプション 2: Tomcat IP フィルター Liferay Web アプリケーションに追加します。 これは前のオプションと似ていますが、構成は Liferay Web アプリケーションにのみ適用されます。

    • [LIFERAY_HOME]/tomcat-9.xx/webapps/ROOT/WEB-INF/web.xmlファイルを編集します
    • Tomcat IP フィルターを追加します。
      •      <filter>
               <filter-name>RemoteIpFilter</filter-name>
               <filter-class>org.apache.catalina.filters.RemoteIpFilter</filter-class>
               <init-param>
                 <param-name>allowedInternalProxies</param-name>
                 <param-value>192\.168\.0\.10|192\.168\.0\.11</param-value>
               </init-param>
               <init-param>
                 <param-name>remoteIpHeader</param-name>
                 <param-value>X-Forwarded-For</param-value>
               </init-param>
               <init-param>
                 <param-name>remoteIpProxiesHeader</param-name>
                 <param-value>X-Forwarded-By</param-value>
               </init-param>
               <init-param>
                 <param-name>protocolHeader</param-name>
                 <param-value>X-Forwarded-Proto</param-value>
               </init-param>
             </filter>

追加情報

この記事は役に立ちましたか?
1人中1人がこの記事が役に立ったと言っています