Mojolicious で X-Forwarded-For からプロキシではなくクライアントの IP っぽいものをとってこれるプラグインを書いた。
- https://metacpan.org/pod/Mojolicious::Plugin::ClientIP
- https://github.com/sixapart/Mojolicious-Plugin-ClientIP
使い方は SYNOPSIS の通り、
use Mojolicious::Lite;
plugin 'ClientIP';
get '/' => sub {
my $c = shift;
$c->render(text => $c->client_ip);
};
Mojolicious 的にはリモートアドレス取るとなったら $c->tx->remote_address を使うのが通常だと思われるけど、これは XFF があったら最後の IP を単に返すだけ。一方このプラグインではプライベートネットワークなアドレスは無視するようになっているので、
X-Forwarded-For: 192.0.2.100 10.0.0.2 10.0.0.1
みたいの受け取った時に、
$c->tx->remote_address; # => '10.0.0.1'
$c->clien_ip; # => '192.0.2.100'
こういう違いが出る。XFF がなかったり、全てプライベートアドレスだったりした場合は $c->tx->remote_address が呼ばれるので、環境やミドルウェア的なものにあんまり左右されずに『ユーザーの IP』っぽいものをとりたい時に普段使いできるはず。
通常これだけで事足りるはずだけど、事情があって無視したい グローバル IP があったりもしたので、任意の IP を追加で無視できるようにもなってる。これも SYNOPSIS の通り、
plugin 'ClientIP', ignore => [qw(192.0.2.1 192.0.2.16/28)];
CIDR 使えるので楽。
さすがに手段も目的も当たり前すぎるものなのでもうプラグインあるだろと思ったけどみあたらなかったので作った。