
Explique pourquoi un port TCP Linux peut être ou ne pas être joignable
PortClue explique pourquoi un port TCP sur une machine Linux peut ou non être joignable.
Il transforme l'état des sockets, des processus, du pare-feu et de Docker en une courte chaîne de preuves
au lieu de vous obliger à corréler manuellement ss, /proc, nftables, iptables et docker inspect.

Exécutez-le sans port pour découvrir quels points de terminaison TCP locaux méritent votre attention :
$ 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 et LOOPBACK_ONLY décrivent où un
socket accepte le trafic. Ils ne prétendent délibérément pas qu'un pare-feu l'autorise.
Inspectez un port pour l'analyse complète du pare-feu local :
$ 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 est un prototype Linux précoce et conservateur.
POTENTIALsignifie que le chemin local observé autorise le trafic ; cela ne prétend pas qu'un port est joignable depuis l'internet public. Les expressions de pare-feu non prises en charge produisentUNKNOWN.
ss ou lsofNETLINK_INET_DIAG, la même interface
du noyau que celle utilisée par ss, et les détails des processus de /proc. Rien n'est analysé à partir de
la sortie d'un autre outil, donc un conteneur sans ss ni lsof obtient quand même
l'écouteur et son propriétaire. L'analyse du pare-feu exécute bien nft ou iptables-save, et
signale UNKNOWN sans eux.ss -ltnp vous donne le socket et le PID.
Savoir si ce bind est limité à la loopback, si une règle de pare-feu l'autorise, et si
le port est une publication Docker plutôt qu'un écouteur hôte est un travail que vous feriez autrement
à la main.UNKNOWN, jamais une
réponse fausse avec assurance.NETLINK_INET_DIAG, et non en analysant la sortie de ss/procsystemctl shownft --json list rulesetiptables-save lorsque nftables n'est pas disponiblePortClue identifie à quoi appartient un port avant d'expliquer l'exposition. Les preuves sont classées dans cet ordre :
/etc/services.Un propriétaire réel prime toujours sur un nom de port conventionnel. Si seule la convention de port
est connue, l'identité est explicitement marquée avec une confiance LOW. Le catalogue embarqué est
stocké dans internal/identify/catalog.json et est livré
à l'intérieur du binaire unique ; PortClue ne télécharge pas de données d'identité à l'exécution.
PortClue est en lecture seule. Il ne se connecte pas au port interrogé, ne scanne pas un autre hôte, ne modifie pas les règles de pare-feu, n'arrête pas de processus ou de conteneurs, ne téléverse pas de données et n'exécute pas de démon.
Fonctionne sous Linux (amd64 et arm64). Le script télécharge l'archive GitHub
Release correspondante, vérifie SHA256SUMS et installe un binaire unique. Il ne
modifie pas la configuration du shell.
Installation utilisateur (par défaut, sans root). Installe dans ~/.local/bin, vous en êtes propriétaire :
curl -fsSL https://raw.githubusercontent.com/pbxqdown/portclue/v0.1.2/scripts/install.sh | sh
portclue
Une installation utilisateur s'exécute sans root et rapporte les preuves disponibles pour votre
compte, en notant ce qui manque. Cela suffit pour explorer les écouteurs et les mappages Docker.
Comme sudo ne cherche pas dans ~/.local/bin et que ce binaire est
modifiable par votre utilisateur, n'exécutez pas cette copie avec sudo.
Installation système (propriété de root, pour sudo portclue). PortClue lit les preuves les plus
complètes (restreintes /proc, état complet du pare-feu) en tant que root. Pour cela,
installez un binaire appartenant à root dans /usr/local/bin (le script utilise sudo uniquement
pour l'étape d'installation finale, pas pour le téléchargement ou l'extraction) :
curl -fsSL https://raw.githubusercontent.com/pbxqdown/portclue/v0.1.2/scripts/install.sh | sh -s -- --system
sudo portclue
Surcharges optionnelles : PORTCLUE_VERSION=0.1.2 (sans v initial) et
PORTCLUE_INSTALL_DIR pour l'un ou l'autre mode.
Désinstallation :
# 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
Téléchargez le fichier portclue-VERSION-linux-ARCH.tar.gz correspondant et SHA256SUMS depuis
GitHub Releases, vérifiez la
somme de contrôle, puis installez :
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
Correspondance des architectures :