
Объясните, почему TCP-порт Linux может быть доступен или недоступен
PortClue объясняет, почему TCP-порт на Linux-машине может быть или не быть доступен.
Он превращает состояние сокетов, процессов, межсетевого экрана и 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 или lsofNETLINK_INET_DIAG — того же интерфейса ядра,
который использует ss, а сведения о процессах — из /proc. Ничего не парсится из вывода
других инструментов, поэтому контейнер без ss и lsof всё равно получает
слушателя и его владельца. Анализ межсетевого экрана действительно запускает nft или iptables-save и
сообщает UNKNOWN без них.ss -ltnp даёт вам сокет и PID.
Является ли эта привязка только loopback, разрешает ли её правило межсетевого экрана и является ли
порт публикацией Docker, а не слушателем хоста, — это работа, которую иначе пришлось бы
делать вручную.UNKNOWN, а не
уверенный неверный ответ.NETLINK_INET_DIAG, а не путём парсинга вывода ss/procsystemctl shownft --json list rulesetiptables-save, когда nftables недоступенPortClue определяет, чему принадлежит порт, прежде чем объяснять доступность. Доказательства ранжируются в следующем порядке:
/etc/services.Фактический владелец всегда имеет приоритет над условным именем порта. Если известно только
соглашение о порте, идентификация явно помечается как LOW confidence. Встроенный каталог
хранится в 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 читает наиболее
полные доказательства (ограниченный /proc, полное состояние межсетевого экрана) от имени root. Для этого
установите принадлежащий 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
Загрузите соответствующий portclue-VERSION-linux-ARCH.tar.gz и SHA256SUMS из
GitHub Releases, проверьте
контрольную сумму, затем установите:
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 | Архив |
|---|---|
x86_64 | linux-amd64 |
aarch64, arm64 | linux-arm64 |
Каждый архив включает бинарный файл, README, лицензию Apache-2.0 и уведомления третьих сторон.
Требуется Linux и Go 1.27+: