CloudFlare経由のアクセスでも実IPアドレスをnginxのログに記録する

先日、LXDコンテナとDockerコンテナに二重DNATすることで、コンテナ内のnginx-proxyでも接続元のIPアドレスをログに記録することができました。

LXDコンテナ内のDockerコンテナ内で動くnginx-proxyを二重NATで公開した(IPv4・IPv6対応)
2023年8月追記・今は無料で使えるCloudflare Tunnelを使うのがオススメ 3年前のこの記事、めちゃくちゃ面倒くさい設定をしていますが、確か2年以上前からCloudflare Tunnelを使ったローカルサーバーの公開が無料...

しかし、CloudFlare経由でアクセスするサイトの場合、このままだとCloudFlareのアドレスだけが記録されてしまいます。そこで、実IPアドレスを記録するために、nginx-proxyコンテナに「/etc/nginx/conf.d/001_cloudflare_real_ip.conf」を以下の内容で作成しました(上の記事ではホストの「./_data/nginx/conf.d/」を「/etc/nginx/conf.d/」にボリュームマウントしています)。

set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
real_ip_header CF-Connecting-IP;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-for $remote_addr;

CloudFlareのIPアドレス範囲は、https://www.cloudflare.com/ips/に掲載されています。テキストファイルでも提供されているので、変更を監視して自動で更新できればより良いと思います。

上の例では、バックエンドサーバーへのリクエストヘッダ「X-Real-IP」と「X-Forwarded-for」にも$remote_addr(接続元の実IPアドレス)を設定しています。これにより、バックエンドサーバーのログに接続元のIPアドレスを記録したり、接続元IPアドレスによって処理を変更したりできます。

Docker公式のwordpressイメージに含まれるApacheは、接続元がプライベートアドレスなら「X-Forwarded-for」を接続元IPアドレスとして記録するよう設定されている(/etc/apache2/conf-enabled/remoteip.conf)ので、nginx-proxyで上記の設定をしておけば、バックエンドのWordPressコンテナにも実際のIPアドレスが記録されます(CloudFlare経由・非経由にかかわらず)。

なお、wordpressイメージの/etc/apache2/conf-enabled/remoteip.confの内容は以下の通りです(Dockerfileに書き込む処理が入っています)。

RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 10.0.0.0/8
RemoteIPTrustedProxy 172.16.0.0/12
RemoteIPTrustedProxy 192.168.0.0/16
RemoteIPTrustedProxy 169.254.0.0/16
RemoteIPTrustedProxy 127.0.0.0/8

コメント

タイトルとURLをコピーしました