【Squid講座 第6回】ログは嘘をつかない!アクセスログ解析と可視化ツール「SARG」導入完全ガイド

「ネットが遅い」…犯人は誰だ?

こんにちは!「LINUX工房」管理人の「リナックス先生」です。
前回は、キャッシュ機能をチューニングして、Squidを爆速化させる方法を学びました。

しかし、いくらサーバーをチューニングしても、一人の社員が業務中に巨大な動画ファイルをダウンロードし続けていたら、回線全体が詰まってしまいます。
そんな時、あなたは管理者として「今、誰が帯域を使っているのか?」を即座に特定できますか?

コウ君

先生、それが難しいんです…。
access.log を見てみたんですけど、数字の羅列ばかりでサッパリ読めなくて。
「1705482345.123」っていつですか? 未来ですか?
もっとパッと見て「田中さんがYouTube見てる!」って分かるようにしたいです。

リナックス先生

Squidのデフォルトログは、機械が読むための形式だから人間には辛いわね。
今回は、このログを「人間が読める形式」に整形する方法と、コマンド一発で帯域ドロボウを見つけ出す監視テクニック、そして上司に提出できる綺麗なレポートを作るツール「SARG」の導入まで、徹底的にやるわよ!

本記事では、Squidのログフォーマットのカスタマイズから、Linuxコマンド駆使したリアルタイム解析、そして専用ツールによる可視化まで、ログ活用のすべてを網羅します。

🦑 Squid完全攻略講座(バックナンバー)


第1章:デフォルトログの解読と限界

まずは敵を知りましょう。
/var/log/squid/access.log のデフォルトの中身はこんな感じです。

1705482345.123    150 192.168.1.5 TCP_MISS/200 15432 GET http://www.yahoo.co.jp/ - HIER_DIRECT/182.22.59.229 text/html

各フィールドの意味

意味 解説
1705482345.123 タイムスタンプ 1970年1月1日からの経過秒数(UNIX時間)。人間には読めない。
150 応答時間 (ms) 処理にかかったミリ秒。
192.168.1.5 クライアントIP 誰がアクセスしたか。
TCP_MISS/200 キャッシュ状態/ステータス MISS=キャッシュになかった(取りに行った)。
HIT=キャッシュから返した(速い)。
DENIED=拒否した。
15432 サイズ (Bytes) 転送したデータ量。
GET メソッド GET, POST, CONNECTなど。
URL アクセス先 SSLバンピングなしの場合、HTTPSはドメインのみ。

最大の問題は「日時が直感的に分からない」ことです。
トラブル対応時、「今のログ」なのか「1時間前のログ」なのか瞬時に判断できないのは致命的です。


第2章:【必須設定】ログを見やすくカスタマイズする

Squidにはログ形式を自由に定義する機能があります。
一般的に見やすい形式(日付入り)に変更しましょう。

1. squid.confの編集

sudo nano /etc/squid/squid.conf を開き、以下の設定を追加します。

# 独自のログフォーマット "my_format" を定義
# 日時を見やすく、ユーザー名(ui)やUser-Agentも記録する
logformat my_format %tl %6tr %>a %Ss/%03>Hs %h"

# 定義したフォーマットを適用
access_log daemon:/var/log/squid/access.log my_format

2. 設定の反映

sudo systemctl reload squid

これで、ログが以下のように変わります。

17/Jan/2026:10:30:45 +0900    150 192.168.1.5 TCP_MISS/200 15432 GET http://www.yahoo.co.jp/ - HIER_DIRECT/... "Mozilla/5.0..."

「17/Jan/2026…」 と、日付がパッと見て分かるようになりました!
さらに、末尾にUser-Agent(ブラウザ情報)も出るので、PCなのかスマホなのかも判別可能です。


第3章:コマンドでリアルタイム監視(黒い画面の魔術)

GUIツールを入れる前に、現場のエンジニアが使う「コマンドでの速攻解析術」を伝授します。
サーバーに入って3秒で状況を把握できます。

1. リアルタイムで流し見する (tail)

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

ログが流れる様子を眺めます。
「DENIED」(拒否)が大量に出ていないか、特定のIPばかり流れていないかを確認します。

2. 「拒否」された通信だけ抽出する (grep)

「繋がらない!」という問い合わせがあった時、拒否ログだけを見ます。

sudo grep "DENIED" /var/log/squid/access.log | tail -n 20

3. 【奥義】アクセス数ランキングを表示 (awk)

「今、誰が一番アクセスしているか?」をIPアドレスごとに集計してランキング表示するワンライナーです。
(※カスタマイズ後のログフォーマットを前提としています。列番号 $3 はIPアドレスの位置に合わせて調整してください)

sudo cat /var/log/squid/access.log | awk '{print $3}' | sort | uniq -c | sort -nr | head -10

実行結果例:

   5432 192.168.1.50  ← 犯人はこのIP!
   1200 192.168.1.12
    800 192.168.1.5

これで、帯域を使いすぎている犯人を瞬時に特定できます。


第4章:ログローテーションの設定(ディスク溢れ防止)

アクセスログは放っておくと無限に増え続け、ディスクを埋め尽くしてサーバーを停止させます。
Linux標準の logrotate 機能を使って、定期的に圧縮・削除しましょう。

AlmaLinuxなどでSquidをパッケージインストールした場合、自動的に /etc/logrotate.d/squid が作られていますが、設定を確認・調整します。

# 設定ファイルを確認
cat /etc/logrotate.d/squid

推奨設定例:

/var/log/squid/*.log {
    daily           # 毎日ローテーション
    rotate 90       # 90日分(約3ヶ月)保存
    compress        # 圧縮して容量節約
    delaycompress   # 圧縮を1日遅らせる(書き込みエラー防止)
    missingok       # ログがなくてもエラーにしない
    nocreate        # Squid自身がログを作るので新規作成しない
    sharedscripts
    postrotate
        # ローテーション後にSquidにログを掴み直させる
        /usr/sbin/squid -k rotate 2>/dev/null || true
    endscript
}

これで、access.log.1.gz のように圧縮され、古いものは自動的に消えていきます。


第5章:【実践】可視化ツール「SARG」の導入

コマンドでの解析はエンジニアには便利ですが、上司に「この黒い画面を見てください」とは言えません。
そこで、ログを解析して綺麗なHTMLレポート(グラフ付き)を生成してくれるツール「SARG (Squid Analysis Report Generator)」を導入します。

ステップ1:SARGのインストール

AlmaLinux 9の場合、標準リポジトリにはないため、EPELリポジトリを利用するか、公式サイトからソースを入れます。
ここでは手軽なRPMパッケージを探すか、ビルド手順を紹介します。
(※環境によって異なるため、今回は汎用的なビルド手順を紹介します)

必要なコンパイラ等のインストール:

sudo dnf install gcc make wget gd-devel -y

ダウンロードとインストール:

# ソースのダウンロード(最新版を確認してください)
wget https://sourceforge.net/projects/sarg/files/sarg/sarg-2.4.0/sarg-2.4.0.tar.gz

# 解凍とコンパイル
tar zxvf sarg-2.4.0.tar.gz
cd sarg-2.4.0
./configure
make
sudo make install

ステップ2:設定ファイルの編集

設定ファイルは /usr/local/etc/sarg.conf にあります。

sudo nano /usr/local/etc/sarg.conf

主な変更点:

# アクセスログの場所
access_log /var/log/squid/access.log

# レポートの出力先(Webサーバーの公開ディレクトリなど)
output_dir /var/www/html/squid-reports

# 日付の形式 (e=dd/mm/yy)
date_format e

# 日本語対応(文字化け対策)
charset UTF-8

ステップ3:レポートの生成

Webサーバー(Apache/Nginx)がインストールされている前提です。
以下のコマンド一発でレポートが生成されます。

sudo sarg -x

ブラウザで http://(サーバーIP)/squid-reports/ にアクセスしてみてください。
「ユーザー別」「サイト別」「時間帯別」のアクセス統計が、綺麗な表とグラフで表示されているはずです!

ステップ4:自動生成(cron)の設定

毎日深夜にレポートを自動生成するようにします。

sudo crontab -e

追記内容:

# 毎日午前1時にSARGを実行
00 01 * * * /usr/local/bin/sarg -x

第6章:ログから分かる「危険な兆候」

ログは見ているだけでは意味がありません。
以下のようなパターンを見つけたら、すぐに調査が必要です。

1. 深夜の大量アクセス

誰もいないはずの深夜2時に、特定のPCから大量の通信が発生している。
ウイルス感染や、不正なデータの持ち出し(バックドア)の可能性があります。

2. CONNECTメソッドの異常な多発

HTTPS(443ポート)以外のポート(22番や3389番)へのCONNECTメソッドが記録されている。
→ プロキシを踏み台にして、外部サーバーへSSHやRDP接続を試みている攻撃(トンネリング)かもしれません。
Squidの設定で、安全なポート(443, 563など)以外へのCONNECTを禁止するのが鉄則です。

3. 未知のドメインへの定期的な通信

ランダムな文字列のドメインへ、定期的(5分おきなど)にアクセスしている。
→ C&Cサーバー(攻撃指令サーバー)へのビーコン通信(ボットネット)の疑いがあります。


まとめ:ログは「サーバーの健康診断書」

お疲れ様でした!
今回は、Squid運用の中で最も発見が多い「ログ解析」をマスターしました。

今回の重要ポイント:

  • デフォルトログは読みにくい。logformat で人間用に整形する。
  • tail -fgrep でリアルタイムに障害や拒否ログを監視する。
  • logrotate 設定は必須。ディスク溢れを防ぐ。
  • SARGを使えば、上司も納得する綺麗なレポートが自動で作れる。

これで、「誰が」「いつ」「何を」していたか、全て把握できるようになりました。
しかし、把握するだけでは不十分です。「見てはいけないサイト」へのアクセス自体をブロックしたいですよね?

次回、第7回は「鉄壁の守り!フィルタリング(ブラックリスト/ホワイトリスト)」です。
「アダルトサイト禁止」「業務外サイト禁止」といったフィルタリングルールを、テキストファイルを使って効率的に管理する方法を伝授します。
お楽しみに!

▼ エンジニアとしてのキャリアを加速させる ▼

ログ解析基盤を構築
「VPS」で自分専用環境

おすすめVPSを見る

サーバー知識を年収に
「ITエンジニア転職」

転職エージェントを見る

コメント