LinuxへのSquid Proxy Serverのインストールと設定:Webキャッシュ、コンテンツフィルタリング、社内ネットワークアクセス制御

Network tutorial - IT technology blog
Network tutorial - IT technology blog

深夜2時、オフィス全体の帯域が消えた

あの夜のことははっきり覚えている。アラートが届いた:オフィスの回線帯域が20分間にわたって95%張り付き、ERPシステムはほぼ使い物にならない状態に。ルーターにSSHしてトラフィックログを確認すると、大量のWindowsマシンが一斉にMicrosoftサーバーからアップデートを引っ張っていた。初めてのことではなかったが、今回は日本チームの夜勤シフトに直撃した。

その場しのぎとしてIPごとに帯域制限をかけたが、翌日にはSquid Proxyを構築することを決意した——とっくにやるべきだったのに先延ばしにしていたものだ。それ以来、数百台分のWindows Update、apt upgrade、yum updateはすべてキャッシュ経由になり、帯域使用量は30〜40%にまで落ちた。

Squid Proxyとは何か、どんな問題を解決するのか

基本的に、Squidは社内ネットワークのマシンとインターネットの間に立つ。マシンAがファイルをリクエストすると、Squidがそれを取得してキャッシュに保存する。次にマシンBが同じファイルをリクエストすると、Squidはキャッシュから直接返す——外部回線には一切触れない。

Squidが特に優れているのは次の3点だ:

  • Webキャッシュ:インターネット回線の負荷を軽減し、社内ユーザーのページ表示速度を向上させる。
  • コンテンツフィルタリング:不適切なドメイン、URLパターン、MIMEタイプをブロックする。
  • アクセス制御:特定のIPアドレスまたはサブネットのみがプロキシ経由でインターネットにアクセスできるよう制限する。

SquidはVPNではなく、トラフィックの暗号化も行わない。セキュリティが必要な場合はSSL Bumpと組み合わせるか、別途専用ツールを使用する。

Ubuntu/DebianおよびCentOS/RHELへのSquidインストール

Ubuntu / Debian

sudo apt update
sudo apt install squid -y
sudo systemctl enable squid
sudo systemctl start squid

CentOS / RHEL / Rocky Linux

sudo dnf install squid -y
sudo systemctl enable squid
sudo systemctl start squid

インストール後、Squidがポート3128でリッスンしているか確認する:

sudo ss -tlnp | grep squid
# Output: LISTEN  0  128  0.0.0.0:3128  0.0.0.0:*  users:(("squid",...))

基本設定:squid.conf

すべての設定は/etc/squid/squid.confに集約されている。デフォルトのファイルは長くてコメントだらけなので、バックアップを取ってからシンプルな新しいファイルを作成する方が管理しやすい。

sudo cp /etc/squid/squid.conf /etc/squid/squid.conf.bak
sudo nano /etc/squid/squid.conf

192.168.1.0/24の社内ネットワーク向け最小設定:

# 社内ネットワーク用ACLの定義
acl localnet src 192.168.1.0/24
acl SSL_ports port 443
acl Safe_ports port 80
acl Safe_ports port 443
acl Safe_ports port 21
acl Safe_ports port 8080
acl CONNECT method CONNECT

# localnetを許可、それ以外をすべて拒否
http_access allow localnet
http_access allow localhost
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
http_access deny all

# リッスンポート
http_port 3128

# キャッシュ設定
cache_mem 256 MB
maximum_object_size_in_memory 512 KB
maximum_object_size 100 MB
cache_dir ufs /var/spool/squid 4096 16 256

# ログ
access_log /var/log/squid/access.log squid
cache_log /var/log/squid/cache.log

キャッシュ設定の簡単な説明:

  • cache_mem 256 MB:小さなキャッシュオブジェクト(頻繁にアクセスされるもの)に割り当てるRAM容量。
  • maximum_object_size 100 MB:100MBを超えるファイルはキャッシュしない(ディスクの圧迫を防ぐため)。
  • cache_dir ufs /var/spool/squid 4096 16 256:ディスク上に4GBのキャッシュ、第1レベルのディレクトリ16個、第2レベルのディレクトリ256個。

キャッシュディレクトリを初期化して再起動:

sudo squid -z
sudo systemctl restart squid

コンテンツフィルタリングとドメインブロック

ドメインブラックリストによるブロック

ブロックするドメインのリストファイルを作成する:

sudo nano /etc/squid/blacklist.txt
.facebook.com
.tiktok.com
.youtube.com
.netflix.com

squid.confに追加する:

acl blacklist dstdomain "/etc/squid/blacklist.txt"
http_access deny blacklist

重要な注意事項:http_access deny blacklistの行は必ずhttp_access allow localnetの行より前に配置すること。SquidはACLを上から順に処理し、最初にマッチしたルールが適用される。

URLパターン(正規表現)によるブロック

acl bad_urls urlpath_regex -i \.torrent$ \.exe$ \?download=
http_access deny bad_urls

業務時間帯によるアクセス制限

acl workhours time MTWHF 08:00-18:00
acl social_media dstdomain .facebook.com .instagram.com

# 業務時間中はSNSをブロック、時間外は許可
http_access deny social_media workhours
http_access allow social_media

IPアドレスとサブネットによるアクセス制御

特定のマシン(例:ITチーム)にフィルターのバイパスを許可する:

acl it_team src 192.168.1.10 192.168.1.11 192.168.1.12
http_access allow it_team

# ブラックリストはそれ以外のグループにのみ適用
http_access deny blacklist !it_team

または、特定のサブネットのみプロキシ経由のアクセスを許可する:

acl allowed_subnet src 192.168.1.0/24 10.0.0.0/8
http_access allow allowed_subnet
http_access deny all

クライアント側のプロキシ設定

Linux(環境変数を使用)

export http_proxy="http://192.168.1.1:3128"
export https_proxy="http://192.168.1.1:3128"
export no_proxy="localhost,127.0.0.1,192.168.1.0/24"

システム全体に適用するには/etc/environmentに追加する。

透過プロキシ(クライアント設定不要)

これが私が最もよく使う方法だ——クライアントはプロキシの存在を知る必要がない。iptablesによってHTTPトラフィックが自動的にSquidにリダイレクトされる:

# Squidサーバー(ゲートウェイ兼用)上で実行
sudo iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128

squid.confでは、ポートを次のように変更する:

http_port 3128 intercept

ログの確認とデバッグ

リアルタイムで誰が何にアクセスしているか確認するには、アクセスログをtailする:

sudo tail -f /var/log/squid/access.log

ログのフォーマット:timestamp | duration | client_ip | result_code/http_code | bytes | method | url | user | peer_info | content_type

# 拒否されたドメインを抽出する
sudo grep " DENIED " /var/log/squid/access.log | awk '{print $7}' | sort | uniq -c | sort -rn | head 20

# 帯域を最も多く消費しているクライアントを確認する
sudo awk '{print $3, $5}' /var/log/squid/access.log | sort | awk -F' ' '{sum[$1]+=$2} END {for (i in sum) print i, sum[i]}' | sort -k2 -rn | head 10

ピーク時間帯だけ発生するintermittent packet lossをデバッグした時のことを今でも覚えている——午前中いっぱい費やしても原因がわからなかった。最終的にSquidのアクセスログが直接原因を指し示した:オフィス全員がログインする8〜9時に、一部のマシンがバックグラウンド同期を実行していたのだ。tcpdumpで生のトラフィックを眺めるよりはるかに明快だった。

リロード前に設定の妥当性を確認する:

sudo squid -k parse
sudo systemctl reload squid

まとめ

Squidは派手なツールではない。しかし、数十台から数百台が回線を共有する環境では、静かに、そして確実に機能する。初期セットアップは30〜60分で済み、翌日には帯域削減の効果がすぐに実感できる。

さらに深く学びたい場合:SSL BumpはHTTPSトラフィックもキャッシュ可能にし、SquidGuardは既存のカテゴリを使ったコンテンツフィルタリングを提供する——手動でブラックリストを管理する手間が省ける。

Share: