ネットワークトラフィックを受動的に解析するパッシブOSフィンガープリンティングツール
- p0f -
p0fは、パケットを一切送信せずにOSやミドルウェア情報を推定できるパッシブフィンガープリンティングツールです。
本記事では、p0fのインストール方法からコマンドの使い方、各種オプションの活用法まで徹底解説!リアルタイム解析やpcap解析など、現場で役立つ具体的な活用方法が満載です。
p0fとは
p0fは、ネットワーク上を流れるパケットを受動的に観測し、OSやミドルウェア情報の推定を行うパッシブフィンガープリンティングツールです。対象ホストに対してパケットを送信する必要はなく、トラフィックが流れているネットワーク上に配置することが前提となります。Michal Zalewski氏によって開発され、現在はバージョン3系が広く利用されています。
- パッシブOSフィンガープリンティング
- 通信パケットを観測するだけで、対象ホストのOSを推定(スキャン不要)
- TCPのSYN、SYN/ACKパケットを解析
- TTL、ウィンドウサイズ、TCPオプションなどから識別
- リアルタイム解析が可能
- ネットワークトラフィックを即座に分析し、結果を出力
- 軽量・高速
- リソース消費が少なく、常時監視用途に向いている
パッシブ(受動的)という点がp0fの最大の特徴です。p0fは自らパケットを送信せず、ネットワークインターフェースを流れるパケットをキャプチャし、TCPヘッダのフィールドやHTTPヘッダの特徴からOSやミドルウェア情報を推定します。
アクティブスキャンとの違い
p0fを理解する上で、Nmapに代表されるアクティブスキャンとの違いを整理することが重要です。両者は「対象のOS・サービスを把握する」という目的は共通していますが、アプローチが根本的に異なります。
| 比較項目 | p0f(パッシブ) | Nmap(アクティブ) |
|---|---|---|
| パケット送信 | しない | する |
| 対象ホストへの痕跡 | 残らない | ログに記録される |
| リアルタイム性 | 通信が発生するまで待機が必要 | 任意のタイミングで情報収集が可能 |
| 検出される可能性 | 低い | IDS/IPS に検知されやすい |
| 取得できる情報の範囲 | 主にOS | OS・開放ポート・サービスバージョンなど |
| ネットワーク負荷 | ほぼゼロ | スキャン強度による |
| 利用シーン | ネットワーク監視・トラフィック分析 | 脆弱性診断、ペネトレーションテスト |
Nmapはプローブパケットを対象ホストへ送信し、その応答を解析します。そのため、対象ホストのアクセスログやIDSのアラートに記録が残ります。

一方、p0fは既存のトラフィックを観測するだけなので、対象ホストに一切のパケットを送らず、ログにも痕跡が残りません。
ご利用に際しての留意点
通信が行われていないホストは検出できません
実際に通信が発生しなければ情報を収集できないため、通信が行われるまで待機する必要があります。また、取得できる情報はNmapと比較して限定的であり、開放ポートの一覧取得などはできません。
倫理および社内規定に関する注意事項
p0fは受動的なツールであるため安全に見えますが、ネットワークトラフィックの監視は極めてセンシティブな行為です。技術的に「見ているだけ」であっても、社内の情報セキュリティポリシーを確認した上でご使用下さい。
p0fのインストール
主要なLinuxディストリビューションでは、パッケージとして提供されています。この記事では、Debian系のディストリビューションであるKali LinuxとUbuntu、およびWindowsへのインストール手順を解説します。
Kali Linux 2026.1の場合
APTパッケージマネージャを使用してインストールします。
# パッケージリストの更新
$ sudo apt update
# パッケージ情報の確認
$ apt show p0f
Package: p0f
Version: 3.09b-4
Priority: optional
Section: net
Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Installed-Size: 223 kB
Depends: libc6 (>= 2.34), libpcap0.8t64 (>= 0.9.8)
Homepage: https://lcamtuf.coredump.cx/p0f3/
Tag: interface::commandline, network::scanner, role::program, scope::utility
Download-Size: 80.0 kB
APT-Sources: http://http.kali.org/kali kali-rolling/main amd64 Packages
Description: Passive OS fingerprinting tool
p0f performs passive OS detection based on SYN packets. Unlike nmap
and queso, p0f does recognition without sending any data.
Additionally, it is able to determine the distance to the remote
host, and can be used to determine the structure of a foreign or
local network. When running on the gateway of a network it is able
to gather huge amounts of data and provide useful statistics. On a
user-end computer it could be used as powerful IDS add-on. p0f
supports full tcpdump-style filtering expressions, and has an
extensible and detailed fingerprinting database.
# p0fのインストール
$ sudo apt install p0fインストール後のバイナリは、/usr/sbin/p0fに配置されます。
$ which p0f
/usr/sbin/p0fUbuntu 24.04 LTSの場合
Kali Linuxと同様、Ubuntuでも公式リポジトリからインストール可能です。
# パッケージリストの更新
$ sudo apt update
# パッケージ情報の確認
$ apt show p0f
Package: p0f
Version: 3.09b-3build2
Priority: extra
Section: universe/net
Origin: Ubuntu
Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com>
Original-Maintainer: Debian Security Tools <team+pkg-security@tracker.debian.org>
Bugs: https://bugs.launchpad.net/ubuntu/+filebug
Installed-Size: 221 kB
Depends: libc6 (>= 2.38), libpcap0.8t64 (>= 0.9.8)
Homepage: http://lcamtuf.coredump.cx/p0f3/
Download-Size: 79.9 kB
APT-Sources: http://jp.archive.ubuntu.com/ubuntu noble/universe amd64 Packages
Description: Passive OS fingerprinting tool
p0f performs passive OS detection based on SYN packets. Unlike nmap
and queso, p0f does recognition without sending any data.
Additionally, it is able to determine the distance to the remote
host, and can be used to determine the structure of a foreign or
local network. When running on the gateway of a network it is able
to gather huge amounts of data and provide useful statistics. On a
user-end computer it could be used as powerful IDS add-on. p0f
supports full tcpdump-style filtering expressions, and has an
extensible and detailed fingerprinting database.
# p0fのインストール
$ sudo apt install p0fWindowsの場合
p0fはもともとUnix系OS向けに開発されており、Windows環境ではネイティブ動作をサポートしていません。Windowsで利用するには、以下のいずれかの方法で実行環境を構築する必要があります。
- VirtualBoxなどの仮想環境を利用する(推奨)
- WSL(Windows Subsystem for Linux)を利用する
- Cygwinを利用してソースコードからビルドする(非推奨)
p0fはLinux環境での利用が前提となるツールです。特にセキュリティ診断やトラフィック分析を目的とする場合は、Kali LinuxまたはUbuntuをベースとした環境構築が最も効率的です。
以下の記事では、Windows上のVirtualBoxにKali Linuxをインストールする手順を解説しています。ぜひご覧ください。

p0fの使い方
基本構文
$ sudo p0f [オプション] [フィルタルール]p0fの実行にはsudo(root権限)が必要です。
リアルタイム解析
$ sudo p0f -i eth0-i:監視対象のネットワークインターフェースを指定
上記コマンドの場合、ネットワークインターフェースeth0上を流れるパケットを解析し、フィンガープリンティングの結果がリアルタイム出力されます。
pcapデータをオフライン解析
$ sudo p0f -r sample.pcap-r:pcapファイルを指定
tcpdumpなどで取得したキャプチャデータ(.pcapファイル)を解析することも可能です。これは、後から通信ログを解析したい場合に有効です。
アドレスやポートでフィルタリング
BPF(Berkeley Packet Filter)形式のフィルタ式をオプションの末尾に付与することで、解析対象のトラフィックを絞り込めます。
# 例)宛先ポート22(SSH)への通信だけを対象にする
$ sudo p0f -i eth0 'dst port 22'
# 例)送信元が192.0.2.11以外の通信を対象にする
$ sudo p0f -i eth0 'not src host 192.0.2.11'
# 例)送信元ネットワークが192.0.2.0/24かつ宛先ポートが22(ssh)
$ sudo p0f -i eth0 'src net 192.0.2.0/24 and dst port 22'BPFフィルタを活用することで、大量トラフィックが流れる本番環境でも診断対象を効率的に絞り込み、ログのノイズを大幅に削減できます。
オプション一覧
p0fにはいくつかの便利なオプションが用意されており、用途に応じて使い分けることで、より効率的なパッシブ分析が可能になります。
カテゴリ別オプション一覧
ネットワークインターフェースオプション
| -i iface | キャプチャ対象のネットワークインターフェースを指定(例:eth0、wlan0) |
|---|---|
| -r file | pcapファイルを読み込んで解析する |
| -p | プロミスキャスモードを有効にする(デフォルト:無効) |
| -L | 利用可能なネットワークインターフェースを一覧表示 |
動作モードと出力設定
| -f file | シグネチャファイルを指定(デフォルト:/etc/p0f/p0f.fp) |
|---|---|
| -o file | 解析結果をファイル出力 |
| -s name | UNIXソケットを指定(外部連携用) |
| -u user | 起動後に指定ユーザーへ権限を降格する |
| -d | デーモンモード(バックグラウンド実行) ※-oまたは-sオプションが必須 |
パフォーマンス関連オプション
| -S limit | 並列API接続数(デフォルト:20) ※-sオプションが必須 |
|---|---|
| -t c,h | キャッシュの有効期限(接続情報、ホスト情報) ※デフォルト:接続 30秒、ホスト 120分 |
| -m c,h | 同時に保持できる接続数 / ホスト数の上限 ※デフォルト:接続 1000、ホスト 10000 |
オプションの使用例
ここでは、特に利用頻度の高い3つのオプションについて解説します。
有効なインターフェースを一覧表示
$ p0f -L
# 出力例
0: Name : eth0
Description : -
IP address : 192.0.2.11
1: Name : eth1
Description : -
IP address : 10.0.3.15
2: Name : any
Description : Pseudo-device that captures on all interfaces
IP address : (none)p0fが利用可能なネットワークインターフェースを確認するには、-Lオプションを使用します。(このコマンドは、root権限なしで実行できます。)
プロミスキャスモード
$ sudo p0f -i eth0 -p-p:プロミスキャスモードの有効化
通常、NICは自身のMACアドレス宛のパケットのみを受信します。しかし、プロミスキャスモード(Promiscuous Mode)を有効にすると、同一ネットワークセグメント上を流れるすべてのパケットをキャプチャできるようになります。
本記事の検証環境のようにVirtualBoxなどの仮想環境を使用する場合、仮想マシンのネットワークアダプターも設定変更する必要があります。
初期設定では「プロミスキャスモード:拒否」になっているので、「許可」に変更する

ファイル出力
$ sudo p0f -i eth0 -o output.log-o output.log:分析結果をファイル出力
解析結果をファイルに保存する場合、-oオプションを使用します。
当サイトの検証環境で取得したログ(一部抜粋)
[2026/04/22 18:20:11] mod=syn|cli=192.168.10.102/46220|srv=192.168.10.11/22|subj=cli|os=Linux 2.2.x-3.x|dist=0|params=generic tos:0x04|raw_sig=4:64+0:0:1460:mss*44,10:mss,sok,ts,nop,ws:df,id+:0
[2026/04/22 18:20:11] mod=mtu|cli=192.168.10.102/46220|srv=192.168.10.11/22|subj=cli|link=Ethernet or modem|raw_mtu=1500このようにタイムスタンプ・IPアドレス・推定OS情報などがテキスト形式で記録されるため、後から grep や awk といったコマンドを用いて分析が可能です。
【検証デモ】OS推定の精度を比較
本セクションでは、Windowsホスト上のVirtualBoxに構築した仮想ネットワークを用いて、パッシブおよびアクティブ方式のOS推定精度を検証します。
- パッシブ方式 : p0f 3.09b
- アクティブ方式 : Nmap 7.99
デモ環境のシステム構成
本デモでは、以下の検証環境を使用します。
| 項目 | OS | IPアドレス |
|---|---|---|
| 仮想マシン 1 | Kali Linux 2026.1 | 192.168.10.11 |
| 仮想マシン 2 | Ubuntu 24.04 LTS | 192.168.10.102 |
VirtualBoxのネットワークアダプターは、ホストオンリーアダプター(Host-Only Ethernet Adapter)を使用します。ホストオンリーアダプターを使用することで、意図しない外部通信が発生せず、検証環境として安全に利用できます。
パッシブ方式(p0f)によるOS推定
Kali Linux上でp0fを起動し、UbuntuからKali Linuxへのトラフィックをパッシブに観測することで、p0fのOSフィンガープリンティング機能を確認します。
ネットワークインターフェース名を確認
まず、Kali Linuxで利用可能なネットワークインターフェースを確認します。
Kali Linuxで実行
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:79:3a:0a brd ff:ff:ff:ff:ff:ff
inet 192.168.10.11/24 brd 192.168.10.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::a00:27ff:fe79:3a0a/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 08:00:27:e8:48:7e brd ff:ff:ff:ff:ff:ff
inet 10.0.3.15/24 brd 10.0.3.255 scope global dynamic noprefixroute eth1
valid_lft 63772sec preferred_lft 52972sec
inet6 fd17:625c:f037:3:273e:d7be:5d2a:c348/64 scope global dynamic mngtmpaddr noprefixroute
valid_lft 85971sec preferred_lft 13971sec
inet6 fe80::fc79:c432:a841:bc46/64 scope link
valid_lft forever preferred_lft foreverp0fコマンドでも確認可能です。
Kali Linuxで実行
$ p0f -L
--- p0f 3.09b by Michal Zalewski <lcamtuf@coredump.cx> ---
-- Available interfaces --
0: Name : eth0
Description : -
IP address : 192.168.10.11
1: Name : eth1
Description : -
IP address : 10.0.3.15
2: Name : any
Description : Pseudo-device that captures on all interfaces
IP address : (none)
3: Name : lo
Description : -
IP address : 127.0.0.1
4: Name : bluetooth-monitor
Description : Bluetooth Linux Monitor
IP address : (none)
5: Name : nflog
Description : Linux netfilter log (NFLOG) interface
IP address : (none)
6: Name : nfqueue
Description : Linux netfilter queue (NFQUEUE) interface
IP address : (none)
7: Name : dbus-system
Description : D-Bus system bus
IP address : (none)
8: Name : dbus-session
Description : D-Bus session bus
IP address : (none)本デモ環境では、eth0がホストオンリーアダプターに対応するインターフェース名であることが確認できました。次のステップでは、このインターフェースを指定してp0fを起動します。
p0fの起動
以下のコマンドでp0fを起動し、eth0のパッシブ監視を開始します。
Kali Linuxで実行
$ sudo p0f -i eth0p0fはeth0上を流れるパケットを受動的に監視し、パケットを受信したタイミングでフィンガープリンティングを開始します。
UbuntuからKali LinuxにSSH接続
p0fはパッシブツールのため、自ら通信を発生させません。そのため、別のマシンから通信を行う必要があります。ここでは、Ubuntu側からKali LinuxへSSH接続を試みます。
Ubuntuで実行
$ ssh username@192.168.10.11この操作により、TCPセッション(SYNパケット)が生成され、p0fが解析対象とするトラフィックが発生します。
p0fの出力内容を確認
UbuntuからのトラフィックがKali Linuxに届くとフィンガープリンティングが開始され、OS情報などが自動的に表示されます。
.-[ 192.168.10.102/58524 -> 192.168.10.11/22 (syn) ]-
|
| client = 192.168.10.102/58524
| os = Linux 2.2.x-3.x
| dist = 0
| params = generic tos:0x04
| raw_sig = 4:64+0:0:1460:mss*44,10:mss,sok,ts,nop,ws:df,id+:0
|
`----
.-[ 192.168.10.102/58524 -> 192.168.10.11/22 (mtu) ]-
|
| client = 192.168.10.102/58524
| link = Ethernet or modem
| raw_mtu = 1500
|
`----この結果から、p0fはLinux 2.2.x-3.xと推定しました。
アクティブ方式(Nmap)によるOS推定
アクティブスキャンツールであるNmapを使用して、対象ホストのOSを推定します。Nmapは対象ホストに対してプローブパケットを送信し、その応答を分析することでOSを推定します。この点がp0fのパッシブ方式と根本的に異なります。
ポートスキャンを実行
Kali Linuxで実行
$ nmap -O 192.168.10.102-Oは、OS検出を有効にするオプションです。
スキャン結果の確認
Nmapの実行結果
Starting Nmap 7.99 ( https://nmap.org ) at 2026-04-22 21:08 +0900
Nmap scan report for 192.168.10.102
Host is up (0.00062s latency).
Not shown: 998 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
MAC Address: 08:00:27:FD:A6:22 (Oracle VirtualBox virtual NIC)
Device type: general purpose
Running: Linux 4.X|5.X
OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5
OS details: Linux 4.15 - 5.19
Network Distance: 1 hop
OS detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 2.46 secondsNmapはOS details: Linux 4.15 - 5.19と推定しました。
p0fとNmapの実行結果を検証
対象ホストのカーネルバージョン
まず、対象ホスト(Ubuntu)のカーネルバージョンを確認します。
Ubuntuで実行
$ uname -r
6.17.0-22-generic実行結果の比較
対象ホストのカーネルバージョンは6.17.0-22-genericであり、両ツールの推定結果と比較すると以下のようになります。
| ツール(方式) | 推定結果 | 実際との差異 |
|---|---|---|
| p0f(パッシブ) | Linux 2.2.x-3.x | 大きく乖離 |
| nmap(アクティブ) | Linux 4.15 - 5.19 | 比較的近い |
まとめ
今回の検証では、p0f・Nmapのいずれも正確なバージョンを特定できませんでしたが、Nmapの方がp0fよりも実際のバージョンに近い推定結果を示しました。このデモを通じて、OSフィンガープリンティングはあくまで推定技術であり、その精度はシグネチャデータベースの更新状況やスキャン方式に依存するという重要な特性を理解できます。
