mayumi
脱クラウド計画(1)の後、アクセス解析のログを見ていると自分のアクセスがカウントされていることに気づきました。
アクセス解析のツールumamiでは、カウントしないIPアドレスやカウントしないホスト名を指定できます。
最初は自分のIPアドレスが設定したカウントしないIPアドレスから変わってしまったのだと思ったのですが、そうではないようでした。
確認してみると、先日の脱クラウド計画(1)の影響(解析ツールを社内サーバーへ引っ越した)で、解析ツールがクライアントIPアドレスを正しく認識できなくなってしまったようです。
処置
umamiの設定ではリバースプロキシ等でヘッダーが変更されるアクセスの場合に.envにどの項目をIPアドレスとするかを指定することができます。
Environment variablesCLIENT_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.
今回の状況ならば、
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アドレスが正しく識別できるようになり、自分のアクセスまでカウントされないようになりました。