
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 や lsof ではないのかss が使用するのと同じカーネル
インターフェースである NETLINK_INET_DIAG から取得し、プロセスの詳細は
/proc から取得します。他のツールの出力を解析することはないため、ss も
lsof もないコンテナでもリスナーとその所有者を取得できます。ファイアウォール
分析では nft または iptables-save を実行し、それらがない場合は UNKNOWN を
報告します。ss -ltnp はソケットと PID を提供します。
そのバインドがループバック専用かどうか、ファイアウォールルールがそれを許可して
いるかどうか、そのポートがホストリスナーではなく Docker の公開ポートかどうかは、
本来手作業で行う必要がある作業です。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.27+ が必要です:
go install github.com/pbxqdown/portclue/cmd/[email protected]
これによりバイナリが $(go env GOPATH)/bin に配置されます。再現可能なインストール
成果物が必要な場合は、チェックサム検証済みのリリースアーカイブまたはインストール
スクリプトを優先してください。
要件: Linux と Go 1.27 以降。
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 が必要です。
両方の契約には回帰テストがあります。