Squid 6.13をインストールする（ソースからコンパイル） for RockyLinux9 and UbuntuLinux22.x (SSLインスペクション対応)

Proxyサーバーとして有名なSquidをRockyLinux9.3/UbuntuLinux 22.xにインストール（ソースからコンパイル）する方法をご紹介します。
AlmaLinuxやそのほかRHEL互換OSであれば、同様に以下の手順で導入可能だと思います。
Squidは、2025年2月現在、6.13が最新版となります。
今は、ソースがGitHubに置かれています。GitHubのBootstrapedのソースをダウンロードします

また、本インストールではあらかじめOpenSSLのインストールが必要となります。
OpenSSLのインストール方法は以下を参考にしてください。

[RockyLinux 9.xとUbunt22.xにOpenSSL 3.2.xをインストールする（ソースからビルド）](https://qiita.com/shadowhat/items/81ab95656e98c84f3967)


## インストール
```:bash
cd /usr/local/src
wget https://github.com/squid-cache/squid/releases/download/SQUID_6_13/squid-6.13.tar.gz
tar xfzv squid-6.13.tar.gz
cd squid-6.13/
./configure \
--with-large-files \
--enable-ssl-crtd \
--with-openssl=/usr/local/ssl \
--enable-security-cert-generators \
--enable-security-cert-validators\
--enable-linux-netfilter \
--with-default-user=daemon
make -j 8
make install
```

## 権限設定を変更する

```:bash
chown -R daemon:daemon /usr/local/squid
```



## 起動ファイルを作成する
起動ファイルは、CentOSのRPMを利用し、若干カスタマイズします。

```bash:squid.service
cat > /usr/lib/systemd/system/squid.service << EOF
[Unit]
Description=Squid caching proxy
After=syslog.target network.target nss-lookup.target

[Service]
Type=forking
LimitNOFILE=16384
#EnvironmentFile=/etc/sysconfig/squid
#EnvironmentFile=/usr/local/squid/etc/squid.conf
Environment="SQUID_CONF=/usr/local/squid/etc/squid.conf"
ExecStartPre=/usr/local/squid/libexec/cache_swap.sh
ExecStart=/usr/local/squid/sbin/squid \$SQUID_OPTS -f \$SQUID_CONF
ExecReload=/usr/local/squid/sbin/squid \$SQUID_OPTS -k reconfigure -f $SQUID_CONF
ExecStop=/usr/local/squid/sbin/squid -k shutdown -f \$SQUID_CONF
TimeoutSec=0

[Install]
WantedBy=multi-user.target
EOF
```

cache_swap.shを作成します。
```:bash:cache_swap.sh
cat > /usr/local/squid/libexec/cache_swap.sh << EOF
#!/bin/bash
if [ -f /etc/sysconfig/squid ]; then
        . /etc/sysconfig/squid
fi

SQUID_CONF=${SQUID_CONF:-"/usr/local/squid/etc/squid.conf"}

CACHE_SWAP=\`sed -e 's/#.*//g' $SQUID_CONF | grep cache_dir | awk '{ print $3 }'\`

for adir in $CACHE_SWAP; do
        if [ ! -d $adir/00 ]; then
                echo -n "init_cache_dir $adir... "
                squid -N -z -F -f $SQUID_CONF >> /usr/local/squid/var/logs/squid.out 2>&1
        fi
done
EOF
```

```
chmod +x /usr/local/squid/libexec/cache_swap.sh
```


## 設定ファイルの編集
デフォルトだと、ipv6でしかポートをlistenしないため、変更する

```bash:
vi /usr/local/squid/etc/squid.conf
```

変更箇所
http_portに「0.0.0.0:ポート番号」とし、前にipv4の0.0.0.0を追加する

```:squid.confの変更箇所
http_port 0.0.0.0:3128
```

起動ユーザーをdaemonを指定する

```:squid.confの最下部に追加
cache_effective_user    daemon
cache_effective_group   daemon
```
保存する


## 起動と自動起動設定

```:bash
systemctl start squid
systemctl enable squid
```

## 設定ファイルに誤りが無いかをチェックする
```:bash
/usr/local/squid/sbin/squid -k check
```


## SSLインスペクションに対応する
### 証明書を作成する
#### 秘密鍵を作成

```
#Directory作成
export LD_LIBRARY_PATH=/usr/local/ssl/lib
mkdir /usr/local/squid/etc/cert/
#CSR+秘密鍵作成
/usr/local/ssl/bin/openssl req -new -key /usr/local/squid/etc/cert/squid.key -out /usr/local/squid/etc/cert/squid.csr
```

#### Windowsの証明期間で証明書を作成する
CAから証明書を作成する。
Windowsで証明書を発行する場合、証明書テンプレートは必ず「下位の証明期間」を選択します。
これがないと、ChromeやEdgeで証明書エラーが出ます。
追加属性には、入力は不要です。（san追加は不要）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85495/58aa6acf-a6d3-49a5-a04e-93643b27f965.png)


:::note alert
Windowsの証明書サーバーで作成する場合は、必ず「下位の証明機関」で証明書を作成してください。通常のサーバー証明書で作成するとChrome等の場合エラーになりませんが、IEやIEのエンジンを使ったMicrosoft 365の認証などで証明書のエラーが表示され正常に動作しません。
:::

:::note info
参考
[Windows Serverの認証局でSAN属性を持たせたマルチドメイン証明書を認証する](https://qiita.com/shadowhat/items/f71b2564dfed0319fbac)
:::

### 証明書の配置
Windows CAで発行された証明書をダウンロードして、配置します。
さらに、Windows CA自体の証明書をもダウンロードし1つのファイルに記載します。
ここでは、squid.pemとします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85495/a729a5c2-a962-6bc7-02d2-a99ed5546d3f.png)

### クライアントへインポートする証明書
先ほどの用意した証明書のベースであるCAの証明書とProxyサーバー用の証明書をインポートします。配置場所は、「信頼されたルート証明期間」を選択します。


```
/usr/local/ssl/bin/openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -keyout squidCA.pem -out squidCA.pem
```

### キャッシュ領域作成
```:bash
mkdir -p /usr/local/squid/var/lib
mkdir -p /usr/local/squid/var/spool

#キャッシュDB作成
/usr/local/squid/libexec/security_file_certgen -c -s /usr/local/squid/var/spool/ssl_db -M 4MB
chown -R daemon:daemon /usr/local/squid
```

### 設定ファイルを変更
```
vi /usr/local/squid/etc/squid/conf
```

```:/usr/local/squid/etc/squid/conf
#http_port 0.0.0.0:3128
# ↓
http_port 3128 ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/usr/local/squid/etc/cert/squid.pem key=/usr/local/squid/etc/cert/squid.key

下に追記
sslcrtd_program /usr/local/squid/libexec/security_file_certgen -s /usr/local/squid/var/spool/ssl_db -M 4MB
sslcrtd_children 5
ssl_bump server-first all
sslproxy_cert_error deny all
```


## キャッシュDB作成+権限設定を変更する

```:bash
#/usr/local/squid/libexec/security_file_certgen -c -s /usr/local/squid/var/spool/ssl_db -M 4MB
chown -R daemon:daemon /usr/local/squid
```

## 起動と自動起動設定

```:bash
systemctl start squid
systemctl enable squid
```

# トラブルシューティング

### プロセスが落ちて起動しない場合

```
systemd[1]: Starting Squid caching proxy...
systemd[1]: Started Squid caching proxy.
squid[420873]: Squid Parent: will start 1 kids
squid[420873]: Squid Parent: (squid-1) process 420875 started
squid[420873]: Squid Parent: squid-1 process 420875 exited with status 1
squid[420873]: Squid Parent: (squid-1) process 420883 started
squid[420873]: Squid Parent: squid-1 process 420883 exited with status 1
squid[420873]: Squid Parent: (squid-1) process 420891 started
squid[420873]: Squid Parent: squid-1 process 420891 exited with status 1
squid[420873]: Squid Parent: squid-1 process 420907 will not be restarted for 3600 seconds due to repeated, frequent failures
```
とエラーが出る場合は、
/usr/local/squid/var/log/cache.log
を確認する。

おそらく、
```
sslcrtd_program| FATAL: Cannot generate certificates: Uninitialized SSL certificate database directory: /usr/local/squid/var/spool/ssl_db. To initialize, run "security_file_certgen -c -s /usr/local/squid/var/spool/ssl_db".
```
というエラーが出ている可能性が高い。

その場合は、「キャッシュ領域作成」のディレクトリ作成から作業を行う。


### 証明書エラーが出る場合
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85495/d68299c8-21d2-4f2d-a4cc-232b0f170ced.png)
このような証明書エラーが出る場合、以下の点を確認してください。

#### 1. 証明書を発行する際に、「下位の証明機関」で発行をしていない場合。
Webサーバーなどで発行するとこうなります
以下を参考に、CAの証明書の下に、Squid用に発行した証明書が表示されているかを確認してください。この多段になっていない場合、下位の証明機関で発行された証明書になっていない可能性が高いです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/85495/2f980158-350e-4eef-8265-b0d392db2e69.png)

この場合[Windowsの証明期間で証明書を作成する](https://qiita.com/shadowhat/items/f595d564498bbccb46d5#windows%E3%81%AE%E8%A8%BC%E6%98%8E%E6%9C%9F%E9%96%93%E3%81%A7%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E4%BD%9C%E6%88%90%E3%81%99%E3%82%8B)を確認して、証明書を再発行してください。
再発行したら[3. 証明書を設定した後に、Squid側のキャッシュを消していない](https://qiita.com/drafts/f595d564498bbccb46d5/edit#3-%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%9F%E5%BE%8C%E3%81%ABsquid%E5%81%B4%E3%81%AE%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E6%B6%88%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84)の手順も必ず実行してください。

また、配置した証明書にCAの証明書が記載されているかも併せて確認してください。
[証明書の配置](https://qiita.com/drafts/f595d564498bbccb46d5/edit#%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%81%AE%E9%85%8D%E7%BD%AE)


#### 2.CAの証明書をPEMに追加していない
かならず、発行したProxyの証明書の下に、CAの証明書を追記してください。

#### 3. 証明書を設定した後に、Squid側のキャッシュを消していない
これが一番はまるのですが、設定をミスして再度設定をした場合であっても事前に作った証明書が使いまわされるため、証明書を上記の対応で変更しても同一のサイトでは反映されません。

以下を実行し、アクセスした証明書キャッシュを一度消すと新しい証明書が作成されるため確認しやすいです。
```:bash
rm -rf /usr/local/squid/var/spool
mkdir -p /usr/local/squid/var/spool

#キャッシュDB作成
/usr/local/squid/libexec/security_file_certgen -c -s /usr/local/squid/var/spool/ssl_db -M 4MB
chown -R daemon:daemon /usr/local/squid
```

:::note alert
証明書を再発行したり入れ替えたら、必ず「[3. 証明書を設定した後に、Squid側のキャッシュを消していない](https://qiita.com/drafts/f595d564498bbccb46d5/edit#3-%E8%A8%BC%E6%98%8E%E6%9B%B8%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%9F%E5%BE%8C%E3%81%ABsquid%E5%81%B4%E3%81%AE%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%82%92%E6%B6%88%E3%81%97%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84)」の手順を実行してください。
そうしないと、古い証明書情報のキャッシュがそのまま利用され、新しい証明書の情報が反映されません。
:::