環境
- laravel 11
- react-router
- docker
- nginx
起こった事
要件でログイン画面にアクセス元のグローバルIPアドレスを表示する実装で躓いた。
やりたいこととしてはそのIPアドレスをログイン時に送信してuserテーブルが持っているipadressカラムの値じゃなかったらNGみたいなものを作ろうとしていた。
実装
以下のようにBE側でIPアドレス取得のメソッドを作ってFEでloaderから呼べばいいんじゃないかと思って実装
BE側
$forwardedFor = request()->headers->get('X-Forwarded-For');
$realIp = request()->headers->get('X-Real-IP');
$clientIp = null;
$isClientIpReliable = true;
if ($forwardedFor) {
$ipAddresses = explode(',', $forwardedFor);
$clientIp = trim($ipAddresses[0]);
} elseif ($realIp) {
$clientIp = $realIp;
} elseif (request()->ip()) {
// ローカルホストのIPは除外
$clientIp = request()->ip();
$isClientIpReliable = false;
}
return ['clientIp' => $clientIp, 'isClientIpReliable' => $isClientIpReliable];
FE側
export const loader = async () => {
const { data, error } = await apiClient.GET('/get-ip(みたいなURL)')
if (error) {
return { error: error.message }
}
return { data }
}
とれてるっちゃ取れてるけど
Swaggerから行った値が以下
192.168.xx.x
FEに表示されてる値は
172.18.x.x
だった。
ちなみにpostmanでも同じ結果だった
まだデプロイしていない状態だから自身のプライベートアドレスが返ってくるかなと思ったらどうやら違う。
ちなみにプライベートIPは
10.x.x.x
全部違う値や。。。
NGINXではどうなのか
ログは見た感じ以下のようなことがわかった
192.168.xx.x
と172.18.x.x
はnginx側のログに残っているのでおそらく192
側はBE、172
はFEなのかなという感じ。
dockerの方ではどうなのか
docker network inspect bridge | grep Gateway
で見てみると
Gateway: 172.17.x.x
どうしようか
多分Docker内のネットワークを参照してIPアドレスを取得してる感じがするのでdockerが外部IPを取れるような感じにするんかなぁdockerを雰囲気でやってきたので少し勉強しよ。