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?

Patrick McMahon
źródło

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.

skalisty
źródło
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.

Sandri_Nenes
źródło
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

phk
źródło
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.

crashoverbike
źródło
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