Squidでプロキシサーバ AlamaLinux9
Squidでプロキシサーバを運用するのが最も一般的である。AlmaLinux9にSquidをインストールして、基本設定を行ってみた。中小企業であれば、Squidの導入で簡単かつシンプルに全員のネットのアクセスを一元管理できる。
# cat /etc/redhat-release
AlmaLinux release 9.6 (Sage Margay)
# rpm -q squid
squid-5.5-19.el9_6.1.x86_64
Squidのインストール
dnf -y install squid -y
Squidの設定
vi /etc/squid/squid.conf
#14行目に
acl my_localnet src 許可するネットワーク/ネットマスク
#http_access allow localnet
#http_access allow localhost
http_access allow my_localnet
acl SSL_ports port 443 # の下あたり
acl SSL_ports port 10000 # webmin
#最終行に追加
request_header_access Referer deny all
request_header_access X-Forwarded-For deny all
request_header_access Via deny all
request_header_access Cache-Control deny all
forwarded_for off
sudo systemctl stop squid
sudo squid -z
sudo systemctl start squid
sudo systemctl enable squid
キャッシュディレクトリの初期化をして起動
sargのインストール
squidのWeb版解析ツールだが、rpmが用意されていないし今回はやめておく
sudo dnf install epel-release -y
sudo dnf install sarg -y
Last metadata expiration check: 0:27:55 ago on Sun Oct 19 21:49:44 2025.
No match for argument: sarg
Error: Unable to find a match: sarg
2022年以降リリースされていないようなので、今回はインストールしない。
Squidの構築、設定、運用について、詳細かつ体系的にまとめます。Squidは、主にキャッシング機能とアクセス制御機能を提供する強力なWebプロキシサーバーです。プロキシサーバー導入のメリットは、主にセキュリティ強化、ネットワーク効率の向上(高速化)、および通信の一元管理の3つの側面に大別されます。
🛡️ 1. セキュリティの強化
プロキシサーバーは、内部ネットワークと外部ネットワークの間に立つ「門番」として機能し、セキュリティを大幅に向上させます。
匿名性の確保
- IPアドレスの隠蔽: クライアントPCが直接インターネットにアクセスする代わりに、プロキシサーバーが代理でアクセスします。これにより、アクセス先のWebサイトにはクライアントの固有のIPアドレスが伝わらず、プロキシサーバーのIPアドレスのみが通知されます。
- サイバー攻撃のリスク低減: 内部ネットワークの構成情報や個々の端末が特定されるリスクが減り、外部からの不正アクセスやサイバー攻撃の対象になりにくくなります。
フィルタリングと防御の一元化
- Webフィルタリング: 業務に関係のないサイト(SNS、動画サイトなど)や、フィッシング・マルウェア感染の危険性がある不正なWebサイトへのアクセスを事前に制限できます。
- アンチウイルスチェック: 外部から受信したデータ(ダウンロードファイルなど)をプロキシサーバー上で一元的にチェックし、マルウェアやウイルスの侵入を防ぐことができます。
- 不正な通信のブロック: 外部への送信データについても監視し、機密情報が外部に漏洩するような不正な通信をブロックできます。
🚀 2. ネットワーク効率の向上 (キャッシング)
プロキシサーバーはキャッシュ機能を持つことが多く、ネットワークの負荷軽減と通信の高速化に貢献します。
キャッシュによる高速化
- データの一時保存: 一度アクセスしたWebサイトのデータ(画像やスクリプトなど)をプロキシサーバーのキャッシュ領域に一時的に保存します。
- 表示速度の向上: 同じデータに別のユーザーが再度アクセスした場合、オリジンサーバー(接続先のWebサイト)ではなく、プロキシサーバーに保存されたキャッシュデータが使われます。これにより、再接続時の表示が格段に速くなり、ユーザー体験が向上します。
- ネットワーク負荷の軽減: 外部ネットワークへの通信量が減るため、インターネット回線全体の負荷が軽減され、ネットワーク資源を効率的に利用できます。
📊 3. 通信の一元管理と制御
すべての通信を一箇所で中継することで、管理の効率化とコンプライアンスの遵守に役立ちます。
アクセスログの取得
- 履歴の可視化: 内部から外部へのすべてのアクセス履歴(いつ、誰が、どのサイトにアクセスしたか)がプロキシサーバーのログに一元的に記録されます。
- 監査・調査: 従業員の業務外利用の監視や、万が一の情報漏洩・不正アクセスの際のアクセス経路の調査・原因究明に役立ちます。
帯域制御・負荷分散
- 帯域の管理: 特定のユーザーや特定の種類の通信(例:動画ストリーミング)の帯域幅を制限し、業務に必要な通信を優先させることができます。
- ロードバランシング (リバースプロキシ): 外部からの大量のアクセスを複数のWebサーバーに適切に振り分ける負荷分散の役割を担い、サーバーダウンを防ぎ、安定稼働に貢献します。
地域制限の回避 (Reverse Proxy)
- 地理的制限の解消: 特定の国や地域からのアクセスを制限しているWebサービスに対して、その国に設置されたプロキシを経由することでアクセス制限を回避できる場合があります。
🏗️ 構築 (インストールと初期準備)
Squidをインストールし、基本的なファイル構造を準備します。
1. インストール
各OSのパッケージ管理システムを使用してインストールします。
OS | コマンド例 |
Debian/Ubuntu | sudo apt update && sudo apt install squid |
CentOS/RHEL | sudo yum install squid または sudo dnf install squid |
2. 初期設定ファイルの確認
メインの設定ファイルは以下の場所にあります。
- 設定ファイル:
/etc/squid/squid.conf
- ログファイル:
/var/log/squid/access.log
および/var/log/squid/cache.log
3. キャッシュディレクトリの初期化
Squidのキャッシュ機能を使用する場合、初回起動時またはcache_dir
設定を変更した後に、キャッシュディレクトリの初期化が必要になることがあります。
Bash
# キャッシュディレクトリの作成とパーミッション設定
sudo chown -R squid:squid /var/spool/squid
# Squidの起動時オプションで初期化
sudo squid -z
*多くのモダンな環境では、パッケージインストール時やサービス起動時に自動で実行されます。
⚙️ 設定(squid.conf
の編集)
Squidの設定の核心は、アクセス制御リスト (ACL)とhttp_access
ディレクティブの組み合わせ、およびポートとキャッシュの設定です。
1. 基本設定(ポートとホスト名)
ディレクティブ | 記述例 | 説明 |
http_port | http_port 3128 | Squidがクライアントからの接続をリッスンするポートを指定します。デフォルトは3128です。http_port 3128 intercept とすると透過型プロキシになります。 |
visible_hostname | visible_hostname my-proxy-server | エラーメッセージなどに表示されるプロキシのホスト名を設定します。 |
cache_dir | cache_dir ufs /var/spool/squid 10000 16 256 | キャッシュの保存場所、タイプ (ufsなど)、サイズ (MB)、第1・第2階層のディレクトリ数を指定します。 |
2. アクセス制御(最も重要)
SquidはACLと**http_access
ルールを上から順に**評価し、最初の一致で処理を決定します。
a. ACLの定義
ACLはアクセスを制御するための条件を定義します。
ACLタイプ | 記述例 | 説明 |
src | acl local_lan src 192.168.1.0/24 | クライアントIPアドレス (LAN全体を許可) |
src | acl my_pc src 113.43.22.214/32 | 特定のクライアントIPアドレス |
port | acl SSL_ports port 443 10000 | 接続先ポート番号 (Webminや特定のサービスを許可するために重要) |
dstdomain | acl bad_sites dstdomain "/etc/squid/blocked_sites.acl" | 接続先ドメイン (ファイルリストも指定可能) |
url_regex | acl mp3 url_regex \.mp3$ | URLパターン (ファイル拡張子などでフィルタリング) |
b. アクセス許可/拒否 (http_access
)
定義したACLを使用して、アクセスを許可または拒否します。
ディレクティブ | 記述例 | 説明 |
http_access allow | http_access allow local_lan | local_lan で定義されたクライアントからのアクセスを許可します。 |
http_access deny | http_access deny bad_sites | bad_sites で定義されたドメインへのアクセスを拒否します。 |
http_access deny CONNECT !SSL_ports | HTTPS接続 (CONNECT メソッド) が、SSL_ports 以外のポート宛の場合、拒否します。セキュリティ確保のため非常に重要です。 | |
最終ルール | http_access deny all | 最後に必ず配置し、他のどのルールにも一致しなかったアクセスをすべて拒否します。 |
3. キャッシュ制御
キャッシュの動作を制御することで、パフォーマンスを最適化します。
ディレクティブ | 記述例 | 説明 |
refresh_pattern | `refresh_pattern -i .(jpe?g | png |
maximum_object_size | maximum_object_size 4096 KB | キャッシュするオブジェクトの最大サイズを制限します。 |
🛠️ 運用
Squidの安定稼働とトラブルシューティングのための運用タスクです。
1. サービスの制御
設定ファイルを変更した後などは、サービスを再起動またはリロードします。
アクション | コマンド例 | 説明 |
起動 | sudo systemctl start squid | サービスを開始します。 |
再起動 | sudo systemctl restart squid | サービスを再起動します。 |
設定のリロード | sudo systemctl reload squid | サービスを停止せず、設定ファイル (squid.conf ) を再読み込みします。最も安全な方法です。 |
ステータス確認 | sudo systemctl status squid | サービスの稼働状況を確認します。 |
2. ログの監視と分析
ログファイルはアクセスの分析やトラブルシューティングに不可欠です。
- アクセスログ:
/var/log/squid/access.log
- クライアント、リクエスト内容、応答コード (
TCP_HIT
、TCP_MISS
、TCP_DENIED
など) が記録されます。 tail -f /var/log/squid/access.log
でリアルタイム監視が基本です。
- クライアント、リクエスト内容、応答コード (
- キャッシュログ:
/var/log/squid/cache.log
- Squidの起動、設定エラー、内部的な警告などが記録されます。設定変更後のエラー確認に重要です。
3. キャッシュ管理とメンテナンス
- ログローテーション: ログファイルが肥大化するのを防ぐため、
logrotate
の設定を確認し、定期的にログをローテーションします。 - キャッシュの削除: キャッシュディレクトリが満杯になったり、強制的にクリアしたい場合は、Squidを停止した上でキャッシュディレクトリ内のファイルを削除します。Bash
sudo systemctl stop squid sudo rm -rf /var/spool/squid/* # 削除前にバックアップを推奨 sudo squid -z # キャッシュディレクトリを再初期化 sudo systemctl start squid
4. トラブルシューティング(主なコード)
ログコード | 意味 | 対処法 |
TCP_HIT | キャッシュにヒットし、オリジンサーバーにアクセスせずに応答した。 | 正常。キャッシングが機能しています。 |
TCP_MISS | キャッシュにヒットせず、オリジンサーバーから取得した。 | 正常。キャッシング設定(refresh_pattern )を見直す余地があるかもしれません。 |
TCP_DENIED/403 | アクセスがACLによって拒否された。 | squid.conf のhttp_access ルールとACL定義(特にSSL_ports )を上から順に見直す必要があります。 |
ERR_CONNECT_FAIL | 接続先サーバーへの接続に失敗した。 | Squidサーバーから接続先サーバーへのファイアウォールやネットワークの問題を確認します。 |