Squidでプロキシサーバ AlamaLinux9

Squidでプロキシサーバを運用するのが最も一般的である。AlmaLinux9にSquidをインストールして、基本設定を行ってみた。中小企業であれば、Squidの導入で簡単かつシンプルに全員のネットのアクセスを一元管理できる。

https://www.squid-cache.org

# 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/Ubuntusudo apt update && sudo apt install squid
CentOS/RHELsudo 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_porthttp_port 3128Squidがクライアントからの接続をリッスンするポートを指定します。デフォルトは3128です。http_port 3128 interceptとすると透過型プロキシになります。
visible_hostnamevisible_hostname my-proxy-serverエラーメッセージなどに表示されるプロキシのホスト名を設定します。
cache_dircache_dir ufs /var/spool/squid 10000 16 256キャッシュの保存場所、タイプ (ufsなど)、サイズ (MB)、第1・第2階層のディレクトリ数を指定します。

2. アクセス制御(最も重要)

SquidはACLと**http_accessルールを上から順に**評価し、最初の一致で処理を決定します。

a. ACLの定義

ACLはアクセスを制御するための条件を定義します。

ACLタイプ記述例説明
srcacl local_lan src 192.168.1.0/24クライアントIPアドレス (LAN全体を許可)
srcacl my_pc src 113.43.22.214/32特定のクライアントIPアドレス
portacl SSL_ports port 443 10000接続先ポート番号 (Webminや特定のサービスを許可するために重要)
dstdomainacl bad_sites dstdomain "/etc/squid/blocked_sites.acl"接続先ドメイン (ファイルリストも指定可能)
url_regexacl mp3 url_regex \.mp3$URLパターン (ファイル拡張子などでフィルタリング)

b. アクセス許可/拒否 (http_access)

定義したACLを使用して、アクセスを許可または拒否します。

ディレクティブ記述例説明
http_access allowhttp_access allow local_lanlocal_lanで定義されたクライアントからのアクセスを許可します。
http_access denyhttp_access deny bad_sitesbad_sitesで定義されたドメインへのアクセスを拒否します。
http_access deny CONNECT !SSL_portsHTTPS接続 (CONNECTメソッド) が、SSL_ports以外のポート宛の場合、拒否します。セキュリティ確保のため非常に重要です。
最終ルールhttp_access deny all最後に必ず配置し、他のどのルールにも一致しなかったアクセスをすべて拒否します。

3. キャッシュ制御

キャッシュの動作を制御することで、パフォーマンスを最適化します。

ディレクティブ記述例説明
refresh_pattern`refresh_pattern -i .(jpe?gpng
maximum_object_sizemaximum_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_HITTCP_MISSTCP_DENIEDなど) が記録されます。
    • tail -f /var/log/squid/access.log でリアルタイム監視が基本です。
  • キャッシュログ: /var/log/squid/cache.log
    • Squidの起動、設定エラー、内部的な警告などが記録されます。設定変更後のエラー確認に重要です

3. キャッシュ管理とメンテナンス

  • ログローテーション: ログファイルが肥大化するのを防ぐため、logrotateの設定を確認し、定期的にログをローテーションします。
  • キャッシュの削除: キャッシュディレクトリが満杯になったり、強制的にクリアしたい場合は、Squidを停止した上でキャッシュディレクトリ内のファイルを削除します。Bashsudo 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.confhttp_accessルールとACL定義(特にSSL_ports)を上から順に見直す必要があります。
ERR_CONNECT_FAIL接続先サーバーへの接続に失敗した。Squidサーバーから接続先サーバーへのファイアウォールネットワークの問題を確認します。