ハードウェアからサーバ・アプリまでワンストップで開発

脱クラウド計画(1)の後、アクセス解析のログを見ていると自分のアクセスがカウントされていることに気づきました。

アクセス解析のツールumamiでは、カウントしないIPアドレスやカウントしないホスト名を指定できます。
最初は自分のIPアドレスが設定したカウントしないIPアドレスから変わってしまったのだと思ったのですが、そうではないようでした。

確認してみると、先日の脱クラウド計画(1)の影響(解析ツールを社内サーバーへ引っ越した)で、解析ツールがクライアントIPアドレスを正しく認識できなくなってしまったようです。

処置

umamiの設定ではリバースプロキシ等でヘッダーが変更されるアクセスの場合に.envにどの項目をIPアドレスとするかを指定することができます。

CLIENT_IP_HEADER = <header name>

HTTP header to check for the client's IP address. This is useful when you're behind a proxy that uses non-standard headers.

Environment variables

今回の状況ならば、

CLIENT_IP_HEADER='x-forwarded-for'

とすれば動作すると思ったのですが、設定を変えても自分のアクセスがカウントされてしまいます。
調べてくと、ヘッダーの「X-Forwarded-For」をそのままIPアドレスとして識別していました。

「X-Forwarded-For」の中身なので、クライアントのIPアドレスに加え、解析ツールまでに経由したプロキシのアドレスも記載されています。

'xxx.xxx.xxx.xxx(クライアントのIPアドレス), xxx.xxx.xxx.xxx(リバースプロキシのIPアドレス)'

(↑)をIPアドレスと認識し、カウントしないIPアドレスとマッチした時に一致しないためカウントされていたようです。

umamiのクライアントIPを識別する箇所は
umami/lib/request.js

export function getIpAddress(req) {
  // Custom header
  if (req.headers[process.env.CLIENT_IP_HEADER]) {
    return req.headers[process.env.CLIENT_IP_HEADER];
  }
  // Cloudflare
  else if (req.headers['cf-connecting-ip']) {
    return req.headers['cf-connecting-ip'];
  }
  return requestIp.getClientIp(req);
}

です。
できれば手を加えずに対処したかったのですが、現在の構成で自社でのみ使用するという前提ですので単純に取得したX-Forwarded-Forの値をパースすることにしました。
umami/lib/request.js

export function getIpAddress(req) {
  // Custom header
  if (req.headers[process.env.CLIENT_IP_HEADER]) {
    let ips = req.headers[process.env.CLIENT_IP_HEADER].split(',');

    return ips[0];
  }
  // Cloudflare
  else if (req.headers['cf-connecting-ip']) {
    return req.headers['cf-connecting-ip'];
  }
  return requestIp.getClientIp(req);
}

これでクライアントIPアドレスが正しく識別できるようになり、自分のアクセスまでカウントされないようになりました。

最近のエントリー

OrangePi5にZabbixをインストールする

レビュー等の依頼について

オープンソースのノートアプリ「SiYuan」 - CasaOS AppStoreレビュー

お気に入りの色さがし1

創立記念日

現在の営業品目(2)

現在の営業品目(1)

SPDX License Listをデータ化した

Orange Pi5でC3TR-Adapterを試す

CasaOS上で会計システム「Hieronymus」を動かす

会計システム「Hieronymus」v1.0.0 リリースしました

CasaOSでファイル同期アプリSyncthingをセットアップする

第11回 Freshmeat

オープンソースノーコード「Activepieces」でワークフローを作る

RaspberryPiにパーソナルクラウドOS「CasaOS」を導入する

sequelize-cliでdb:migrateすると「SyntaxError: Unexpected token ':'」が出る

LED行燈の試作(2)

CMSの社内向けサービスのリニューアル

LED行燈の試作(1)

エントリを書くこと