ネットワークと IPC
外部からは見えなかった localhost のサービス、Unix ドメインソケット、内部ネットワークを探す。見つけた待ち受けの調べ方はlocalhost サービスとUnix socket とファイルディスクリプタにまとめた。
確認コマンド
Section titled “確認コマンド”追加確認例:
ss -lntupss -antss -lxnpip addrip routelsof -ilsof -U- 目的: localhost の待ち受け、Unix ドメインソケット、内部ネットワーク、接続元の制限を探す。
- 前提条件:
ss,ip,lsofがない最小コンテナでは/proc/net/tcpを直接読む。 - 何を確認しているか:
127.0.0.1:<port>、0.0.0.0:<port>、*:3000、Unix ドメインソケットの所有者・グループ・アクセス権、接続元の制限。 - 期待される出力:
127.0.0.1:1337の root 権限のサービス、127.0.0.1:7777の管理 UI、/run/<app>/mgmt.sock。 - 出力の解釈: localhost での待ち受けは、外部から直接接続できない設定を示す。同一ホストの別ユーザーや、SSH トンネルを通じて接続できる場合がある。
- 失敗した場合の切り分け: IPv4 と IPv6、コンテナのネットワーク名前空間、ファイアウォール、認証、HTTP 以外のプロトコルを分ける。
- 代替コマンド:
cat /proc/net/tcp,cat /proc/net/tcp6,nc -vz 127.0.0.1 <port>,curl -v --max-time 3。 - 状態変更:
ssとipは読み取り専用。ncやcurlは対象サービスのログに接続記録を残す場合がある。未知のプロトコルへ入力を連打しない。
/proc/net/tcp の読み方
Section titled “/proc/net/tcp の読み方”cat /proc/net/tcpst が 0A の行は LISTEN を示す。アドレスとポートは 16 進数で、IPv4 アドレスのバイト順はリトルエンディアンになる。ss がないコンテナでは Python や awk で変換する。UID はソケット作成時の実効 UID を示す(proc_pid_net(5))。実行中のプロセスを特定するには、inode を /proc/<PID>/fd と照合する。
待ち受けの分類
Section titled “待ち受けの分類”| 見え方 | 読み方 | 次 |
|---|---|---|
| localhost の root プロセスが HTTP の管理操作を提供する | 実行ユーザーと認証を確認する | localhost サービス |
印刷ポートと /run/<app>/*.sock がある | root 権限のデーモンとソケットの所有者を対応付ける | Unix socket |
| localhost が HTTP を返さない | 専用プロトコルのクライアントを探す。curl の失敗だけで到達不能とは判断しない | localhost サービス |
| コンテナ内だけで見える HTTP | ファイル読み取りの入口になり得る。待ち受けプロセスの実行ユーザーを確認する | localhost サービス |
| root 権限の組み込み HTTP サーバ | 起動引数から公開ディレクトリを確認する | プロセスと systemd |
内部ネットワークの通信を tcpdump で取得した場合は、実行ユーザーと、ネットワーク名前空間をホストと共有していたかを記録する。通信を取得できたことだけで、ホストの root 権限を得たとは判断しない。
外部スキャンで filtered だったポートも、侵入後にこの分類へ戻して再確認する。起点は外部公開サービス。

