Почему сканирование netcat на UDP-порты всегда проходит успешно?
Я пытаюсь проверить, что несколько наших серверов могут обмениваться данными через определенные порты, прежде чем переносить на них некоторые из наших сервисов, и что они не заблокированы списками управления доступом межсетевого экрана наших организаций.
Имеет смысл
[mrduki@mybox1~]$ nc -ul 40000
---
[mrduki@mybox2~]$ nc -zvuw2 mybox1.com 40000
Connection to mybox1.com 40000 port [udp/*] succeeded!
Не имеет смысла
[mrduki@mybox1~]$ nc -ul 40000
[mrduki@mybox1~]$ ^C
---
[mrduki@mybox2~]$ nc -zvuw2 mybox1.com 40000
Connection to mybox1.com 40000 port [udp/*] succeeded!
На самом деле, если я делаю сканирование портов из 40000-40100
, каждый порт успешно.
Если я делаю те же тесты без -u
(так что он тестирует TCP вместо UDP), я получаю 40000 (tcp) timed out: Operation now in progress
ошибки, как я и ожидал (так как у меня нет такой службы TCP прослушивания 40000
).
Делать sudo netstat -alnp | grep LISTEN
на mybox1
хотя не показывает таких служб прослушивания на этих портах. Так чего мне не хватает?
3 ответа
nc
возможно, не лучший инструмент для проверки состояния порта. Ты пытался nmap
? Это на самом деле сканер портов. Я проверил файловый сервер в моей домашней сети и 127.0.0.1, оба сообщают, что UDP port 40000
закрыто.
птар
# nmap -sU -p 40000 igor
Starting Nmap 7.01 ( https://nmap.org ) at 2016-08-18 18:27 EDT
Nmap scan report for igor (192.168.1.125)
Host is up (0.00027s latency).
rDNS record for 192.168.1.125: igor.swass
PORT STATE SERVICE
40000/udp closed unknown
MAC Address: 68:05:CA:3A:BF:B7 (Intel Corporate)
Nmap done: 1 IP address (1 host up) scanned in 0.53 seconds
Ядро + /dev
Вы также можете использовать ядро, чтобы сделать это так. Но nmap
наверное лучше.
# timeout 3 cat < /dev/udp/example.com/40000
Когда я пытался nc
на том же сервере (игорь) я получал те же результаты, что и вы. Но я вернулся, чтобы повторить попытку, и теперь он не возвращает никаких выходных данных (сообщение об ошибке не было выполнено), и wireshark показывает, что "пункт назначения недоступен", отправляемый по протоколу ICMP. Я не понимаю ничего из этого. Но я бы переключился на другой метод проверки состояния порта UDP.
UDP - это протокол без установления соединения. Если вы отправляете пакет и не получаете отказа (через ICMP), он считается успешным. Это независимо от того, отвечает или нет что-либо. Я не смог принять сообщение на удаленном конце, что можно рассматривать как проблему с высоким уровнем связи, например, DNS, но это не сбой, если речь идет о UDP.
Сравните это с TCP, который с состоянием. Ошибка получения ответа (ACK) считается ошибкой в TCP (обычно она отображается как "отфильтрованная"), так же как и отрицательные ответы (RST, которая будет отображаться как закрытая).
UDP: открыто | отфильтровано закрыто TCP: открыто закрыто отфильтровано
Ни один блок брандмауэра не остановит попытку соединения UDP, поскольку соединение с UDP не требует отправки чего-либо или прослушивания каких-либо ответов. Функционально операция UDP-соединения аналогична отправке до точки, где данные фактически отправляются, то есть:
- Гарантирует, что выбранный локальный порт может быть связан с, если он был выбран.
- Если локальный порт не был выбран, он выбирает один.
- Блокирует конечную точку, чтобы она по умолчанию связывалась с выбранным IP-адресом и портом и отбрасывала любые дейтаграммы, полученные с любого другого IP-адреса или порта.
- Система может изменить способ обработки некоторых типов ошибок.
- Вот и все.
Обратите внимание, что ничего из этого не делает ничего, что может помешать брандмауэр, и ничего не передается по проводам.