フォワードプロキシ構築時に気を付けること

# フォワードプロキシ構築時に気を付けること

## はじめに

今回業務でフォワードプロキシを構築するにあたり、いくつか躓いた箇所があったので備忘録として残します。
そもそも、フォワードプロキシ（Forward Proxy）は、**社内クライアントと外部インターネットの間に位置する中継サーバ**です。以下のような機能を提供するため、企業や教育機関などで幅広く導入されています。

- **アクセス制御**：業務外サイトのブロック
- **通信ログ取得**：誰がどこにアクセスしたかを記録
- **キャッシュによる高速化**：コンテンツ再利用による通信削減
- **匿名性の向上**：クライアントIPの秘匿

---

## フェーズ別：構築時に気を付けるべきこと

## 1. サーバ構成とパフォーマンス設計

### ✅ スペック設計
- **想定同時接続数**：ピークアクセスユーザーを基準に
- **必要帯域/スループット**：動画・ダウンロードサイトアクセス有無で判断
- **ハードウェア**：
  - CPU：SSL処理が必要なら高性能必須
  - RAM：接続テーブルとキャッシュサイズに応じて多めに
  - SSD：ログ/キャッシュ用に高速ストレージ

### ✅ キャッシュ設計（Squidなど）
- **キャッシュ対象ファイル選定**：画像・JS/CSS・PDFなど
- **キャッシュサイズと保存期間（TTL）**の設計
- **メモリキャッシュ vs ディスクキャッシュ**の最適化

> **注意**：キャッシュ設計ミスは逆にトラフィックを増やす原因になることも。

---

## 2. セキュリティ対策

### ✅ ネットワーク制御
- **社内IPアドレスのみにアクセスを限定**
- **外部からのアクセス遮断（FW設定）**

### ✅ 認証の導入
- LDAP/Active Directoryと連携し、ユーザー認証を強制
- Basic認証やNTLM認証なども環境により検討

### ✅ HTTPS通信の扱い
- **CONNECTメソッドの制御**
- **SSLバンプ（SSL/TLSインターセプト）**
  - 中間CA証明書の配布
  - 法的制約と社内同意の確認が必須
- **証明書エラーへの対処**
  - ブラウザ配布 / GPOによる信頼設定

### ✅ ログ取得と可視化
- **保存項目**：IP・ユーザー・URL・タイムスタンプ・ステータスコード
- **保存期間**：90日〜1年（社内監査基準に準拠）
- **監視連携**：SyslogやSIEM（例：ELK, Wazuh）と統合

---

## 3. 冗長化と可用性確保

### ✅ フェイルオーバー構成
- **Keepalived + VRRPによるVIP切替**
- **LVS（Linux Virtual Server）構成による分散**
- **ロードバランサ併用（F5, AWS ELBなど）**

### ✅ ログ・設定の可用性
- **Syslog送信先の冗長化**
- **設定ファイルのGit管理・バックアップ**
- **フェイルオーバー後もログが欠損しない構成**

---

## 4. 保守運用体制の整備

### ✅ 自動化・監視
- キャッシュ削除、ログローテーション、サービス再起動を**cronやsystemd-timerで自動化**
- プロセスダウン・高負荷検知用の監視（例：Zabbix, Prometheus）

### ✅ ドキュメントの整備
- 導入手順・障害時対応手順
- 証明書更新方法（SSLバンプあり時）
- ログ分析とアラート対応一覧

### ✅ バージョン管理とレビュー
- squid.confなどの構成ファイルを**Git管理**し、変更履歴を明確化
- 変更はPull Requestベースでレビュー

---

## 5. 使用する主要プロキシソフトの特徴比較

| ツール         | 特徴                                                                 |
|----------------|----------------------------------------------------------------------|
| **Squid**      | OSSで機能豊富。ACL・キャッシュ制御が柔軟。大規模利用に適す。        |
| **nginx**      | 高速だがフォワード用途は限定的。主にリバースプロキシ向け。           |
| **TinyProxy**  | 軽量・最小構成向け。組み込み系やIoTに。                             |
| **mitmproxy**  | SSL復号や通信改変が可能。セキュリティ診断や開発向け。               |

---

## 6. トラブル事例とその対処

| 事象                             | 原因例・対処方法                                               |
|----------------------------------|---------------------------------------------------------------|
| クライアントが接続できない       | - プロキシのポート開放忘れ<br />- Firewallやiptables設定見直し |
| HTTPSで証明書エラー             | - 中間CA証明書が未配布<br />- SSLバンプ設定ミス                 |
| ログが肥大化しディスク逼迫       | - ログレベルをINFOに下げる<br />- ログローテーション設定        |
| キャッシュが効かずトラフィック過多 | - TTLやキャッシュ対象ファイル設定の見直し                     |

---

## クライアント設定

クライアントがプロキシを利用するためには、以下の設定を行う必要があります。

### ブラウザ設定
- **Internet Explorer**:
  1. ツール > インターネットオプション > 接続 > LANの設定
  2. プロキシサーバーの使用にチェックを入れる
  3. アドレスとポート番号を入力

- **Google Chrome**:
  1. 設定 > 高度な設定 > プロキシ設定を開く
  2. Internet Explorerと同様の手順を行う

- **Firefox**:
  1. オプション > 一般 > ネットワーク設定 > 設定
  2. 手動でプロキシ設定を行い、アドレスとポートを入力

### OS設定
- **Windows**:
  1. コントロールパネル > ネットワークとインターネット > インターネットオプション > 接続 > LANの設定
  2. プロキシサーバーの使用にチェックを入れ、アドレスとポートを入力

- **MacOS**:
  1. システム環境設定 > ネットワーク > 使用しているネットワークを選択 > 高度 > プロキシ
  2. Webプロキシや安全なWebプロキシにチェックを入れ、アドレスとポートを入力

### 環境変数設定
- **Linux**:
  1. `/etc/profile`末尾に以下を追記

    ```sh
    export http_proxy="http://＜プロキシサーバの宛先※＞:10808"
    export https_proxy="http://＜プロキシサーバの宛先※＞:10808"
    ```

---

## ホワイトリスト追加

ホワイトリストを使用することで、特定のサイトへのアクセスを許可することができます。以下の手順でホワイトリストを追加します。

### Squidの設定例
1. `/etc/squid/squid.conf`を編集
2. 以下の行を追加

    ```plaintext
    acl whitelist dstdomain .example.com
    http_access allow whitelist
    ```

3. 設定を再読み込み

    ```sh
    sudo systemctl reload squid
    ```

### その他プロキシの設定例
- **TinyProxy**:
  1. `tinyproxy.conf`を編集
  2. `Allow`ディレクティブを使用してホワイトリストを定義

    ```plaintext
    Allow 192.168.0.0/16
    Allow example.com
    ```

  3. 設定を再読み込み

    ```sh
    sudo systemctl restart tinyproxy
    ```
---

## 参考リンク

- [Squid公式サイト](http://www.squid-cache.org/)
- [mitmproxy公式サイト](https://mitmproxy.org/)
- [ELK Stack概要](https://www.elastic.co/jp/what-is/elk-stack)
- [プロキシとキャッシュの違い（Qiita）](https://qiita.com/)