Используя bash `/ dev / udp`, как я узнаю, открыт ли порт?

14

У меня нет доступа к netcatили nmapтак я пытаюсь использовать bashи /dev/udp/специальные файлы для тестирования портов.

Я мог бы сделать что-то вроде:

echo "" > /dev/udp/example.com/8000

Но $?всегда 0при использовании UDP. Я предполагаю, что это потому, что это возвращаемое значение echo ""команды правильно?

Я в основном пытаюсь повторить то, что я могу сделать, nmapи netcat:

nmap -sU -p 8000 example.com | grep open >/dev/null && echo 'open'
nc -z -u example.com 8000 && echo 'open'

Как бы я это сделал /dev/udp?

Бельмин Фернандес
источник
1
UDP не гарантирует доставку, поэтому, даже если bash считает, что удалось отправить сообщение, сообщение могло быть уничтожено в пути. Как вы тестировали неудачную отправку (не неудачное соединение: UDP не является соединением)?
Жиль "ТАК - перестань быть злым"

Ответы:

13

Для TCP, просто проверка $?. Если соединение не удалось, $?не будет 0:

$ >/dev/tcp/google.com/81
bash: connect: Network is unreachable
bash: /dev/tcp/google.com/81: Network is unreachable
$ echo $?
1

Потребуется время, bashчтобы понять, что соединение не установлено. Вы можете использовать тайм-аут для запуска bash:

$ timeout 1 bash -c '>/dev/tcp/google.com/80' &&
  echo Port open ||
  echo Port close
Port open

Тестирование порта udp более сложное.

Строго говоря, не существует открытого состояния (конечно, udp - это протокол без сохранения состояния ) с udp. Есть только два состояния с UDP, слушая или нет . Если это не так , вы получите пункт назначения ICMP недоступным .

К сожалению, брандмауэр или маршрутизатор часто отбрасывают эти ICMP-пакеты, поэтому вы не будете уверены, в каком состоянии находится порт udp.

cuonglm
источник
Перефразировал мой вопрос, чтобы сосредоточиться на UDP. Мои извинения за редактирование ниндзя. Я думал, что это будет похоже, поэтому не делал различий. Спасибо за разъяснение.
Бельмин Фернандес
10

В общем, вы не можете.

В отличие от TCP, UDP не имеет соединения. Вы не можете обнаружить, что порт открыт, просто установив бездействующее соединение с ним, как вы можете это сделать с помощью TCP. Скорее, вам нужно отправить данные в порт и посмотреть, что произойдет, а детали UDP, реализованные в реальном мире, затрудняют интерпретацию результатов. Даже сложные инструменты уровня пакета, например, nmapне могут точно сказать, существует ли программа, слушающая данный порт UDP. nmapКлассифицирует порты UDP на три группы:

  1. Определенно открыт. Посылка пакета в порт вызвала ответ данных от машины назначения.
  2. Определенно закрыто. При отправке пакета в порт было получено сообщение «ICMP Destination Unreachable» с компьютера назначения.
  3. Либо открыть, либо отфильтровать. Отправка пакета в порт не вызвала никакого ответа. Может быть, есть брандмауэр, который отбрасывает пакеты; может быть, слушает программу и nmapпросто не понял, как получить ответ; возможно, пользователю просто не повезло, и все пакеты были потеряны при передаче.
отметка
источник
Отличная информация о nmap. Спасибо, это проясняет много путаницы.
Бельмин Фернандес