ネットワーク検証：AWS基盤のWebサーバー（IIS）にPACファイルを配置し、プロキシ経由でYahoo!サイトのみアクセスしてみた

## はじめに
今回は、AWS基盤上に構築したWebサーバー（IIS）にPACファイルを配置し、Yahoo!のサイトへのアクセス時にプロキシサーバーを経由し、それ以外の通信を拒否する技術検証を行います。

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

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

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

## 過去の技術検証の組み合わせ

今回の技術検証は、以下の手順を組み合わせて実施しています：

1. **Terraformを使用してAWS基盤上にWindowsサーバーを構築し、IISのWebサーバーを立てる。**
2. **Squidを用いたプロキシサーバーの構築。**
3. **PACファイルを利用した技術検証。**

詳細な検証手順については、以下の過去の技術検証記事をご参照ください：

- [Terraformを用いたWindowsサーバー構築](https://qiita.com/free-honda/items/96365478ca22fb888261)
- [Squidによるプロキシサーバー構築](https://qiita.com/free-honda/items/99170d4d481e7937d893)
- [PACファイル検証](https://qiita.com/free-honda/items/c27011b619190baf6523)

今回の内容は、過去の技術検証を組み合わせたものです。

:::note warn
***ただし、ネットワークやAWSに関する深い知識が必要になる部分もあるため、温かい目で見ていただければ幸いです。***
:::

## 書こうと思ったきっかけ
これまではローカルエリアネットワーク内、つまり自宅環境で同様の検証を行っていました。***しかし、これをAWS基盤上のパブリッククラウドで実施するとどうなるのか、気になっていました。***

:::note alert
**少し時間が取れたので、若干大規模な技術検証ではありますが、挑戦してみることにしました。**
:::

今回は、うまくいった内容を記録し、今後の自分の備忘録として記事にまとめていきます。

## 前提条件

以下の条件を前提に検証を行います：

1. **AWS基盤上に構築したWebサーバー（IIS）およびプロキシサーバーが、パブリックサブネットに配置されていること。**
2. **使用するPAC（Proxy Auto-Configuration）ファイルの設定例は以下の通りです：**

```javascript
function FindProxyForURL(url, host) {
    // Yahoo!のドメインに一致する場合はプロキシを経由
    if (dnsDomainIs(host, ".yahoo.co.jp") || shExpMatch(host, "www.yahoo.co.jp")) {
        return "PROXY xx.xx.xx.xx:3128"; // 指定したプロキシサーバーを経由
    }
    // それ以外のすべてのアクセスを拒否
    return "PROXY 127.0.0.1:0"; // 無効なプロキシを指定
}
```

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

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

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

## さらに、前提条件：それぞれの環境構成について
ここでは環境構築の詳細説明は割愛しますが、それぞれの構築手順を記載した過去の記事のリンクを掲載しています。***興味のある方は参考にしてみてください！***

**Webサーバー（IIS）**

![Screenshot 2025-01-12 at 8.36.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/ad09a07b-18ba-c610-b992-3229bbc63969.png)

:::note info
**Terraformを使用し、AWS上にWindowsサーバーを構築。IIS（Internet Information Services）を設定しています。**
:::

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

**プロキシサーバー**

![Screenshot 2025-01-12 at 8.37.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/783d7666-cfaa-19f1-e4d0-e59df2639df4.png)

:::note info
**TerraformとSquidを活用し、AWS基盤上にプロキシサーバーを構築しています。**
:::

https://qiita.com/free-honda/items/99170d4d481e7937d893

**クライアント端末**

![Screenshot 2025-01-12 at 8.39.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/9cd97bf7-d50f-3e58-778a-94961421f91c.png)

:::note info
**クライアント端末ではインターネットオプションの設定を変更しています。詳細については以下の記事をご確認ください。**
:::

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

## 実際にアクセスしてみた
まず、受講しているITスクールで使用しているチャットアプリ「**Mattermost**」にアクセスしてみました。

![Screenshot 2025-01-12 at 8.46.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/8d7fd65f-3044-dabd-3b19-981908609f7e.png)


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

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

![Screenshot 2025-01-12 at 8.48.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/d7462bbd-8a37-658a-a8ee-aa951be8619d.png)

## Squidアクセスログの確認
以下のコマンドを使用して、Squidのログをリアルタイムで確認しました。

```bash
sudo tail -f /var/log/squid/access.log
```

**以下は実際のログ出力例です。**

```/var/log/squid/access.log
[ec2-user@ip-10-0-1-18 ~]$ sudo tail -f /var/log/squid/access.log
1736638066.241 120158 xx.xx.xx.xx TCP_TUNNEL/200 8044 CONNECT ybx-test.yahoo.co.jp:443 - HIER_DIRECT/183.79.219.124 -
1736638066.540 120457 xx.xx.xx.xx TCP_TUNNEL/200 8044 CONNECT quriosity.yahoo.co.jp:443 - HIER_DIRECT/182.22.24.252 -
1736638066.685 120603 xx.xx.xx.xx TCP_TUNNEL/200 8012 CONNECT yeas.yahoo.co.jp:443 - HIER_DIRECT/183.79.219.124 -
1736638066.906 120827 xx.xx.xx.xx TCP_TUNNEL/200 8012 CONNECT logql.yahoo.co.jp:443 - HIER_DIRECT/183.79.219.252 -
1736638068.192 120148 xx.xx.xx.xx TCP_TUNNEL/200 8012 CONNECT ext.yahoo.co.jp:443 - HIER_DIRECT/182.22.24.252 -
1736638068.640 120613 xx.xx.xx.xx TCP_TUNNEL/200 12250 CONNECT ext.yahoo.co.jp:443 - HIER_DIRECT/182.22.24.252 -
1736639203.595  62196 xx.xx.xx.xx TCP_TUNNEL/200 8004 CONNECT ybx-test.yahoo.co.jp:443 - HIER_DIRECT/182.22.25.252 -
1736639203.596  62192 xx.xx.xx.xx TCP_TUNNEL/200 7988 CONNECT yeas.yahoo.co.jp:443 - HIER_DIRECT/182.22.24.252 -
1736639203.596  62197 xx.xx.xx.xx TCP_TUNNEL/200 7988 CONNECT logql.yahoo.co.jp:443 - HIER_DIRECT/183.79.219.124 -
1736639203.596  62197 xx.xx.xx.xx TCP_TUNNEL/200 8020 CONNECT quriosity.yahoo.co.jp:443 - HIER_DIRECT/124.83.185.124 -
1736639285.996  82386 xx.xx.xx.xx TCP_TUNNEL/200 626 CONNECT logql.yahoo.co.jp:443 - HIER_DIRECT/182.22.16.251 -
1736639285.996  82385 xx.xx.xx.xx TCP_TUNNEL/200 626 CONNECT yeas.yahoo.co.jp:443 - HIER_DIRECT/182.22.31.252 -
1736639285.998  82379 xx.xx.xx.xx TCP_TUNNEL/200 642 CONNECT quriosity.yahoo.co.jp:443 - HIER_DIRECT/183.79.249.252 -
1736639285.998  82379 xx.xx.xx.xx TCP_TUNNEL/200 626 CONNECT ybx-test.yahoo.co.jp:443 - HIER_DIRECT/183.79.249.252 -
1736639331.337 192295 xx.xx.xx.xx TCP_TUNNEL/200 107177 CONNECT www.yahoo.co.jp:443 - HIER_DIRECT/183.79.219.124 -
```

:::note warn
***これで、`yahoo.co.jp`関連の通信のみ、クライアント端末から正常にプロキシサーバーを通過していることが確認できます！***
:::

※PACファイルの設定通り、Yahoo!関連の通信のみがプロキシサーバーを通過するようになっています。

***そのため、ログに該当する通信が記録されていることが確認できました。***

![Screenshot 2025-01-12 at 8.55.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3662571/bf6eabd0-561a-1acf-61dd-d61095dc098f.png)

### 確認ポイントと注意点

- **HTTPステータスコード**  
  ログに記載された `TCP_TUNNEL/200` は、プロキシサーバーがリクエストを正常に中継したことを示しています。

- **プロキシ設定の確認**  
  クライアント端末で設定したプロキシ情報に誤りがある場合、インターネットへの接続が失敗することがあります。***設定の再確認を行いましょう。***

## まとめ
ここまでお読みいただきありがとうございました。***今回は自分にとってもかなり骨の折れる技術検証でしたが、Terraformを使ってコード管理を行っていたおかげで、スムーズに何度も検証を繰り返すことができました。***

:::note warn
**今後はさらにプロキシサーバーの台数を増やし、リバースプロキシの検証にも挑戦してみたいと考えています。**
:::

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