<AI>Rocky Linux上のNginxで、
アクセスしてきたクライアントがIPv6環境(IPv6アドレス)であるかを判定するには、
Nginxの変数 $remote_addr と geo モジュール を組み合わせるのが最も確実です。
以下に設定手順と具体的な記述例を示します。
🛠️ Nginxの設定手順
Nginxの設定ファイル(/etc/nginx/nginx.conf または /etc/nginx/conf.d/ 配下のファイル)に以下の設定を追加します。
1. geoブロックの定義(httpブロック内に記述)
クライアントのIPアドレスを評価し、IPv6の場合に変数 $is_ipv6 に 1 を代入します。
nginx
http {
# ... 既存の設定 ...
# クライアントIPからIPv6判定用変数を生成
geo $remote_addr $is_ipv6 {
default 0; # デフォルトはIPv6ではない(0)
::/0 1; # 全てのIPv6アドレスなら1
0.0.0.0/0 0; # 全てのIPv4アドレスなら0
}
# ... 既存の設定 ...
}
コードは注意してご使用ください。
2. 判定処理の記述(serverまたはlocationブロック内に記述)
設定した $is_ipv6 変数を使って、条件分岐やログ出力、ヘッダー付与などを行います。
例A:特定の処理に分岐する(if文の利用)
nginx
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
# IPv6環境の場合の処理
if ($is_ipv6) {
# 例: IPv6専用ページへリダイレクト
# rewrite ^(.*)$ /ipv6-only-page permanent;
# 例: 独自のレスポンスヘッダーを返す
add_header X-Connection-Type "IPv6";
}
# IPv4環境の場合の処理
if ($is_ipv6 = 0) {
add_header X-Connection-Type "IPv4";
}
}
}
コードは注意してご使用ください。
例B:アクセスログに記録する
ログフォーマットに $is_ipv6 を含めることで、IPv6からのアクセスかどうかをログに集計できます。
nginx
log_format main_with_ip_version '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" IPv6_Flag:$is_ipv6';
コードは注意してご使用ください。
⚠️ 注意すべきポイント
リバースプロキシ環境での注意点
Nginxの手前にロードバランサー(ALBやCloudflareなど)がある場合、
$remote_addr はロードバランサーのIPになってしまいます。
その場合は real_ip モジュールを有効化し、$is_ipv6 を判定する対象を $http_x_forwarded_for などに変更してください。
OS側のIPv6確認
そもそもRocky Linux自体がIPv6を受け入れている必要があります。
ss -tnlp | grep nginx を実行し、:::80 のようにIPv6リッスン([::]:80)が有効になっているか事前に確認してください。
今後の展開に合わせて、最適な方法をご案内します。
リバースプロキシ(CDNやLB)を挟んだ構成ですか?
判定後にどのような挙動(リダイレクト、ブロック、ログ記録など)をさせたいですか?