1. 何が起きたか
ある日、VPS業者から以下のようなメールが届きました。
「外部の特定IPアドレスへ攻撃的なトラフィックが発生していることを検知したため、インスタンスを停止しました」
突然の 強制停止。
Webサーバーとしてしか使っていないはずなのに、、
結論から言うと:
-
サーバー内部のログからは 該当IPへの通信証拠は一切見つからなかった
-
Linuxの仕様上、外向き通信は事前に設定していないと事後調査ができない
-
VPS業者は ホスト側の通信フロー監視 を見ているため、OSログとは視点が違う
ということが分かりました。
2. VPS業者からの連絡内容
- 指摘された内容
- 外部IPアドレスへの攻撃的トラフィック
- 特定IP(海外ISP配下)
- VPSは 自動的に停止
※ 具体的なIPアドレスは伏せますが、海外の家庭回線ISPでした。
3. サーバー構成
- OS: AlmaLinux
- 用途: Webサーバー
- ミドルウェア:
- Nginx
- Node.js(Next.js)
- SMTP / メールサーバー: 未導入
- cron: 不審な設定なし
いわゆる よくある個人開発のWebサーバー構成 です。
4. まず疑ったこと
真っ先に疑ったのは以下です。
- 不正侵入されて踏み台にされた?
- マルウェアやマイニング?
- アプリが無限ループで外部通信?
5. 実際に行った調査
Webアクセスログ
grep "問題のIP" /var/log/nginx/access.log*
→ 該当なし
SSH / 管理ログ
grep "問題のIP" /var/log/secure
→ 該当なし
cron
crontab -l
ls -l /etc/cron.*
→ 不審な設定なし
アプリログ(Node.js / Next.js)
journalctl --since "該当時刻" | grep -Ei "fetch|axios|http|https"
→ 外部通信の痕跡なし
ログ横断検索
grep -R "問題のIP" /var/log
→ 完全にヒットなし
6. なぜ「送ったかどうか分からない」のか
ここで重要な事実に気づきました。
Linuxのデフォルト挙動
- 受信(INPUT) → ログに残る
- 送信(OUTPUT) → ログに残らない
つまり:
事前にログ設定をしていない外向き通信は、事後調査が不可能
これはバグでも不具合でもなく、仕様です。
7. VPS業者が検知した正体
VPS業者は以下を見ています。
- ホストOS側の 通信フロー監視(NetFlow / IDS)
- 一定時間内の通信量・頻度・宛先
つまり:
- 中身は見ていない
- 「大量」「特定IP」「短時間」などの 挙動ベース検知
Webサーバーから海外家庭回線IPへの通信が発生すると、
内容に関係なく「攻撃的」と判定されるケースがあります。
8. 再発防止としてやったこと
外向き通信の可視化
iptables -I OUTPUT -d xxx.xxx.xxx.xxx -j LOG \
--log-prefix "OUTBOUND_CHECK: "
リアルタイム監視(検証用)
tcpdump -i any host xxx.xxx.xxx.xxx
方針
- 外向き通信は 必要最小限のみ許可
- 不要なIPv6は無効化
- 事後調査できない状態を作らない
9. 学び・教訓
学んだこと
- 「ログが無い」=「何も起きていない」とは限らない
- Linuxでは 外向き通信は意識して設計しないと見えない
- VPS業者の視点とOS管理者の視点は違う
同じ構成の人へ
Webサーバーでも外向き通信は必ず制御・可視化しよう
おわりに
個人開発でも、
「外向き通信を設計する」ことが本番運用では必須 だと痛感しました。
同じように突然サーバーを止められる人が一人でも減れば幸いです。