ネットワーク検証：AWS上のWindowsサーバーでPACファイルを活用し、インターネット通信を制御してみた

## はじめに
今回は、[前回構築したAWS上のWindowsサーバー（IISウェブサーバー）](https://qiita.com/free-honda/items/96365478ca22fb888261)を利用して、PACファイル（Proxy Auto-Configファイル）の技術検証を行います。

:::note info
**今回の検証では、主にネットワークの観点からの技術的な検証を行い、自分自身の復習も兼ねて体系的にまとめていきます。**
:::

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

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

## 前提：ネットワークの知識がある方のみお試しください
過去に自宅のDNSサーバーを使った名前解決の技術検証や、今回のようなプロキシサーバーの設定を試みた際、***ネットワークの知識がないまま作業すると、インターネットにアクセスできなくなるリスクがあります。***

:::note alert
***私自身も、設定を色々といじっていた時期にインターネットにアクセスできなくなり、かなり困った経験があります...。***
:::

その際にはスマホを使って原因を特定し、解決する羽目になったという、いわゆる「**黒歴史**」もあります。

***そのため、今回ご紹介する技術検証については、ネットワークに関する十分な知識を身につけた上で、自己責任で取り組んでいただきますようお願いいたします。***

## 書こうと思ったきっかけ
普段、自宅では`squid`というミドルウェアを使い、プロキシサーバーを構築しています。

:::note warn
***一部の端末は、このプロキシサーバーを経由してインターネットに接続するようネットワークを設定しています。***
:::

構築方法などが気になる方は、過去の記事をご参照ください。

https://qiita.com/free-honda/items/27a201413787414b0108

これまではローカルエリアネットワーク内でPACファイルを利用した技術検証を行ったことはありましたが、**AWSのような外部向けのパブリック基盤での技術検証は経験がありませんでした...。**

***そこで、今回のIISを利用した環境構築を通じて、新たに技術検証を試してみることにしました。***

また、過去にPACファイルの技術検証を行った記事もありますので、興味のある方はぜひこちらもご覧ください。

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

## 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

ブラウザやネットワーク機器は、PACファイルを読み込むことで効率的に通信ルートを自動設定できます。

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

## 前提準備
この記事で使用する環境は、以下の記事で紹介したTerraformコードを使い、AWS上にWindowsサーバーを構築しIISを導入したものです。

https://qiita.com/free-honda/items/96365478ca22fb888261

### PACファイルの準備
**インフラを専門領域としているからといって、JavaScriptを勉強しなくて良いわけではありません。**

:::note warn
***このような小さな技術検証の際に、必要なコードを書けるスキルが役立ちます。***
:::

以下は、Yahoo! のサイトへのアクセスを「インターネットダイレクト」とし、それ以外のすべてのサイトへのアクセスを拒否するPAC（Proxy Auto-Configuration）ファイルの設定例です。

```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"; // 無効なプロキシを指定
}
```

***このコードはJavaScript形式で記述され、特定のURLやIPアドレスに応じてプロキシを使用するかどうかを条件分岐で決めています。***

さらに詳しい例として、以下の記事ではPACファイルのパターンをいくつか紹介していますので、ぜひ参考にしてください。

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

### 補足：作成したPACファイルがダウンロードできないエラーについて
通常、ウェブサーバーにPACファイルを配置した際には、ブラウザ経由でそのファイルを正常にダウンロードできるかどうかを確認します。

:::note alert
**しかし、今回は以下のようなエラーが発生し、PACファイルをダウンロードできない問題が生じました。**
:::

![Screenshot 2025-01-11 at 8.44.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/27b55968-ceb5-5791-9d59-73a16c15c914.png)

以前、自宅のウェブサーバーにPACファイルを配置した際には問題なくダウンロードできていたため、今回も同様の手順を踏んでいました。

***しかし、今回はエラーが発生したため、原因の調査および解決に取り組みました。***

一般的な原因としては、PACファイルが正しい場所に配置されていない可能性が考えられますが、私の環境ではこの問題は該当しませんでした。

![Screenshot 2025-01-11 at 8.50.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c00aa729-70ea-2780-8e2e-560f52960aeb.png)

***調査の結果、IISの設定で特定の拡張子（`.pac` など）がデフォルトで許可されていなかったことが、エラーの原因であると判明しました。***

#### PACファイル取得エラーの対処方法
PACファイルが正常にダウンロードできない問題に対して、以下の手順で解決することができます。

IISマネージャーを起動します。

![Screenshot 2025-01-11 at 8.45.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/d16f8d85-0a29-b40a-8c05-5a8b63ecc6fe.png)

該当するサイトのプロパティを開き、「MIMEタイプ」を選択します。

![Screenshot 2025-01-11 at 8.46.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/90e8d4bb-2618-8834-2cb6-c4707d978edf.png)

以下の設定をIISマネージャーで追加してください：

- **ファイル拡張子**: `.pac`
- **MIMEタイプ**: `application/x-ns-proxy-autoconfig`

![Screenshot 2025-01-11 at 8.56.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f2594239-d481-ab13-f9fb-95536f2d2eba.png)

MIMEタイプの一覧に `.pac` が表示されていることを確認します。

![Screenshot 2025-01-11 at 8.47.32.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/872745a8-6056-e5aa-d18f-2915919826b9.png)

この設定を行うことで、PACファイルを正常に取得できるようになります。

![Screenshot 2025-01-11 at 8.48.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c9dbc40d-c92b-78bd-6c11-7ccd334aafc5.png)

***さらに、ダウンロードしたPACファイルの中身を確認したところ、想定通りの内容であることが確認できました。***

![Screenshot 2025-01-11 at 8.58.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/c4a35d50-0956-958a-498e-ec07a391eac3.png)

## Windows 11のローカル端末を使った制御の検証
ここでは、ローカルエリアネットワーク内にあるWindows 11のPCを使用して、PACファイルの設定を検証しました。

Windowsのスタートメニューから「コントロールパネル」を検索して開き、「インターネットオプション」を選択します。

![Screenshot 2025-01-11 at 8.51.47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/fe298abc-3f0e-e498-34e3-a4763a369b97.png)

「インターネットオプション」の「接続」タブを選択し、一番下にある「LANの設定」ボタンをクリックします。

![Screenshot 2025-01-11 at 8.52.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/f5ac4dd6-0555-14da-fb60-2e4233a70597.png)

「アドレス」の欄に、構築したWindowsサーバーのパブリックIPアドレスを入力し、その後ろに「`/proxy.pac`」を付加します。

- **例:** `http://<サーバーのパブリックIPアドレス>/proxy.pac`

**補足**  
- 今回は専用のプロキシサーバーを準備せず、PACファイルの設定内容を利用してインターネット通信の制御を実施しました。
- この設定によって、特定の通信を許可または拒否する挙動を検証しています。

## 実際にアクセスしてみた
最初に、受講しているITスクールで利用しているMattermostというチャットアプリにアクセスしてみました。

![Screenshot 2025-01-11 at 8.54.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/968004d2-c3b7-a805-682c-974e4e2cffe4.png)

結果は、今回の設定通り、Yahoo!以外のサイトにはアクセスできないようにしているため、インターネット接続ができないことを確認しました。

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

![Screenshot 2025-01-11 at 8.55.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/dbb92f43-1618-e027-0330-d9fd4936959c.png)

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


## まとめ

ここまで読んでいただきありがとうございました。***今回の内容は、ネットワークに関する深い知識と応用的な技術力が求められる技術検証でしたが、想定通りにすべて完了し、一安心しています。***

:::note alert
**改めて、ネットワークについて学び直す貴重な機会となりましたが、やはりネットワークは最も難しく、技術の「***鬼門***」だと改めて感じました。**
:::

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

## 参考記事

https://qiita.com/shuncask/items/0b762a34db4ffffe98a2#:~:text=PAC%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%EF%BC%88%E3%83%97%E3%83%AD%E3%82%AD%E3%82%B7%E8%87%AA%E5%8B%95%E8%A8%AD%E5%AE%9A,%E3%81%AF%E3%80%8C.pac%E3%80%8D%E3%81%A7%E3%81%99%E3%80%82