Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
portclue — Объясните, почему TCP-порт Linux может быть доступен или недоступен | Kitploit
Инструменты/GitHubGitHub/pbxqdown/portclue
Оборонительные ИнструментыБезопасность контейнеровАудит конфигурацииСбор информацииСетевая безопасностьУтилиты и фреймворки
GitHubpbxqdown/portclue

portclue

Объясните, почему TCP-порт Linux может быть доступен или недоступен

Репозиторий
34526 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Сайт
Поделиться

PortClue

CI Release License Go

PortClue объясняет, почему TCP-порт на Linux-машине может быть или не быть доступен. Он превращает состояние сокетов, процессов, межсетевого экрана и Docker в короткую цепочку доказательств вместо того, чтобы заставлять вас вручную сопоставлять ss, /proc, nftables, iptables и docker inspect.

Демонстрация PortClue: обзор локальных TCP-слушателей, затем цепочка доказательств для порта 8080

Запустите его без указания порта, чтобы обнаружить, какие локальные 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 или lsof

  • Они не нужны. Слушатели берутся из NETLINK_INET_DIAG — того же интерфейса ядра, который использует ss, а сведения о процессах — из /proc. Ничего не парсится из вывода других инструментов, поэтому контейнер без ss и lsof всё равно получает слушателя и его владельца. Анализ межсетевого экрана действительно запускает nft или iptables-save и сообщает UNKNOWN без них.
  • Он отвечает на следующий вопрос. ss -ltnp даёт вам сокет и PID. Является ли эта привязка только loopback, разрешает ли её правило межсетевого экрана и является ли порт публикацией Docker, а не слушателем хоста, — это работа, которую иначе пришлось бы делать вручную.
  • Он не будет угадывать. Правило межсетевого экрана, которое PortClue не может смоделировать, даёт UNKNOWN, а не уверенный неверный ответ.

Что он читает

  • TCP-слушатели через NETLINK_INET_DIAG, а не путём парсинга вывода ss
  • владельца процесса, исполняемый файл, командную строку, cgroup и сетевой namespace через /proc
  • описания systemd-юнитов из установленных файлов юнитов и активные триггеры сокетов через systemctl show
  • nftables через nft --json list ruleset
  • iptables через iptables-save, когда nftables недоступен
  • опубликованные порты Docker через локальный HTTP API Docker Engine, включая образ и метки

Идентификация сервиса

PortClue определяет, чему принадлежит порт, прежде чем объяснять доступность. Доказательства ранжируются в следующем порядке:

  1. наблюдаемый исполняемый файл, systemd-юнит и активный триггер сокета;
  2. образ Docker, имя контейнера и метки;
  3. встроенный курируемый каталог сервисов;
  4. локальное соглашение о портах /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_64linux-amd64
aarch64, arm64linux-arm64

Каждый архив включает бинарный файл, README, лицензию Apache-2.0 и уведомления третьих сторон.

Установка через Go

Требуется Linux и Go 1.27+:

Скачать инструмент