
Spiega perché una porta TCP Linux può essere o meno raggiungibile
PortClue spiega perché una porta TCP su una macchina Linux può o non può essere raggiungibile.
Trasforma lo stato di socket, processi, firewall e Docker in una breve catena di prove invece
di costringerti a correlare manualmente ss, /proc, nftables, iptables e docker inspect.

Eseguilo senza una porta per scoprire quali endpoint TCP locali meritano attenzione:
$ 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 e LOOPBACK_ONLY descrivono dove un
socket accetta traffico. Deliberatamente non affermano che un firewall lo permetta.
Ispeziona una porta per l'analisi completa del firewall locale:
$ 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 è un prototipo Linux precoce e conservativo.
POTENTIALsignifica che il percorso locale osservato consente il traffico; non afferma che una porta sia raggiungibile da internet pubblico. Le espressioni firewall non supportate produconoUNKNOWN.
NETLINK_INET_DIAG, non estraendo l'output di ss/procsystemctl shownft --json list rulesetiptables-save quando nftables non è disponibilePortClue identifica a cosa appartiene una porta prima di spiegare l'esposizione. Le prove sono ordinate in questo modo:
/etc/services.Un proprietario effettivo prevale sempre su un nome di porta convenzionale. Se è nota solo la
convenzione di porta, l'identità è esplicitamente contrassegnata con confidenza LOW. Il catalogo
integrato è memorizzato in internal/identify/catalog.json e viene
distribuito all'interno del singolo binario; PortClue non scarica dati di identità a runtime.
PortClue è in sola lettura. Non si connette alla porta interrogata, non scansiona un altro host, non modifica regole del firewall, non arresta processi o container, non carica dati e non esegue un daemon.
Funziona su Linux (amd64 e arm64). Lo script scarica l'archivio GitHub
Release corrispondente, verifica SHA256SUMS e installa un singolo binario. Non
modifica la configurazione della shell.
Installazione utente (predefinita, senza root). Installa in ~/.local/bin, di tua proprietà:
curl -fsSL https://raw.githubusercontent.com/pbxqdown/portclue/v0.1.2/scripts/install.sh | sh
portclue
Un'installazione utente viene eseguita senza root e riporta le prove disponibili per il tuo
account, indicando ciò che manca. Questo è sufficiente per esplorare i listener e le mappature
Docker. Poiché sudo non cerca in ~/.local/bin e questo binario è scrivibile dal tuo utente,
non eseguire questa copia con sudo.
Installazione di sistema (di proprietà di root, per sudo portclue). PortClue legge le prove
più complete (restricted /proc, stato completo del firewall) come root. Per questo,
installa un binario di proprietà di root in /usr/local/bin (lo script usa sudo solo
per il passaggio finale di installazione, non per il download o l'estrazione):
curl -fsSL https://raw.githubusercontent.com/pbxqdown/portclue/v0.1.2/scripts/install.sh | sh -s -- --system
sudo portclue
Override opzionali: PORTCLUE_VERSION=0.1.2 (senza v iniziale) e
PORTCLUE_INSTALL_DIR per entrambe le modalità.
Disinstallazione:
# 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
Scarica il file portclue-VERSION-linux-ARCH.tar.gz corrispondente e SHA256SUMS da
GitHub Releases, verifica il
checksum, quindi installa:
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
Mappatura delle architetture:
uname -m | Archivio |
|---|---|
x86_64 | linux-amd64 |
aarch64, arm64 | linux-arm64 |
Ogni archivio include il binario, il README, la licenza Apache-2.0 e le note di terze parti.
Richiede Linux e Go 1.25+:
go install github.com/pbxqdown/portclue/cmd/[email protected]
Questo mette il binario in $(go env GOPATH)/bin. Preferisci l'archivio release
verificato tramite checksum o lo script di installazione quando desideri artefatti di installazione riproducibili.
Requisiti: Linux e Go 1.25 o superiore.
go build -o portclue ./cmd/portclue
./portclue
./portclue --json
./portclue 8080
./portclue --json 8080
La modalità panoramica accetta filtri opzionali (i campi ignorati rimangono non vincolati):
./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 accetta un elenco separato da virgole di ALL_INTERFACES,
SPECIFIC_INTERFACE e LOOPBACK_ONLY. --source accetta host e/o
docker. --min-confidence mantiene le voci pari o superiori a HIGH, MEDIUM, LOW,
o UNKNOWN. Questi flag si applicano solo quando PORT è omesso.
L'esecuzione senza root fornisce comunque prove utili su listener, mappature Docker e indirizzi
di bind. L'identità del processo e le prove del firewall possono essere incomplete quando /proc o
lo stato del firewall sono limitati; PortClue lo segnala sotto Incomplete evidence.
Usa sudo per il risultato più completo:
sudo ./portclue
sudo ./portclue --bind-scope ALL_INTERFACES,SPECIFIC_INTERFACE
sudo ./portclue 8080
Le forme JSON sono destinate a script e agenti. Il JSON panoramico usa
schema_version: 2, mode: "overview" e entries con
service_identity e bind_scope. Un report dettagliato usa
schema_version: 1, query, verdict, paths con
service_identity, unknowns e warnings.
All'interno di una versione dello schema, i nomi e i significati dei campi esistenti sono considerati stabili.
Nuovi campi opzionali possono essere aggiunti. Una rimozione, una rinomina o una modifica incompatibile del significato
richiede un nuovo schema_version. Entrambi i contratti hanno test di regressione.
| Verdetto | Significato |
|---|---|
POTENTIAL | Viene osservato un percorso locale non-loopback e le prove firewall supportate lo consentono. Il routing esterno è sconosciuto. |
NOT_EXPOSED_LOCALLY | Non esiste alcun listener/mappatura, il bind è solo loopback, oppure le prove firewall locali supportate bloccano il percorso. |
UNKNOWN | Un fatto richiesto non è disponibile o un'espressione firewall potenzialmente rilevante non è supportata. |
CONFIRMED | Riservato a una futura sonda esterna esplicita. L'attuale CLI solo locale non lo emette mai. |
--bind-scope, --source, --min-confidenceNon incluso: UDP, Podman, Kubernetes, security group cloud, discovery del router, scansione remota, eBPF, monitoraggio continuo o remediation.
PortClue intenzionalmente non tenta di implementare l'intera macchina virtuale Netfilter.
La prima versione comprende un piccolo insieme di regole dirette. Catene base multiple, jump, set, map, fib, espressioni dinamiche o altra logica non riconosciuta
causano UNKNOWN quando possono influenzare la query. Questo è più sicuro che trattare silenziosamente
una regola non analizzata come accept o drop.
Vedi CONTRIBUTING.md per ambito, test e come segnalare
risultati firewall UNKNOWN.
make check
make release VERSION=0.1.2
make release richiede un worktree Git pulito e crea archivi versionati amd64/arm64
più dist/SHA256SUMS. Il push di un tag v* verso il remoto GitHub configurato
esegue gli stessi controlli e crea una release GitHub. Nessun tag viene creato
dal Makefile.
Il design a lungo termine mantiene l'analizzatore, il modello causale e i renderer indipendenti dalla piattaforma. Linux è il primo backend di prove; Windows è il probabile secondo backend se il prototipo Linux otterrà un utilizzo reale.
PortClue è distribuito sotto la Apache License 2.0. Vedi LICENSE. Gli archivi binari includono anche THIRD_PARTY_NOTICES.
Vedi CHANGELOG.md per la cronologia delle release e le note di compatibilità JSON, SECURITY.md per le versioni supportate e la segnalazione privata di vulnerabilità, e CONTRIBUTING.md per contribuire.