ネットワーク検証：S3バケットに配置したPACファイルを活用し、インターネット通信を制御してみた

## はじめに
前回は、Terraformを使ってAWS上に構築したWindowsサーバー（IISウェブサーバー）を活用し、PACファイル（Proxy Auto-Configファイル）の技術検証を行いました。

:::note warn
**今回は、ウェブサーバーを使用せずに、S3バケットを活用してPACファイルを代用する方法に着目し、技術検証を行っていきます。**
:::

この記事は個人レベルでの検証内容に基づいています。 **そのため、内容が実運用環境に適さない場合があることをご了承ください。**

***この内容が、どなたかの技術的な参考になれば幸いです。***

## 書こうと思ったきっかけ
私自身、PACファイルを扱う案件に対応する際に、「**そもそもウェブサーバーを用意する必要があるのか？**」という疑問を抱き、インターネット上の文献を調べながら模索していました。

:::note info
**その中で、「***S3バケットを利用してウェブサーバーの代わりにPACファイルを配置できる***」という内容の記事を見つけ、試してみようと思いました。**
:::

今回の内容自体はそれほど難しいものではありませんが、S3を活用して手軽にインターネット通信を制御できる点に感動しました。***この経験を基に、自分なりに記事としてまとめていきたいと思います。***

# PACファイル（Proxy Auto-Configファイル）について
PACファイル（Proxy Auto-Configファイル）は、クライアントがインターネット通信において使用するプロキシサーバーを自動的に選択するための設定ファイルです。

![Screenshot 2025-01-11 at 9.28.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/2da092a4-3600-a517-39cd-25d81a6bbc83.png)
引用画像：https://help.zscaler.com/ja/zia/understanding-pac-file

一般的にはウェブサーバー上に配置することが多いですが、今回はS3バケットに配置して利用します。

:::note info
**特に企業や大規模ネットワークでは、柔軟なプロキシ制御を実現するために役立ちます。PACファイルの拡張子は通常「`.pac`」です。**
:::

***これまでに何度かPACファイルの技術検証を行っていますので、以下の記事もぜひ参考にしてみてください。***

https://qiita.com/free-honda/items/c27011b619190baf6523

https://qiita.com/free-honda/items/abaf49ad8ce065dc59f1

## 実際にやってみた
今回は専用のプロキシサーバーを用意せず、PACファイルの設定を利用してインターネット通信の制御を実施しました。

***この設定により、特定の通信を許可または拒否する動作を検証しています。***

### 1. PACファイルを作成する
以下の内容を記述したPACファイルを作成し、ローカル環境に保存します。ファイル名は例として`proxy.pac`とします。

```javascript
function FindProxyForURL(url, host) {
    // Yahoo!のドメインに一致する場合は直接接続
    if (dnsDomainIs(host, ".yahoo.co.jp") || shExpMatch(host, "www.yahoo.co.jp")) {
        return "DIRECT"; // インターネットダイレクト
    }
    // それ以外のすべてのアクセスを拒否
    return "PROXY 127.0.0.1:0"; // 無効なプロキシを指定
}
```

この設定は、Yahoo!のサイトへのアクセスを「インターネットダイレクト」（直接接続）とし、それ以外のすべてのサイトへのアクセスを拒否する仕組みを記述しています。

:::note warn
***このように簡潔なJavaScriptコードを用いることで、インターネット通信の制御が可能になります。***
:::

### 2. S3バケットを作成する
AWSマネジメントコンソールでS3サービスに移動し、「バケットを作成」をクリックします。

バケット名（例：`my-pac-files`）とリージョンを指定し、その他の設定はデフォルトのまま作成します。

![Screenshot 2025-01-11 at 15.20.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/7d1c657a-99e0-646a-c649-d24cc8d4af19.png)

***バケットが正常に作成され、汎用的な設定で利用可能な状態になっていることを確認しました。***

![Screenshot 2025-01-11 at 15.20.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/648b89c2-a497-6c74-a79f-7452a0ea841d.png)

### 3. PACファイルをS3にアップロードする
作成したバケットを選択し、「アップロード」をクリックして、先ほど作成した`proxy.pac`ファイルをアップロードします。

![Screenshot 2025-01-11 at 15.23.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/7a121cdb-3afa-19f5-a50e-3f37308260ba.png)

### 4. S3バケットの公開設定を確認する
S3バケットにアップロードしたPACファイルに直接アクセスしようとすると、以下のような`AccessDenied`エラーが発生します。これは想定通りの挙動です。

アクセスコントロールリスト (ACL) でパブリックアクセスを許可していないため、外部からのアクセスが拒否されています。

```bash
This XML file does not appear to have any style information associated with it. The document tree is shown below.
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>RYP04B0RQEGCCBRG</RequestId>
<HostId>zLNFqVTB4q5xRqNmOOLws2DiKYFgsEmMpvKaSSyyIfmehJWuyZs8p2lIiEo53lZVyOLoyDtbm/I=</HostId>
</Error>
```

バケットの「アクセス許可」タブを開き、アクセスコントロールリスト (ACL) で「全員 (パブリックアクセス)」に読み取り権限を付与します。

![Screenshot 2025-01-11 at 15.30.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/e4cda4bc-a59b-06a8-aecf-caf9b45bb912.png)

**補足**

AWSの管理コンソールは昔に比べて大幅にUIが変更されており、この設定画面を操作する際に少し戸惑う場面もありました。

:::note info
***普段はAWS CLIやCloudShellを使用することが多いため、関連する記事もリンクとして載せておきますので、参考にしてみてください。***
:::

https://qiita.com/free-honda/items/866986d98fdb2fc1a56e

https://qiita.com/free-honda/items/b6cbdd00a3932a401847

https://qiita.com/free-honda/items/19b4e7db8b8f24d41277

### 5. クライアントでPACファイルを設定する
以下の手順で、Windowsクライアント（例：Windows 11）にPACファイルを設定する方法を解説します。

***詳しくは、以下の記事もご参照ください。***

https://qiita.com/free-honda/items/c27011b619190baf6523

1. **コントロールパネルを開く**  
   - Windowsのスタートメニューから「コントロールパネル」を検索して開きます。
   - 「インターネットオプション」をクリックします。

2. **LANの設定を開く**  
   - 「インターネットオプション」のウィンドウが表示されます。
   - 「接続」タブを選択し、一番下にある「LANの設定」ボタンをクリックします。

3. **自動構成スクリプトを使用するにチェックを入れる**  
   - 「ローカル エリア ネットワーク (LAN) の設定」ウィンドウが表示されます。
   - 「自動構成スクリプトを使用する」にチェックを入れます。

4. **アドレス欄にS3の公開URLを入力する**  
   - S3バケットにアップロードしたPACファイルのURLをアドレス欄に入力します。  
     **例：** `https://my-pac-files.s3.ap-northeast-1.amazonaws.com/proxy.pac`

5. **設定を保存する**  
   - 「OK」をクリックして設定を保存します。
   - 再度「OK」をクリックして「インターネットオプション」を閉じます。

---

**補足:**

この設定を行うことで、指定したPACファイルを利用したプロキシ制御が有効になります。

:::note alert
***ただし、設定を誤るとインターネットアクセスが制限される可能性があるため、慎重に作業を行ってください。***
:::

## ブラウザでアクセスしてみた
まず、AWSのマネジメントコンソールにログインを試みましたが、今回の設定通りインターネット接続が制限されていることを確認できました。

![Screenshot 2025-01-11 at 15.47.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/66aa81c2-7854-0ec0-4b8d-721c10eac69a.png)

次に、Yahoo!関連のサイトにアクセスを試してみました。***こちらは想定通り、問題なく接続が成功しました。***

![Screenshot 2025-01-11 at 15.49.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/add68ba1-94c9-67ac-8b04-94a162f6b375.png)

:::note warn
**※注意：**
***今回使用したPACファイルの設定では、Yahoo!関連のURLのみを許可しているため、一部の要素が表示されなかったりするのは想定通りの挙動です。***
:::

## まとめ
ここまでお読みいただきありがとうございました。AWSの基礎知識とネットワークの知識があれば、それほど難しい内容ではありませんが、とても有意義な技術検証となりました。

:::note alert
**ただし、普段あまり利用頻度の高くないS3バケットのパブリックアクセス設定については、少し戸惑う場面もありました...。**
:::

***今回の技術検証が少しでも参考になり、どなたかの技術の支えになれば幸いです！***

## 参考記事

https://dev.classmethod.jp/articles/proxy-auto-configuration-file-on-s3-from-vpce/

https://dev.classmethod.jp/articles/proxy-auto-configuration-file-on-s3/