
Erklären Sie, warum ein Linux-TCP-Port erreichbar sein kann oder nicht
PortClue erklärt, warum ein TCP-Port auf einer Linux-Maschine erreichbar sein könnte oder nicht.
Es verwandelt Socket-, Prozess-, Firewall- und Docker-Zustand in eine kurze Beweiskette, anstatt
dass Sie ss, /proc, nftables, iptables und docker inspect manuell korrelieren müssen.

Führen Sie es ohne Port aus, um zu ermitteln, welche lokalen TCP-Endpunkte Aufmerksamkeit verdienen:
$ 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 und LOOPBACK_ONLY beschreiben, wo ein
Socket Datenverkehr annimmt. Sie behaupten bewusst nicht, dass eine Firewall ihn zulässt.
Untersuchen Sie einen Port für die vollständige lokale Firewall-Analyse:
$ 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 ist ein früher, konservativer Linux-Prototyp.
POTENTIALbedeutet, dass der beobachtete lokale Pfad Datenverkehr zulässt; es behauptet nicht, dass ein Port aus dem öffentlichen Internet erreichbar ist. Nicht unterstützte Firewall-Ausdrücke erzeugenUNKNOWN.
NETLINK_INET_DIAG, nicht durch Auslesen der ss-Ausgabe/procsystemctl shownft --json list rulesetiptables-save, wenn nftables nicht verfügbar istPortClue identifiziert, zu was ein Port gehört, bevor es die Exposition erklärt. Beweise werden in dieser Reihenfolge gewichtet:
/etc/services.Ein tatsächlicher Eigentümer überschreibt immer einen konventionellen Portnamen. Wenn nur die Port-Konvention
bekannt ist, wird die Identität explizit mit LOW-Konfidenz markiert. Der eingebettete Katalog ist
in internal/identify/catalog.json gespeichert und wird
innerhalb der einzelnen Binärdatei ausgeliefert; PortClue lädt Identitätsdaten nicht zur Laufzeit herunter.
PortClue ist schreibgeschützt. Es verbindet sich nicht mit dem abgefragten Port, scannt keinen anderen Host, ändert keine Firewall-Regeln, stoppt keine Prozesse oder Container, lädt keine Daten hoch und führt keinen Daemon aus.
Läuft unter Linux (amd64 und arm64). Das Skript lädt das passende GitHub
Release-Archiv herunter, verifiziert SHA256SUMS und installiert eine einzelne Binärdatei. Es
ändert nicht die Shell-Konfiguration.
Benutzerinstallation (Standard, kein Root). Installiert nach ~/.local/bin, im Besitz des Benutzers:
curl -fsSL https://raw.githubusercontent.com/pbxqdown/portclue/v0.1.2/scripts/install.sh | sh
portclue
Eine Benutzerinstallation läuft ohne Root und meldet die für Ihr Konto verfügbaren
Beweise und vermerkt, was fehlt. Dies reicht aus, um Listener und Docker-
Zuordnungen zu erkunden. Da sudo nicht in ~/.local/bin sucht und diese Binärdatei
von Ihrem Benutzer beschreibbar ist, führen Sie diese Kopie nicht mit sudo aus.
Systeminstallation (Root-eigentümerschaft, für sudo portclue). PortClue liest die vollständigsten
Beweise (eingeschränktes /proc, vollständiger Firewall-Zustand) als Root. Dafür
installieren Sie eine Root-eigene Binärdatei nach /usr/local/bin (das Skript verwendet sudo nur
für den letzten Installationsschritt, nicht zum Herunterladen oder Entpacken):
curl -fsSL https://raw.githubusercontent.com/pbxqdown/portclue/v0.1.2/scripts/install.sh | sh -s -- --system
sudo portclue
Optionale Überschreibungen: PORTCLUE_VERSION=0.1.2 (ohne führendes v) und
PORTCLUE_INSTALL_DIR für beide Modi.
Deinstallation:
# 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
Laden Sie das passende portclue-VERSION-linux-ARCH.tar.gz und SHA256SUMS von
GitHub Releases herunter, verifizieren Sie die
Prüfsumme und installieren Sie dann:
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
Architektur-Zuordnung:
uname -m | Archiv |
|---|---|
x86_64 | linux-amd64 |
aarch64, arm64 | linux-arm64 |
Jedes Archiv enthält die Binärdatei, README, Apache-2.0-Lizenz und Hinweise zu Drittanbietern.
Erfordert Linux und Go 1.25+:
go install github.com/pbxqdown/portclue/cmd/[email protected]
Dies legt die Binärdatei in $(go env GOPATH)/bin ab. Bevorzugen Sie das prüfsummenverifizierte
Release-Archiv oder das Installationsskript, wenn Sie reproduzierbare Installationsartefakte wünschen.
Voraussetzungen: Linux und Go 1.25 oder neuer.
go build -o portclue ./cmd/portclue
./portclue
./portclue --json
./portclue 8080
./portclue --json 8080
Der Übersichtsmodus akzeptiert optionale Filter (ignorierte Felder bleiben uneingeschränkt):
./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 akzeptiert eine kommagetrennte Liste von ALL_INTERFACES,
SPECIFIC_INTERFACE und LOOPBACK_ONLY. --source akzeptiert host und/oder
docker. --min-confidence behält Einträge bei oder über HIGH, MEDIUM, LOW
oder UNKNOWN. Diese Flags gelten nur, wenn PORT weggelassen wird.
Die Ausführung ohne Root liefert weiterhin nützliche Listener-, Docker-Zuordnungs- und Bind-Adress-
Beweise. Prozessidentität und Firewall-Beweise können unvollständig sein, wenn /proc oder
der Firewall-Zustand eingeschränkt sind; PortClue meldet dies unter Incomplete evidence.
Verwenden Sie sudo für das vollständigste Ergebnis:
sudo ./portclue
sudo ./portclue --bind-scope ALL_INTERFACES,SPECIFIC_INTERFACE
sudo ./portclue 8080
Die JSON-Formen sind für Skripte und Agenten gedacht. Übersichts-JSON verwendet
schema_version: 2, mode: "overview" und entries mit
service_identity und bind_scope. Ein detaillierter Bericht verwendet
schema_version: 1, query, verdict, paths mit
service_identity, unknowns und warnings.
Innerhalb einer Schema-Version werden bestehende Feldnamen und Bedeutungen als stabil behandelt.
Neue optionale Felder können hinzugefügt werden. Eine Entfernung, Umbenennung oder inkompatible Bedeutungsänderung
erfordert eine neue schema_version. Beide Verträge haben Regressionstests.
| Urteil | Bedeutung |
|---|---|
POTENTIAL | Ein nicht-Loopback-lokaler Pfad wird beobachtet und die unterstützten Firewall-Beweise erlauben ihn. Externes Routing ist unbekannt. |
NOT_EXPOSED_LOCALLY | Es existiert kein Listener/Mapping, das Bind ist nur Loopback, oder unterstützte lokale Firewall-Beweise blockieren den Pfad. |
UNKNOWN | Eine erforderliche Tatsache ist nicht verfügbar oder ein potenziell relevanter Firewall-Ausdruck wird nicht unterstützt. |
CONFIRMED | Reserviert für eine zukünftige explizite externe Sonde. Die aktuelle reine lokale CLI gibt es nie aus. |
--bind-scope, --source, --min-confidenceNicht enthalten: UDP, Podman, Kubernetes, Cloud-Sicherheitsgruppen, Router-Erkennung, Remote-Scanning, eBPF, kontinuierliche Überwachung oder Behebung.
PortClue versucht absichtlich nicht, die gesamte Netfilter-Virtual-
Machine zu implementieren. Die erste Version versteht eine kleine Menge direkter Regeln. Mehrere Basis-
Chains, Jumps, Sets, Maps, fib, dynamische Ausdrücke oder andere nicht erkannte Logik
verursachen UNKNOWN, wenn sie die Abfrage beeinflussen können. Dies ist sicherer, als eine
nicht geparste Regel stillschweigend als Accept oder Drop zu behandeln.
Siehe CONTRIBUTING.md für Umfang, Tests und wie man
Firewall-UNKNOWN-Ergebnisse meldet.
make check
make release VERSION=0.1.2
make release erfordert einen sauberen Git-Worktree und erstellt versionierte amd64/arm64-
Archive plus dist/SHA256SUMS. Das Pushen eines v*-Tags an das konfigurierte
GitHub-Remote führt dieselben Prüfungen aus und erstellt ein GitHub-Release. Vom Makefile wird kein Tag erstellt.
Das langfristige Design hält den Analyzer, das Kausalmodell und die Renderer plattformneutral. Linux ist das erste Beweis-Backend; Windows ist das wahrscheinlich zweite Backend, wenn der Linux- Prototyp echte Nutzung erlangt.
PortClue ist unter der Apache License 2.0 lizenziert. Siehe LICENSE. Binärarchive enthalten auch THIRD_PARTY_NOTICES.
Siehe CHANGELOG.md für die Release-Historie und JSON-Kompatibilitätshinweise, SECURITY.md für unterstützte Versionen und private Schwachstellenmeldung, und CONTRIBUTING.md zum Mitwirken.