macOSでSquidプロキシを構築して特定ドメインだけ許可する方法

今回は昔からよくやる検証なのに、すぐ忘れてしまう**Squid**の設定について書きたいと思います。
プリセールスをで仕事をしていると、私が所属している会社のサービスをセキュアな場所から利用したいという要望が多くあります。
その時に、どのドメイン（URL）を許可すれば良いか？という話題になります。
自分の環境ではすぐに検証ができないので、**Squid**をローカル端末に入れて、Firefoxで検証するという手順をよく使っています。
この時に**squid.conf**をどう書くべきかすぐ忘れてしまうので、そのあたり含めて一通りの手順を残していきたいと思います。

ネットで調べても最近は**squid**を話題にしている人も少ないのでどれだけニーズがあるかわかりませんが、誰かの参考になればと思っています。

## 前提
 
私が今回使用しのは下記の環境です。
- Mac mini M4
- Mac OS 15.4.1
- Firefox 138.0
- Homebrewはインストール済み
- squid 6.13
- Curlコマンドも利用可能

## 導入

1. Squidのインストール
``` bash
brew install squid
```

2. Squidの起動
``` bash
brew services restart squid
```

3. 起動確認
``` bash
brew services list
```
私の場合、ここで**エラー**が発生しました。

```bash
ERROR: Cannot open cache_log (/opt/homebrew/var/logs/cache.log) for writing;
fopen(3) error: (13) Permission denied

Logfile: opening log daemon:/opt/homebrew/var/logs/access.log
ERROR: logfileHandleWrite: daemon:/opt/homebrew/var/logs/access.log: error writing ((32) Broken pipe)
```
権限エラーだったので、フォルダを作成して権限を付与する手順に移行します。

4. ログ、キャッシュディレクトリの作成と権限付与
```bash
sudo mkdir -p /opt/homebrew/var/logs
sudo mkdir -p /opt/homebrew/var/cache/squid
sudo chown -R $(whoami) /opt/homebrew/var/logs
sudo chown -R $(whoami) /opt/homebrew/var/cache/squid
```

5. 設定ファイルの編集
/opt/homebrew/etc/squid.conf内のそれぞれの項目を下記で置き換えてください。
今回私は、Twilioのコンソールアクセスのために検証をしたので、acl allowed_sitesを下記のように追加していますが、皆さんは自分の検証したいURLを入れてください。
``` conf
# アクセス許可するドメインを定義
acl allowed_sites dstdomain .twilio.com .auth0.com .cloudflare.com .twiliocdn.com .twilio.com .google.com

  
# 通信の基本設定
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl CONNECT method CONNECT

# 許可設定（順序が重要）
http_access allow localhost
http_access allow allowed_sites
http_access deny all

# ポート設定
http_port 127.0.0.1:3128
http_port [::1]:3128

# ログとキャッシュ
access_log /opt/homebrew/var/logs/access.log
coredump_dir /opt/homebrew/var/cache/squid
```

6. Squid の再起動
```bash
brew services restart squid
```

7. 起動確認
``` bash
brew services list
```
エラーが出ないでSuccessになっていればOK

8. 動作確認
```
curl -v https://www.twilio.com -x http://127.0.0.1:3128
```
→ TCP_TUNNEL/200 が access.log に出れば成功。

```
curl -v https://www.yahoo.co.jp -x http://127.0.0.1:3128
```
→ TCP_DENIED/403 になれば正常にブロックされている。

## アクセスログの見方まとめ
```bash
tail -f /opt/homebrew/var/logs/access.log
```

| **状態コード**      | **意味**      |
| -------------- | ----------- |
| TCP_TUNNEL/200 | 成功（HTTPS通過） |
| TCP_DENIED/403 | アクセス拒否された   |

## ブラウザにプロキシ設定
### 設定手順
1. Firefox を起動
2. 右上の「≡」メニュー → **設定**
3. 下にスクロールして「ネットワーク設定」セクションまで進む
4. **接続設定…** をクリック
5. 「手動でプロキシを設定する」を選択
6. 以下のように入力：

![SCR-20250518-rmfw.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/649595/b0ebbc58-037f-49f6-951d-2dddfbf07a91.png)


| **項目**      | **設定値** |
| ---          | --- |
| HTTP プロキシ  | 127.0.0.1 |
| ポート         | 3128 |



### Firefoxを選んでいる理由
- ***Firefoxは「アプリ内でプロキシ設定が完結」する**
	- ChromeやSafariは**OS（macOSやWindows）全体のネットワーク設定**に依存します。
	- Firefoxは**ブラウザ単体で独立したプロキシ設定を持っている**ため、OS側の設定に関係なく挙動を変えられます
- ***テストやデバッグに最適**
	- 開発時やSquidなどのプロキシ検証において、Firefoxだけプロキシを通す設定にすれば、**他のアプリや通信には影響を与えずに検証できる**


## 終わりに
以上でsquidの導入手順について説明を終わります。
もっといろんな機能がsquidにあるんですけど、ほとんど使ったことがありません。
自分はいつもProxyでフィルターする機能の検証のために使っています。また何か違う使い方をする時には、squidの記事をアップしたいと思います。