Как netcat узнает, открыт ли порт UDP?


49

Поэтому я могу использовать эту команду netcat, чтобы проверить, открыт ли порт UDP:

$  nc -vz -u 10.1.0.100 53
Connection to 10.1.0.100 53 port [udp/domain] succeeded!

В отличие от TCP, UDP не использует соединение (запускать и забывать). Итак, на высоком уровне кто-нибудь знает, как netcat знает, что порт UDP открыт? Он просит ответ или что-то в этом роде?

Ответы:


17

Судя по конкретному выводу, Connection to Connection to 10.1.0.100 53 port [udp/domain] succeeded!вы используете openbsd-netcat.

Глядя на код для этого теста является привязка к сокету UDP, то есть есть открытое соединение:

              if (vflag || zflag) {
                            /* For UDP, make sure we are connected. */
                            if (uflag) {
                                    if (udptest(s) == -1) {
                                            ret = 1;
                                            continue;
                                    }
                            }

                            /* Don't look up port if -n. */
                            if (nflag)
                                    sv = NULL;
                            else {
                                    sv = getservbyport(
                                        ntohs(atoi(portlist[i])),
                                        uflag ? "udp" : "tcp");
                            }

                            fprintf(stderr,
                                "Connection to %s %s port [%s/%s] "
                                "succeeded!\n", host, portlist[i],
                                uflag ? "udp" : "tcp",
                                sv ? sv->s_name : "*");

udptest выдает около 3 записей в открытый сокет. Есть примечание, что это не работает для IPv6 и дает сбой после проверки около 100 портов.

Так что, хотя другое предложение может быть действительным, я не думаю, что это происходит в данном конкретном случае.


так udptestи функция, которую я ищу, и она отвечает на мой вопрос. По предоставленной вами ссылке «* udptest () * Сделайте несколько записей, чтобы увидеть, есть ли UDP-порт»
Патрик МакМахон,

Да, я только что проверил это и увидел записи. Пересмотренный ответ.
каменистый

@PatrickMcMahon - если это ответ на ваш вопрос, то примите его, нажав на большую галочку.
Cas

17

На самом деле это не так. Вы можете проверить, выполнив:

$ nc -vz -u 8.8.8.8 53 
Connection to 8.8.8.8 53 port [udp/domain] succeeded!
$ nc -vz -u 8.8.8.8 54
Connection to 8.8.8.8 54 port [udp/*] succeeded!
$ nc -vz -u 8.8.8.8 59
Connection to 8.8.8.8 59 port [udp/*] succeeded!
$ 

Так что с UDP, это не то, что вы действительно можете проверить, если оно не вернет вам информацию.


9

Существует сообщение ICMP, сигнализирующее, что порт, даже UDP, закрыт. Таким образом, если хост отправляет это сообщение, порт можно считать закрытым.

https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Destination_unreachable


4
Обратите внимание, что, поскольку UDP не имеет соединения, вы не можете надежно отличить открытый порт от межсетевого экрана от потерянного пакета.
Марк

Очень верно. И теоретически также возможно, что вы получите пакет, а порт на самом деле не закрыт.
phk

9

Ну у меня другое мнение

a:~# nc -luk 10.12.0.12 667 // listen on UDP port 667
b:~# nc -uv 10.12.0.12 667  // check if port is open 
nc: 10.12.0.12 (10.12.0.12) 667 [667] open
I love stackexchange // send a message
a:~# nc -luk 10.12.0.12 667
I love stackexchange // receive the message.

Исходя из этого, вы можете проверить, возможно ли соединение между a и b на этом порту udp. Позже вы можете продолжить проверку с помощью tcpdump.


1
Ах, да, мне это нравится. Это хороший способ проверить, есть ли у вас доступ к обоим узлам. Я предполагаю, что когда я задавал вопрос, я направлялся к «как проверить черный ящик» или проверял внешний узел. Результаты всего этого Netcat не может гарантировать.
Патрик МакМахон

Не могли бы вы рассказать подробнее об IP-адресе 10.12.0.12? Почему он используется на обоих компьютерах?
Сопалахо де Арриерес
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.