
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 consenta.
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.
ss o lsofNETLINK_INET_DIAG, la stessa interfaccia
del kernel usata da ss, e i dettagli dei processi da /proc. Nulla viene estratto
dall'output di un altro strumento, quindi un container che non ha né ss né lsof ottiene
comunque il listener e il suo proprietario. L'analisi del firewall esegue nft o iptables-save,
e segnala UNKNOWN senza di essi.ss -ltnp ti fornisce il socket e il PID.
Se quel bind è solo loopback, se una regola del firewall lo consente e se
la porta è una pubblicazione Docker anziché un listener host è un lavoro che altrimenti
faresti a mano.UNKNOWN, mai una
risposta sbagliata ma sicura di sé.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 della 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, annotando ciò che manca. Questo è sufficiente per esplorare listener e 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 ( /proc limitato, 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 corrispondente portclue-VERSION-linux-ARCH.tar.gz 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.27+: