У меня есть сервер сокетов Python (однопоточный, принимает только одно соединение), где-то работает.

Я подключаюсь к этому порту и делаю свои вещи.

Как я могу определить, открыт порт или закрыт, не устанавливая соединение? Я имею в виду, я не хочу закрывать порт, чтобы увидеть, открыт он или нет :-)

Я уже пробовал nc -zvv ip port но это закрывает скрипт (потому что он на самом деле подключается к порту).

1 ответ1

1

Используйте инструмент сканирования портов, такой как nmap . При запуске с достаточными привилегиями (в Linux необходима привилегия cap_net_raw, "root" в других системах Unix), инструмент имеет несколько режимов сканирования, которые не включают завершение TCP-рукопожатия.

В качестве привилегированного режима сканирования по умолчанию используется "TCP SYN scan" (опция -sS ), которая пытается запустить рукопожатие TCP, но сразу же сбрасывает его. Таким образом, программа не сообщается о попытке соединения , потому что не было никакой связи.

Для сканирования определенных портов добавьте параметр -p <ports> .

$ sudo nmap --reason -sS -p 22,53,79,80 localhost
PORT    STATE  SERVICE REASON
22/tcp  open   ssh     syn-ack
79/tcp  open   finger  syn-ack
143/tcp closed imap    reset
443/tcp closed https   reset

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .