SquidでProxyサーバを構築

この記事は[ラクスパートナーズAdvent Calendar 2024](https://qiita.com/advent-calendar/2024/rakus-partners) 15日目の記事です。

現場でsquidを使用してproxyサーバを構築する機会がありましたので、その時に行った設定などを書かせていただきます。

# はじめに
### squid とは
インターネットなどのIPネットワークにおけるクライアントとサーバの通信を中継するプロキシサーバソフトウェアの一つ。
リバースプロキシやキャッシュサーバとしても利用できる。

### プロキシとは
プロキシとは、インターネットとローカルネットワークの間に位置し、クライアントの要求を代理で処理するサーバーのことです。
主な役割には、セキュリティの向上、アクセス制御、そしてネットワークパフォーマンスの最適化があります。
企業環境では、プロキシサーバーを通じてインターネットアクセスを管理し、セキュリティポリシーを適用することが一般的です。

# 環境

- Red Hat Enterprise Linux 9
- Squid 5.5

# インストール
```
# yum install squid
```
バージョン確認
```
# squid -v
Squid Cache: Version 5.5
...
```
## squidの設定ファイルの編集
今回はホワイトリスト方式のURLフィルタリングを実現するので以下のように設定しました。
```/etc/squid/squid.conf
# IPアドレスの定義
acl all src all
acl localhost src 127.0.0.1/32
acl localnet src 192.168.1.0/24
 
# 接続先ポートによる拒否
acl Safe_ports port 80          # http
acl Safe_ports port 21          # ftp
acl Safe_ports port 443         # https
acl Safe_ports port 70          # gopher
acl Safe_ports port 210         # wais
acl Safe_ports port 1025-65535  # unregistered ports
acl Safe_ports port 280         # http-mgmt
acl Safe_ports port 488         # gss-http
acl Safe_ports port 591         # filemaker
acl Safe_ports port 777         # multiling http
http_access deny !Safe_ports
 
# SSL接続時に443ポート以外のCONNECTを拒否
acl SSL_ports port 443
acl CONNECT method CONNECT
http_access deny CONNECT !SSL_ports
 
# キャッシュまわりの設定
acl manager proto cache_object
http_access allow manager localhost
http_access deny manager

# 自身からのアクセスはすべて許可する
http_access allow localhost
 
# 自分のネットワーク以外を拒否
http_access deny !localnet

# ホワイトリストの設定
acl whitelist dstdomain "/etc/squid/whitelist"
http_access allow whitelist
 
# ここまで一致しなかった場合は拒否
http_access deny all
 
 
# Squidが使用するポート
http_port 3128
 
# キャッシュディレクトリとキャッシュメモリサイズを指定
cache_dir ufs /var/spool/squid 200 16 256
cache_mem 128 MB
 
# キャッシュを使用しないURLの対象
hierarchy_stoplist cgi-bin ?
 
# コアダンプファイル？を配置するディレクトリ
coredump_dir /var/spool/squid
 
# キャッシュのヒット率の調整
refresh_pattern ^ftp:           1440    20%     10080
refresh_pattern ^gopher:        1440    0%      1440
refresh_pattern -i (/cgi-bin/|\?) 0     0%      0
refresh_pattern .               0       20%     4320
 
# クライアントおよびプロキシ情報を隠蔽する
forwarded_for off
header_access Referer deny all
header_access X-Forwarded-For deny all
header_access Via deny all
 
# ホスト名を匿名にする
visible_hostname unknown
```
## ホワイトリスト
ホワイトリストの設定はドメインの形式です。
.(ドット)から始まるものはサブドメインも含めます。

```:/etc/squid/whitelist
.yahoo.co.jp
.google.com
.amazonaws.com
```
正規表現のURL単位での許可もできます。
```
^http://qiita.com/
```
## 動作確認

```
# squid -k parse

以下いずれかで再読み込み
# systemctl restart squid
# systemctl reload squid
```

指定したURLでアクセスできるか、それ以外でアクセスできるかを確認します。
あと、指定したIP以外からアクセスが拒否されるかを確認すればいいかと思います。

## あとで行う設定
proxyサーバを使用するサーバが複数あり、サーバごとのホワイトリストを設定したい場合は以下のように設定する。
```/etc/squid/squid.conf
# IPアドレスの定義
...
# サーバ1のIPアドレス
acl localnet src 192.168.1.0/24
# サーバ2のIPアドレス
acl localnet2 src 192.168.2.0/24
...
# 自分のネットワーク以外を拒否
http_access deny !localnet !localnet2

# ホワイトリストの設定
acl whitelist dstdomain "/etc/squid/whitelist"
acl whitelist2 dstdomain "/etc/squid/whitelist2"
# サーバ1のホワイトリスト設定
http_access allow localnet whitelist
# サーバ2のホワイトリスト設定
http_access allow localnet2 whitelist2
...
```

# 参考
[Squidを用いたホワイトリスト方式のURLフィルタリング](https://qiita.com/aiai_osaru/items/95feefe4787600b2f478)
[Squidでホワイトリストプロキシを作成する](https://qiita.com/tosier/items/30297afb6ffbd4567eb5)
[squid を使ってみた](https://blog.ingage.jp/entry/2020/11/09/080000)