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?

Patrick McMahon
la source

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.

rocheux
la source
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.

Sandri_Nenes
la source
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.

crashoverbike
la source
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

phk
la source
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