Rails + Kamal + Cloudflare で訪問者の IP アドレスを取得する
Cloudflare を使っていると、Rails の request.remote_ip
に訪問者の IP アドレスではなく、Cloudflare の IP アドレスが入ってきてしまいます。
cloudflare-rails という gem でこの問題が解消されるはずなのですが、なぜかうまくいかず悩んでいました。
原因は、Kamal が使っている Traefik が、Rails に X-Forwarded-For
ヘッダを渡していないためのようでした。
というわけで、対応策を書いていきます。Kamal のバージョンは 1.3.1、Traefik のバージョンは 2.9 です。
まず、cloudflare-rails
gem を入れます。
Gemfile
group :production do gem 'cloudflare-rails' end
次に、Traefik が X-Forwarded-*
ヘッダを渡すように、Kamal で起動オプションを設定します。
信頼できない IP アドレスの除去は cloudflare-rails
gem がやってくれます。
config/deploy.yml
traefik: args: entrypoints.http.address: ':80' entrypoints.http.forwardedHeaders.insecure: true
- Traefik EntryPoints Documentation - Traefik
- Get real IP in access log when using CloudFlare or other load-balancers · Issue #10002 · traefik/traefik · GitHub
Traefik を再起動して、デプロイします。
kamal traefik reboot kamal deploy
以上で、request.remote_ip
が訪問者の IP アドレスを返すようになるはずです。