そもそもどういう事象なのかも含めて整理する。
前提としてIp Spoofing(IPスプーフィング)とは何か
送るリクエストの送信元IPを偽装してアクセスをする手法。IP制限などで特定のIPのリクエストしか受け付けない環境に対して、自身のIPを偽装をすることで制限を突破することなどを目的に行われる。
通常TCP/IPの方式ではTCPが送信元のIPを改ざんするのは難しい作りになっているため、TCPを用いる場合での送信元IPの偽装は難しいとされている。
RailsのIpSpoofAttackErrorとは
IpSpoofAttackErrorが発生するところのv7.2.0のソースコード を見ると、リクエスト元となるクライアントIPを推測する処理のところでraiseされる。
この処理ではIPアドレスをHTTPのヘッダ情報から類推して特定する処理となっている。その際に利用するのが REMOTE_ADDR
, CLIENT-IP
, X-FORWARDED-FOR
ヘッダのいずれかを利用する。その際にあまり併用されることがない CLIENT-IP
と X-FORWARDED-FOR
に関して送信元IPを含むべきX-FORWARDED-FOR
にCLIENT-IP
で書かれているIPが入っていない場合に異常として検知するもの。(X-FORWARDED-FOR
に関しては過去の記事に書いたので説明は端折ります)該当コードとしては以下のあたりです。
should_check_ip = @check_ip && client_ips.last && forwarded_ips.last if should_check_ip && !forwarded_ips.include?(client_ips.last) # We don't know which came from the proxy, and which from the user raise IpSpoofAttackError, "IP spoofing attack?! " \ "HTTP_CLIENT_IP=#{@req.client_ip.inspect} " \ "HTTP_X_FORWARDED_FOR=#{@req.x_forwarded_for.inspect}" end
そのため、原義のIp SpoofingよりもHTTPヘッダでの整合性の合わない話へのエラーとなっている。
無効にするには
このraiseが上がらないように設定をすることもできる。Railsガイド曰く以下の通り。
この設定はconfig.action_dispatch.ip_spoofing_checkオプションとconfig.action_dispatch.trusted_proxiesオプションで変更可能です。 - Rails アプリケーションの設定項目 - Railsガイド
そのためしかるべきところで
config.action_dispatch.ip_spoofing_check = false
としておけばこのチェック自体がスキップされる。
余談:CLIENT-IP ヘッダについて
この調査の際に、CLIENT-IP
ヘッダの仕様について調べようとしたところ2024年時点だと全然情報が見つけられずでした。仮に使うとしても X-Real-IP
などで同様のことをやるのが一般的という情報しか出てこなかったので、今だとセットするほうが珍しい可能性があります。それ故にもしエラーが上がった場合は経路的にどこでセットされているのかを確かめるようほうが良いかもしれません。