Comment netcat sait-il si un port UDP est ouvert?


50

Je peux donc utiliser cette commande netcat pour vérifier si un port UDP est ouvert:

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

Contrairement à TCP, UDP est sans connexion (feu et oublie). Donc, à un niveau élevé, est-ce que quelqu'un sait comment Netcat sait que le port UDP est ouvert? Est-ce qu'il demande une réponse ou quelque chose comme ça?

Réponses:


17

À en juger par la sortie spécifique que Connection to Connection to 10.1.0.100 53 port [udp/domain] succeeded!vous utilisez openbsd-netcat.

En regardant le code, le test doit se lier à la socket UDP, c’est-à-dire qu’une connexion est ouverte:

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

Les problèmes les plus difficiles autour de 3 écrit dans le socket ouvert. Il convient de noter que cela ne fonctionne pas pour IPv6 et échoue après la vérification de 100 ports environ.

Donc, bien que l’autre suggestion puisse être valable, je ne pense pas que cela se produise dans ce cas particulier.


il en udptestva de même pour la fonction que je recherche et cela répond à ma question. A partir du lien que vous avez fourni "* udptest () * Faites quelques écrit pour voir si le port UDP est là"
Patrick McMahon

Oui, je viens de vérifier cela et j'ai également vu les écrits. Réponse révisée.
rocheux

1
@PatrickMcMahon - si cela répond à votre question, acceptez-la en cliquant sur la grande coche.
cas

17

En fait, ça ne marche pas. Vous pouvez vérifier en faisant:

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

Donc, avec UDP, ce n'est pas quelque chose que vous pouvez vraiment vérifier à moins que cela ne vous rende des informations.


10

Eh bien j'ai un avis différent:

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.

Donc, sur cette base, vous pouvez vérifier si la connexion entre a et b sur ce port udp est possible. Plus tard, vous pourrez continuer à vérifier avec tcpdump.


1
Ah oui j'aime ça. C'est un bon moyen de vérifier si vous avez accès aux deux nœuds. Je suppose que lorsque je posais la question, je me dirigeais vers «comment tester une boîte noire» ou pour sonder un nœud externe. Netcat ne peut en garantir le résultat.
Patrick McMahon

Pourriez-vous s'il vous plaît développer l'adresse IP 10.12.0.12? Pourquoi est-il utilisé sur les deux ordinateurs?
Sopalajo de Arrierez

option -k est pas nécessaire lorsque vous traitez avec UDP
Yon

9

Il existe un message ICMP pour signaler qu'un port, même un port UDP, est fermé. Donc, si un hôte envoie ce message, on peut supposer que le port est fermé.

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


4
Notez que, comme UDP est sans connexion, vous ne pouvez pas distinguer de manière fiable un port ouvert d’un port avec pare-feu d’un paquet perdu.
Marc

Très vrai. Et théoriquement, il serait également possible que vous obteniez le paquet et que le port ne soit pas vraiment fermé.
phk
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.