diff --git a/CHANGELOG-8.5.2-a.md b/CHANGELOG-8.5.2-a.md new file mode 100644 index 0000000..8d1dcdc --- /dev/null +++ b/CHANGELOG-8.5.2-a.md @@ -0,0 +1,95 @@ +# Changelog - Version 8.5.2-a + +## 新機能 + +### リアルIP転送機能の追加 + +ベアメタルKubernetesクラスターやLoadBalancer環境において、PHP側で訪問者の実IPアドレスを取得できる機能を追加しました。 + +#### 主な変更点 + +1. **values.yaml** + - `nginx.forwardRealIP` セクションを追加 + - `enabled`: リアルIP取得機能の有効/無効 + - `header`: リアルIPを取得するHTTPヘッダー名(デフォルト: X-Forwarded-For) + - `recursive`: 再帰的にリアルIPを検索(多段プロキシ対応) + - `trustedProxies`: 信頼するプロキシのネットワーク範囲 + - `additionalTrustedProxies`: 環境に応じた追加プロキシ設定 + +2. **templates/configmap.yaml** + - Nginx の `http` セクションにリアルIP設定を追加 + - `real_ip_header`, `real_ip_recursive`, `set_real_ip_from` ディレクティブを実装 + - PHP-FPM へ渡す fastcgi_param にリアルIP情報を追加 + - 既存の `customConfig.snippet` と競合しない構造 + +3. **README.md** + - リアルIP転送機能の設定パラメータ表を追加 + - 例7としてベアメタル環境でのリアルIP取得の使用例を追加 + - 検証用PHPコード例を追加 + +4. **examples/test-real-ip.php** (新規作成) + - リアルIP転送設定の動作確認用テストスクリプト + - WebUIで各種IP関連変数を確認可能 + - 診断機能付き + +## 技術詳細 + +### Nginx設定 +```nginx +# HTTP-levelで設定 +real_ip_header X-Forwarded-For; +real_ip_recursive on; +set_real_ip_from 10.0.0.0/8; +set_real_ip_from 172.16.0.0/12; +set_real_ip_from 192.168.0.0/16; + +# PHP-FPMへ渡すパラメータ +fastcgi_param REMOTE_ADDR $remote_addr; +fastcgi_param HTTP_X_REAL_IP $remote_addr; +fastcgi_param HTTP_X_FORWARDED_FOR $proxy_add_x_forwarded_for; +``` + +### PHPでの利用 +```php +// リアルIPアドレスの取得 +$realIP = $_SERVER['REMOTE_ADDR']; +``` + +## 互換性 + +- 既存の `nginx.customConfig.snippet` 機能と完全に互換性あり +- デフォルトは `enabled: false` のため、既存環境への影響なし +- 有効化時のみ、リアルIP取得ロジックが動作 + +## セキュリティ + +- `trustedProxies` には信頼できるプロキシのみを指定してください +- 不正なプロキシを信頼すると、IPスプーフィング攻撃のリスクがあります + +## 使用例 + +```yaml +# values.yaml +nginx: + forwardRealIP: + enabled: true + header: "X-Forwarded-For" + recursive: true + trustedProxies: + - "10.0.0.0/8" + - "172.16.0.0/12" + - "192.168.0.0/16" + additionalTrustedProxies: + - "203.0.113.0/24" # 外部LoadBalancerのIPレンジ +``` + +## 検証方法 + +1. `examples/test-real-ip.php` を `/var/www/html/` に配置 +2. ブラウザでアクセス: `http://your-service/test-real-ip.php` +3. `REMOTE_ADDR` にパブリックIPが表示されることを確認 + +--- + +**リリース日**: 2026-02-10 +**担当**: プロサーバーエンジニア(Claude) diff --git a/Chart.yaml b/Chart.yaml index dcdf2da..4edd447 100644 --- a/Chart.yaml +++ b/Chart.yaml @@ -2,6 +2,6 @@ apiVersion: v2 name: phpfpm description: Nginx + PHP-FPM Helm Chart with external DB and optional Selenium support type: application -version: 8.5.2 +version: 8.5.2-a appVersion: "8.5.2" icon: https://upload.wikimedia.org/wikipedia/commons/thumb/2/27/PHP-logo.svg/330px-PHP-logo.svg.png diff --git a/README.md b/README.md index 9e35de2..b7ab2b8 100644 --- a/README.md +++ b/README.md @@ -163,6 +163,11 @@ kubectl logs -l app.kubernetes.io/name=phpfpm -c nginx |-----------|------|-----------| | `nginx.customConfig.enabled` | カスタム設定有効化 | `false` | | `nginx.customConfig.snippet` | 設定スニペット | `""` | +| `nginx.forwardRealIP.enabled` | リアルIP取得有効化 | `false` | +| `nginx.forwardRealIP.header` | リアルIP取得ヘッダー | `"X-Forwarded-For"` | +| `nginx.forwardRealIP.recursive` | 再帰的IP検索 | `true` | +| `nginx.forwardRealIP.trustedProxies` | 信頼するプロキシネットワーク | `["10.0.0.0/8", "172.16.0.0/12", "192.168.0.0/16"]` | +| `nginx.forwardRealIP.additionalTrustedProxies` | 追加の信頼プロキシ | `[]` | ## 使用例 @@ -347,7 +352,62 @@ persistence: enabled: true ``` -### 例7: 画像処理アプリケーション(GD拡張) +### 例7: ベアメタル環境でのリアルIP取得 + +ベアメタルKubernetesやLoadBalancer経由でのアクセスで、PHPからクライアントの実IPアドレスを取得する設定です。 + +```yaml +# values.yaml +service: + type: LoadBalancer + +nginx: + forwardRealIP: + # リアルIP取得機能を有効化 + enabled: true + + # リアルIPを取得するヘッダー(環境に応じて変更) + # - X-Real-IP: シンプルな1段プロキシ + # - X-Forwarded-For: 多段プロキシ対応(推奨) + header: "X-Forwarded-For" + + # 再帰的にリアルIPを検索(多段プロキシ環境で推奨) + recursive: true + + # 信頼するプロキシのネットワーク範囲 + # ベアメタルクラスターのPodネットワークとServiceネットワークを指定 + trustedProxies: + - "10.0.0.0/8" # Kubernetesデフォルトのクラスタネットワーク + - "172.16.0.0/12" # Dockerデフォルトネットワーク + - "192.168.0.0/16" # プライベートネットワーク + + # 追加で信頼するプロキシ(外部LoadBalancerなど) + additionalTrustedProxies: + - "203.0.113.0/24" # 外部LoadBalancerのIPレンジ(例) + +persistence: + enabled: true +``` + +この設定により、PHP側で以下の変数から実IPアドレスが取得できます: +- `$_SERVER['REMOTE_ADDR']` - クライアントの実IPアドレス +- `$_SERVER['HTTP_X_REAL_IP']` - 同上(互換性用) +- `$_SERVER['HTTP_X_FORWARDED_FOR']` - プロキシチェーン全体 + +**検証用PHPコード:** +```php + + + +
+ + +| 変数名 | +値 | +説明 | +
|---|---|---|
REMOTE_ADDR |
+ + | クライアントの実IPアドレス(Nginx real_ip設定適用後) | +
HTTP_X_REAL_IP |
+ + | Nginxが設定したリアルIP(互換性用) | +
HTTP_X_FORWARDED_FOR |
+ + | プロキシチェーン全体(カンマ区切り) | +
HTTP_CLIENT_IP |
+ + | 一部のプロキシが使用 | +
| Header Name | +Value | +
|---|---|
' . htmlspecialchars($name) . ' | ';
+ echo '' . htmlspecialchars($value) . ' | '; + echo '
✅ 正常: REMOTE_ADDR にパブリックIPアドレスが設定されています。
'; + echo 'リアルIP転送設定が正しく動作しています。
'; + } elseif (!empty($remoteAddr) && isPrivateIP($remoteAddr)) { + echo '⚠️ 注意: REMOTE_ADDR がプライベートIPアドレスです: ' . htmlspecialchars($remoteAddr) . '
'; + echo 'これは以下のいずれかが原因です:
'; + echo 'ヒント: X-Forwarded-For ヘッダーには値があります: ' . htmlspecialchars($xForwardedFor) . '
'; + echo 'values.yaml で nginx.forwardRealIP.enabled: true に設定してください。
⚠️ REMOTE_ADDR が設定されていません
'; + } + ?> +
+<?php
+/**
+ * 訪問者のリアルIPアドレスを取得する関数
+ */
+function getRealIP() {
+ // nginx.forwardRealIP.enabled が true の場合、
+ // REMOTE_ADDR に実IPが設定されている
+ return $_SERVER['REMOTE_ADDR'] ?? 'unknown';
+}
+
+// 使用例
+$visitorIP = getRealIP();
+echo "訪問者のIPアドレス: " . $visitorIP;
+
+// データベースに記録する例
+// $stmt = $pdo->prepare("INSERT INTO access_log (ip_address, visited_at) VALUES (?, NOW())");
+// $stmt->execute([$visitorIP]);
+?>
+
+
+# values.yaml
+nginx:
+ forwardRealIP:
+ enabled: true
+ header: "X-Forwarded-For"
+ recursive: true
+ trustedProxies:
+ - "10.0.0.0/8"
+ - "172.16.0.0/12"
+ - "192.168.0.0/16"
+ additionalTrustedProxies:
+ - "あなたのLoadBalancerのIPレンジ"
+