【Rails】request.remote_ipの値がプライベートネットワークの通信で120.0.0.1になる
https://qiita.com/yasu/items/da7ebdb01cb3209583df こちら参考にした。
環境
Rails 4.2.10
結論
config/application.rb
に以下を追加すればOK
require 'ipaddr' module Kimromi class Application < Rails::Application # これを追加 config.action_dispatch.trusted_proxies = %w(127.0.0.1 ::1).map { |proxy| IPAddr.new(proxy) } end end
原因
request.remote_ipにはTRUSTED_PROXIESというプライベートネットワークのIPアドレス帯を除外する機能がある。
TRUSTED_PROXIES = [ "127.0.0.1", # localhost IPv4 "::1", # localhost IPv6 "fc00::/7", # private IPv6 range fc00::/7 "10.0.0.0/8", # private IPv4 range 10.x.x.x "172.16.0.0/12", # private IPv4 range 172.16.0.0 .. 172.31.255.255 "192.168.0.0/16", # private IPv4 range 192.168.x.x ].map { |proxy| IPAddr.new(proxy) }
今回の自分の環境の通信は10.*.*.*
だったので、この"10.0.0.0/8"
に掛かり除外され、request.remote_ipとして127.0.0.1
だけが残る形となっていた。
なお、TRUSTED_PROXIESの設定はconfig.action_dispatch.trusted_proxies
で上書きできる。プライベートネットワーク帯の除外は自環境では特に必要なかったので、ローカル通信の127.0.0.1
と::1
だけ残した形で以下のように設定してOKだった。
config.action_dispatch.trusted_proxies = %w(127.0.0.1 ::1).map { |proxy| IPAddr.new(proxy) }
しかしRailsのログが127.0.0.1のまま
Started GET "/" for 127.0.0.1 at 2018-04-23 20:01:42 +0900
こんな感じでRailsのログには127.0.0.1のまま出力されていた。ただこれは既知の問題だったようで、本家のRailsの方で修正されていた。
ソースコードを追ってみるとrails v5.0.7には当たっていなく、v5.1.0には当たっていたのでv5.1.0以上にあげる治っていそう。 https://github.com/rails/rails/blob/v5.1.0/railties/lib/rails/application/default_middleware_stack.rb
早くRails5にしたい。