AzureVM (Windows) と Squid でプロキシサーバを構築してみた

## はじめに
AzureVM (Windows) と Squid を使用してプロキシサーバを構築してみました。
以下のような構成イメージとなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/2de0c388-9c7c-4338-a0f1-a04851de5ca8.png)

リソース作成から疎通確認までの一連の流れとつまづいたポイントを記載していきます。

## Squidについて
以下、ウィキペディアからの引用となります。
>Squid（スクウィッド）はプロキシ (Proxy) サーバ、ウェブキャッシュサーバなどに利用される自由ソフトウェア。

Linux環境向けのソフトウェアのようですが、Windows版もあり、今回はそちらを使用いたします。

https://squid.diladele.com/

## 作成リソースについて
今回はAzure Portalから作成しました。参考までに各リソースの主要なパラメータの設定値を載せておきます。

* 仮想ネットワーク

| パラメータ名 | 設定値の例 |
|:-----------|:------------|
| 仮想ネットワーク名 | vnet_on-premises |
| リージョン | Japan East |
| アドレス範囲 | 10.0.0.0/24 |
| サブネット① | subnet_proxy |
| サブネット①範囲 | 10.0.0.0/28 |
| サブネット② | subnet_client |
| サブネット②範囲 | 10.0.0.16/28 |

* 仮想マシン

| パラメータ名 | 設定値の例（仮想マシン①） | 設定値の例（仮想マシン②） |
|:-----------|:------------|:------------|
| 仮想マシン名 | vm-proxy | vm-client |
| リージョン | Japan East | Japan East |
| イメージ | Windows Server 2022 | Windows Server 2022 |
| サイズ | Standard_B2als_v2 | Standard_B2als_v2 |
| パブリック受信ポート | 選択したポートを許可する | 選択したポートを許可する |
| 受信ポートを選択 | RDP | RDP |
| 仮想ネットワーク | vnet_on-premises | vnet_on-premises |
| サブネット | subnet_proxy | subnet_client |
| パブリックIP | vm-proxy-ip | vm-client-ip |

* NSG：VM（NIC）とサブネット両方にそれぞれ紐づける

:::note info
つまづいたポイント
仮想マシンの設定で「自動シャットダウンを有効する」というパラメータがあります。こちらを有効にしてデプロイしたところ、以下のようなエラーが発生しました。
>{"code":"AuthorizationFailed","message":"オブジェクト ID が 'xxx' のクライアント 'xxx' には、スコープ 'xxx' でアクション 'Microsoft.DevTestLab/register/action' を実行する認可がないか、スコープが無効です。アクセスが最近許可された場合は、資格情報を更新してください。

自動シャットダウンを有効にするにはAzure VM (Microsoft.Compute/virtualMachines) に対する権限だけではなく、Microsoft.DevTestLab/* に対する権限が必要なようでした。
詳細は以下のドキュメントをご確認ください。

https://jpdscore.github.io/blog/devtestlabs/auto-shutdown-permission/

:::

## プロキシ構築
基本的には以下の記事を参考に実施しました。

https://4thsight.xyz/37141

### Windows版Squidのインストール
プロキシVM（vm-proxy）で、以下からインストーラーをダウンロードします。

https://squid.diladele.com/

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/b2f8440d-f85c-4198-b29b-e07db31b851c.png)

インストーラーを実行して、既定のままインストールを進めていきます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/2f6c1347-6100-4228-a601-1e24ea120d72.png)

ディスクキャッシュを有効化やポートの変更等は特にしていないです。変更する場合は、上述に貼付している参考記事をご参照ください。

### プロキシサーバ上での動作確認
プロキシVM（vm-proxy）上で動作確認を行います。コマンドプロンプトで以下のコマンドを実行します。
```curl:
curl https://www.yahoo.co.jp -x http://localhost:3128 -v
```
「HTTP/1.1 200 Connection established」と表示されているのでうまくいっていそう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/41b17479-71f5-4eea-8129-addfa47c86f4.png)

### クライアントサーバ上での動作確認
クライアントVM（vm-client）上で動作確認を行います。
まずは、「設定」 > 「ネットワークとインターネット」 > 「プロキシ」 で以下のようにプロキシを設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/2fc6b658-9e10-4321-b1fd-f3e6d59d7472.png)

次に、コマンドプロンプトで以下のコマンドを実行してみましたが、エラーとなってしまいました。
```curl:
curl https://www.yahoo.co.jp -x http://<プロキシVMのプライベートIP>:3128 -v
```
エラーの原因はプロキシVMのファイアウォールの受信規則が足りていないためでした。
「セキュリティが強化された Windows Defender ファイアウォール」 > 「受信の規則：Squid Cache Server」 > 「スコープ」 > 「リモートIPアドレス」 でクライアントVM（サブネット範囲）のIPを追加します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/ee670187-824c-409a-9b04-1bc38c1cd3bc.png)

クライアントVMで再度コマンドを実行したところ成功しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/60c96306-3fc3-4d1c-8034-f46826f24e0d.png)

また、インターネットに接続しているIPアドレスを確認すると、プロキシVMのパブリックIPが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3478068/6689b540-4321-4f47-8d01-6b4d0c502487.png)

Squidへの接続状況は「C:¥Squid\var\log\squid\access.log」に記録されるようです。

## おわりに
ネットワークについては初学者なので、間違えている箇所もあるかもしれませんが、ご参考になれば幸いです。