Звідки 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? Чому він використовується на обох комп'ютерах?
Sopalajo de Arrierez
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.