request.ip
request.ip
Rack::Request
は、箱から出して提供される基本的なIP検出です。現在の定義はhttps://github.com/rack/rack/blob/master/lib/rack/request.rbにあります。
従うアルゴリズムは、最初にREMOTE_ADDR
ヘッダーに信頼できないIPアドレスがないかチェックし、見つかった場合は、リストされている最初のIPアドレスを選択します。この場合の「信頼できる」IPアドレスは、予約済みのプライベートサブネット範囲のIPアドレスですが、正規表現で一致するため、おそらく最善の方法ではないことに注意してください。信頼できないものがない場合は、ヘッダーをREMOTE_ADDR
調べて、リストされている最後の信頼できないものを選択します。それらのどちらも誰かを明らかにしない場合、それはおそらく127.0.0.1であるrawにフォールバックします。HTTP_X_FORWARDED_FOR
REMOTE_ADDR
request.remote_ip
request.remote_ip
ActionDispatch::Request
(から継承する)によって提供される拡張IP検出Rack::Request
です。これは質問に示されているコードです。ご覧のとおり、に設定されていrequest.ip
ない限り、にフォールバックします。これは、デフォルトのRailsスタックに含まれているミドルウェアによって行われます。ソースはhttps://github.com/rails/rails/blob/4-2-stable/actionpack/lib/action_dispatch/middleware/remote_ip.rbで確認できます。action_dispatch.remote_ip
@env
RemoteIp
RemoteIp
ミドルウェアを有効にすると、次の追加機能が提供されます。
- オプションですがデフォルトのIPスプーフィング検出を提供します。
- デフォルトのみに依存するのではなく、構成プロキシアドレスをフィルタリングできるようにします。
IPAddr
脆弱な正規表現に依存する代わりに、クラスを使用して実際にIP範囲を適切にテストします。
HTTP_CLIENT_IP
潜在的なIPのソースとして使用します。
アルゴリズムは似てrequest.ip
いますが、わずかに異なります。HTTP_X_FORWARDED_FOR
最後から最初、HTTP_CLIENT_IP
最後から最初、最後にの最後のエントリを使用しREMOTE_ADDR
ます。それらすべてをリストに入れ、プロキシをフィルタリングして、最初に残っているプロキシを選択します。
IPスプーフィングの検出
によって提供されるIPスプーフィング検出RemoteIp
は特に強力ではありません。最後のHTTP_CLIENT_IP
ものがにない場合は、例外を発生させるだけHTTP_X_FORWARDED_FOR
です。これは必ずしも攻撃の兆候ではありませんが、構成の誤り、または一貫した結果を生み出していないさまざまな規則を使用したプロキシの組み合わせの兆候である可能性があります。
どちらを使用するか
プロキシがすべてローカルまたはプライベートサブネット上にある単純なセットアップでは、おそらく回避できますがrequest.ip
、request.remote_ip
一般的には優れた選択肢と見なす必要があります。パブリックインターネットルーティング(多くのCDNなど)でプロキシを使用している場合RemoteIp
は、すぐに正しいクライアントIPを提供するように構成できますrequest.ip
が、アップストリームプロキシを正しく設定できる場合にのみREMOTE_ADDR
正しくなります。
安全な構成
次に、なりすましに関するTimCoulterのコメントについて説明します。彼はあなたが心配すべきことは間違いなく正しいですが、デフォルトでnginxまたはhaproxyの背後にいる場合、あなたがなりすまされる可能性があるというのは間違っています。 チェーンの最後のIPをRemoteIp
選択することにより、なりすましを防ぐように設計されています。X-Forwarded-For仕様は、各プロキシがリクエスターのIPをチェーンの最後に追加することを指定します。ホワイトリストに登録されたプロキシを除外することにより、最後のエントリは、最初のホワイトリストに登録されたプロキシによって書き込まれたクライアントIPであることが保証されます。もちろん、注意点が1つあります。それは、常に設定/追加するプロキシを実際に実行する必要があるということです。したがって、Timのアドバイスは実際には反対である必要があります。つまり、プロキシを実行している場合にのみ使用してください。X-Forwarded-For
request.remote_ip
パブリックIPプロキシを構成する方法
これはすべて問題ありませんActionDispatch::RemoteIp
が、すでにデフォルトのミドルウェアスタックに含まれています。プロキシCIDRを追加するためにどのように再構成しますか?!
これをあなたに追加してくださいapplication.rb
:
check_spoofing = true
proxies = ["23.235.32.0/20", "203.57.145.0/24"]
proxies += ActionDispatch::RemoteIp::TRUSTED_PROXIES
config.middleware.swap ActionDispatch::RemoteIp,
ActionDispatch::RemoteIp,
true,
proxies