
LinuxのTCPポートが到達可能かどうかの理由を説明する
PortClue は Linux マシン上の TCP ポートが到達可能か、あるいは到達不可能か、その理由を説明します。
ソケット、プロセス、ファイアウォール、Docker の状態を短い証拠チェーンに変換し、
ss、/proc、nftables、iptables、docker inspect を手作業で突き合わせる必要をなくします。

ポートを指定せずに実行すると、注目すべきローカル TCP エンドポイントを発見できます:
$ sudo portclue
LOCAL TCP LISTENERS
PORT SERVICE CONFIDENCE BIND OWNER SOURCE BIND SCOPE
22 OpenSSH server HIGH 0.0.0.0,:: ssh.service host ALL_INTERFACES
8080 NGINX web server HIGH 0.0.0.0,:: nginx host ALL_INTERFACES
8443 api service MEDIUM 192.0.2.10 demo-api docker SPECIFIC_INTERFACE
9000 Python HTTP server MEDIUM 127.0.0.1 python3 host LOOPBACK_ONLY
BIND SCOPE describes socket binding, not firewall reachability.
Run `portclue PORT` for the complete evidence chain and local exposure verdict.
ALL_INTERFACES、SPECIFIC_INTERFACE、LOOPBACK_ONLY は、ソケットがどこでトラフィックを受け入れるかを表します。
これらはファイアウォールがそれを許可していると主張するものでは意図的にありません。
完全なローカルファイアウォール分析を行うには、ポートを検査します:
$ sudo portclue 8080
POTENTIAL EXTERNAL EXPOSURE
TCP port 8080
0.0.0.0:8080/tcp [POTENTIAL]
Service NGINX web server
Category web
Confidence HIGH
Identity evidence executable basename matched "nginx"
-> LISTEN NETLINK_INET_DIAG reports socket inode 123456 bound to 0.0.0.0:8080/tcp
-> OWNED PID 4242 (nginx), systemd unit nginx.service
-> ALL_INTERFACES 0.0.0.0 accepts traffic addressed to any local interface
-> ACCEPT nftables: a direct rule matches TCP destination port 8080 and returns accept
Unknown outside this machine:
- router port forwarding
- cloud firewall or security group
- upstream NAT, including carrier-grade NAT
[!IMPORTANT] PortClue v0.1 は初期段階の保守的な Linux プロトタイプです。
POTENTIALは 観測されたローカルパスがトラフィックを許可していることを意味し、そのポートが パブリックインターネットから到達可能であると主張するものではありません。サポートされていない ファイアウォール式はUNKNOWNを生成します。
ss の出力をスクレイピングするのではなく、NETLINK_INET_DIAG を通じた TCP リスナー/proc を通じたプロセスの所有権、実行ファイル、コマンドライン、cgroup、ネットワーク名前空間systemctl show を通じたアクティブなソケットトリガーnft --json list ruleset を通じた nftablesiptables-save を通じた iptablesPortClue は露出を説明する前に、ポートが何に属しているかを識別します。証拠は 次の順序でランク付けされます:
/etc/services ポート規約。実際の所有者は常に慣例的なポート名を上書きします。ポート規約のみが
判明している場合、識別情報は明示的に LOW 信頼度とマークされます。組み込みカタログは
internal/identify/catalog.json に保存され、単一のバイナリ内に同梱されます。
PortClue は実行時に識別データをダウンロードしません。
PortClue は読み取り専用です。クエリ対象のポートに接続したり、別のホストをスキャンしたり、 ファイアウォールルールを変更したり、プロセスやコンテナを停止したり、データをアップロードしたり、 デーモンを実行したりしません。
Linux(amd64 および arm64)で動作します。スクリプトは一致する GitHub
Release アーカイブをダウンロードし、SHA256SUMS を検証して、単一のバイナリをインストールします。
シェル設定は変更しません。
ユーザーインストール(デフォルト、root 不要)。 あなたが所有する ~/.local/bin にインストールします:
curl -fsSL https://raw.githubusercontent.com/pbxqdown/portclue/v0.1.2/scripts/install.sh | sh
portclue
ユーザーインストールは root なしで実行され、あなたのアカウントで利用可能な証拠を報告し、
不足しているものを指摘します。これはリスナーと Docker マッピングを調べるのに十分です。
sudo は ~/.local/bin を検索せず、このバイナリはあなたのユーザーが書き込み可能であるため、
このコピーを sudo で実行しないでください。
システムインストール(root 所有、sudo portclue 用)。 PortClue は root として
最も完全な証拠(制限された /proc、完全なファイアウォール状態)を読み取ります。そのためには、
root 所有のバイナリを /usr/local/bin にインストールします(スクリプトは最終インストールステップにのみ
sudo を使用し、ダウンロードや展開には使用しません):
curl -fsSL https://raw.githubusercontent.com/pbxqdown/portclue/v0.1.2/scripts/install.sh | sh -s -- --system
sudo portclue
オプションの上書き: PORTCLUE_VERSION=0.1.2(先頭の v なし)と、
どちらのモードでも PORTCLUE_INSTALL_DIR。
アンインストール:
# user install
rm ~/.local/bin/portclue
# system install
sudo rm /usr/local/bin/portclue
# or, matching how you installed:
curl -fsSL https://raw.githubusercontent.com/pbxqdown/portclue/v0.1.2/scripts/install.sh | sh -s -- --uninstall
curl -fsSL https://raw.githubusercontent.com/pbxqdown/portclue/v0.1.2/scripts/install.sh | sh -s -- --system --uninstall
GitHub Releases から一致する
portclue-VERSION-linux-ARCH.tar.gz と SHA256SUMS をダウンロードし、チェックサムを検証してから
インストールします:
sha256sum -c SHA256SUMS --ignore-missing
tar -xzf portclue-0.1.2-linux-amd64.tar.gz # or linux-arm64
sudo install -m 0755 portclue-0.1.2-linux-amd64/portclue /usr/local/bin/portclue
portclue --version
アーキテクチャのマッピング:
uname -m | Archive |
|---|---|
x86_64 | linux-amd64 |
aarch64, arm64 | linux-arm64 |
各アーカイブにはバイナリ、README、Apache-2.0 ライセンス、サードパーティ通知が含まれます。
Linux と Go 1.25+ が必要です:
go install github.com/pbxqdown/portclue/cmd/[email protected]
これによりバイナリが $(go env GOPATH)/bin に配置されます。再現可能なインストール成果物が必要な場合は、
チェックサム検証済みのリリースアーカイブまたはインストールスクリプトを優先してください。
要件: Linux と Go 1.25 以降。
go build -o portclue ./cmd/portclue
./portclue
./portclue --json
./portclue 8080
./portclue --json 8080
概要モードはオプションのフィルターを受け付けます(無視されたフィールドは制約なしのままです):
./portclue --bind-scope ALL_INTERFACES,SPECIFIC_INTERFACE
./portclue --source docker
./portclue --min-confidence MEDIUM
./portclue --json --bind-scope ALL_INTERFACES --min-confidence HIGH
--bind-scope は ALL_INTERFACES、SPECIFIC_INTERFACE、LOOPBACK_ONLY の
カンマ区切りリストを受け付けます。--source は host および/または
docker を受け付けます。--min-confidence は HIGH、MEDIUM、LOW、
または UNKNOWN 以上のエントリを保持します。これらのフラグは PORT が省略された場合にのみ適用されます。
root なしで実行しても、有用なリスナー、Docker マッピング、バインドアドレスの
証拠が得られます。/proc やファイアウォール状態が制限されている場合、プロセス識別情報と
ファイアウォール証拠が不完全になることがあります。PortClue はこれを Incomplete evidence の下に報告します。
最も完全な結果を得るには sudo を使用してください:
sudo ./portclue
sudo ./portclue --bind-scope ALL_INTERFACES,SPECIFIC_INTERFACE
sudo ./portclue 8080
JSON 形式はスクリプトとエージェントを対象としています。概要 JSON は
schema_version: 2、mode: "overview"、および service_identity と bind_scope を持つ
entries を使用します。詳細レポートは
schema_version: 1、query、verdict、service_identity、unknowns、warnings を持つ
paths を使用します。
スキーマバージョン内では、既存のフィールド名と意味は安定しているものとして扱われます。
新しいオプションのフィールドが追加されることがあります。削除、名前変更、または互換性のない意味の変更には
新しい schema_version が必要です。両方の契約には回帰テストがあります。
| Verdict | Meaning |
|---|---|
POTENTIAL | 非ループバックのローカルパスが観測され、サポートされているファイアウォール証拠がそれを許可しています。外部ルーティングは不明です。 |
--bind-scope、--source、--min-confidence含まれないもの: UDP、Podman、Kubernetes、クラウドセキュリティグループ、ルーター検出、 リモートスキャン、eBPF、継続的監視、または修復。
PortClue は Netfilter 仮想マシン全体を実装しようと意図的に試みません。
最初のバージョンは少数の直接ルールを理解します。複数のベース
チェーン、ジャンプ、セット、マップ、fib、動的式、またはその他の認識されないロジックは、
クエリに影響を与える可能性がある場合に UNKNOWN を引き起こします。これは、解析されていないルールを
暗黙に accept または drop として扱うよりも安全です。
スコープ、テスト、ファイアウォール UNKNOWN 結果の報告方法については
CONTRIBUTING.md を参照してください。
make check
make release VERSION=0.1.2
make release はクリーンな Git ワークツリーを必要とし、バージョン付きの amd64/arm64
アーカイブと dist/SHA256SUMS を作成します。設定された
GitHub リモートに v* タグをプッシュすると、同じチェックが実行され、GitHub リリースが作成されます。
Makefile によってタグは作成されません。
長期的な設計では、アナライザー、因果モデル、レンダラーをプラットフォーム中立に保ちます。 Linux が最初の証拠バックエンドです; Linux プロトタイプが実際の使用に値するなら、 Windows がおそらく 2 番目のバックエンドになります。
PortClue は Apache License 2.0 の下でライセンスされています。LICENSE を参照してください。 バイナリアーカイブには THIRD_PARTY_NOTICES も含まれます。
リリース履歴と JSON 互換性の注意については CHANGELOG.md、 サポートされているバージョンと非公開の脆弱性報告については SECURITY.md、 貢献については CONTRIBUTING.md を参照してください。
NOT_EXPOSED_LOCALLY | リスナー/マッピングが存在しない、バインドがループバックのみ、またはサポートされているローカルファイアウォール証拠がパスをブロックしています。 |
UNKNOWN | 必要な事実が利用できない、または潜在的に重要なファイアウォール式がサポートされていません。 |
CONFIRMED | 将来の明示的な外部プローブ用に予約されています。現在のローカルのみの CLI はこれを決して出力しません。 |