Cloudflare(Tunnel経由)からのリクエストやIPをNginxでロギングしたい
WEBサービスを外部公開する際、Cloudflare Tunnelを利用してCloudflareにプロキシして公開してます。しかし、どんなリクエストが降ってきてるか分からない上に怪しいリクエストがCloudflareのWAFを通過してる可能性もあるので、Nginxでロギングしたいわけです。
環境
Debian12.8
今回、Nginxでロギングしたいので、Nginx通してないって方はそれにリバースプロキシをお願いします。
またApacheやその他WEBサーバをご利用の方は脳内読み替えお願いします。
作業
って言っても大変なので、軽~くNginxのリバースプロキシのやり方を伝授しときます。
例えば、localhost:80/siteで公開してるサイトをリバースプロキシしたい場合(Nginxはlocalhost:3001に公開)
server {
#server_name 外部に公開するときのドメイン
server_name hogehoge.com;
#listen Nginxが公開したいIP(or ドメイン):ポート
listen localhost:3001;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Port $server_port;
location /site {
#proxy_http_version 1.1 : proxy_passとHTTP1.1で通信する(デフォルトではHTTP1.0で通信するため)
proxy_http_version 1.1;
#公開したいバックのIP(or ドメイン)とポートを指定(locationとproxy_passのURIとスラッシュに気をつけること、Nginxはスラッシュに厳しい)
proxy_pass http://localhost:80;
}
}
なんとなくこんな感じです。他色々な方が公開してる方法と照らし合わせながら設定してください。
で、このままCloudflareにプロキシさせてもログに出てくるIPは::1か127.0.0.1などlocalhostのIPが表示され、実際のIPではありません。
::1 - - [20/Nov/2024:00:37:59 +0900] "GET / HTTP/1.1" 200 5504 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36
(KHTML, like Gecko) Chrome/130.0.0.0 Safari/537.36"
なんでやねん!って言うとCloudflareやCloudflare Tunnelといった異なるIPアドレスを持つサービスにリクエストが通過するためアクセス元IPを正確に判断するのが難しいんです。。。
X-Forwarded-Forと呼ばれるヘッダーでアクセス元を判別したわけですが、アクセス元のIPと今まで通ってきたプロキシIPなどが記録されています。
実際にX-Forwarded-Forを調査したところこのヘッダにはアクセス元IP+localhostのIPが記録されておりlocalhostのIPがログに記録されてしまったわけです。なのでlocalhostを除外(信頼)するように設定追記します。(ちなみにCloudflareプロキシサーバのアドレスは多分含まれてませんでした)
追加はserver{}もしくはlocation{}内に以下を追加します。
#localhostとなる::1, 127.0.0.1を除外(信頼)させる
set_real_ip_from ::1;
set_real_ip_from 127.0.0.1;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
これが完了したあとあとログがアクセス元IPになっていればOKです。
次回はさらにFail2Banに監視させた記事を書きたいなと思ってます。
Discussion