【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アドレス帯を除外する機能がある。

https://github.com/rails/rails/blob/v4.2.10/actionpack/lib/action_dispatch/middleware/remote_ip.rb#L33-L40

    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の方で修正されていた。

github.com

ソースコードを追ってみると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にしたい。