Come fa netcat a sapere se una porta UDP è aperta?


49

Quindi posso usare questo comando netcat per verificare se una porta UDP è aperta:

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

A differenza di TCP, UDP è senza connessione (attiva e dimentica). Quindi, ad alto livello, qualcuno sa come netcat sappia che la porta UDP è aperta? Chiede una risposta o qualcosa del genere?

Risposte:


17

A giudicare dall'output specifico Connection to Connection to 10.1.0.100 53 port [udp/domain] succeeded!che stai usando openbsd-netcat.

Osservando il codice per cui il test è associato al socket UDP, ovvero esiste una connessione aperta:

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

problemi di udptest intorno a 3 scrive nel socket aperto. C'è una nota che questo non funziona per IPv6 e fallisce dopo il controllo di circa 100 porte.

Quindi, mentre l'altro suggerimento può essere valido, non penso che ciò accada in questo caso particolare.


così udptestè la funzione che sto cercando e risponde alla mia domanda. Dal link che hai fornito "* udptest () * Fai alcune scritture per vedere se c'è la porta UDP"
Patrick McMahon,

Sì, l'ho appena verificato e ho visto anche le scritture. Risposta rivista.
roccioso,

@PatrickMcMahon - se questo risponde alla tua domanda, accettalo facendo clic sul segno di spunta grande.
Cas

17

In realtà no. Puoi controllare facendo:

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

Quindi, con UDP, non è qualcosa che puoi davvero controllare a meno che non ti restituisca informazioni.


9

C'è un messaggio ICMP per segnalare che una porta, anche una UDP, è chiusa. Pertanto, se un host invia questo messaggio, si può presumere che la porta sia chiusa.

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


4
Si noti che poiché UDP è privo di connessione, non è possibile distinguere in modo affidabile una porta aperta da una porta con firewall da un pacchetto perso.
Segna il

Verissimo. E teoricamente sarebbe anche possibile ottenere il pacchetto e la porta non è davvero chiusa.
phk,

9

Bene, ho un'opinione diversa:

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.

Pertanto, in base a ciò, è possibile verificare se la connessione tra aeb su quella porta udp è possibile. Successivamente puoi continuare a controllare usando tcpdump.


1
Ah sì, mi piace questo. È un buon modo per verificare se si ha accesso a entrambi i nodi. Immagino che quando stavo ponendo la domanda stavo andando verso "come testare una scatola nera" o sondare un nodo esterno. I risultati di questo, netcat non possono garantire.
Patrick McMahon,

Potresti espandere l'indirizzo IP 10.12.0.12? Perché viene utilizzato su entrambi i computer?
Sopalajo de Arrierez,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.