Skąd Netcat wie, czy port UDP jest otwarty?


49

Więc mogę użyć tego polecenia netcat, aby sprawdzić, czy port UDP jest otwarty:

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

W przeciwieństwie do TCP, UDP jest bezpołączeniowy (odpal i zapomnij). Więc na wysokim poziomie, czy ktoś wie, skąd Netcat wie, że port UDP jest otwarty? Czy prosi o odpowiedź czy coś takiego?

Odpowiedzi:


17

Sądząc po konkretnym wyjściu, Connection to Connection to 10.1.0.100 53 port [udp/domain] succeeded!którego używasz openbsd-netcat.

Patrząc na kod tego testu, należy połączyć się z gniazdem UDP, tzn. Istnieje otwarte połączenie:

              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 : "*");

problemy udptest około 3 zapisuje w otwartym gnieździe. Należy zauważyć, że nie działa to w przypadku IPv6 i kończy się niepowodzeniem po sprawdzeniu około 100 portów.

Tak więc, chociaż druga sugestia może być poprawna, nie sądzę, że dzieje się tak w tym konkretnym przypadku.


to udptestjest funkcja, której szukam i odpowiada na moje pytanie. Z podanego linku „* udptest () * Zrób kilka zapisów, aby sprawdzić, czy jest tam port UDP”
— Patrick McMahon,

Tak, właśnie to sprawdziłem i zobaczyłem również zapisy. Poprawiona odpowiedź.
— skalista

@PatrickMcMahon - jeśli to odpowiada na twoje pytanie, zaakceptuj je, klikając duży haczyk.
— cas

17

W rzeczywistości tak nie jest. Możesz to sprawdzić, wykonując:

$ 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!
$ 

Tak więc z UDP nie jest to coś, co naprawdę można sprawdzić, chyba że dostarczy ci informacji.


9

Komunikat ICMP sygnalizuje, że port, nawet UDP, jest zamknięty. Jeśli więc host wyśle ​​ten komunikat, można założyć, że port jest zamknięty.

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


4
Należy pamiętać, że ponieważ UDP jest bezpołączeniowy, nie można niezawodnie odróżnić portu otwartego od zapory ogniowej od utraconego pakietu.
— Mark

Bardzo prawdziwe. Teoretycznie byłoby również możliwe, że otrzymasz pakiet, a port nie jest tak naprawdę zamknięty.
— phk

9

Mam inne zdanie:

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.

Na tej podstawie możesz sprawdzić, czy połączenie między aib na tym porcie udp jest możliwe. Później możesz kontynuować sprawdzanie za pomocą tcpdump.


1
Ach tak, podoba mi się to. To dobry sposób na sprawdzenie, czy masz dostęp do obu węzłów. Myślę, że kiedy zadawałem pytanie, kierowałem się w stronę „jak przetestować czarną skrzynkę” lub sondować zewnętrzny węzeł. Netcat nie może zagwarantować tego samego rezultatu.
— Patrick McMahon

Czy możesz rozwinąć adres IP 10.12.0.12? Dlaczego jest używany na obu komputerach?
— Sopalajo de Arrierez
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.