Como o netcat sabe se uma porta UDP está aberta?

49

Então, eu posso usar este comando netcat para verificar se uma porta UDP está aberta:

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

Ao contrário do TCP, o UDP é sem conexão (disparar e esquecer). Então, em um nível alto, alguém sabe como o netcat sabe que a porta UDP está aberta? Ele pede uma resposta ou algo assim?

Patrick McMahon
fonte

Respostas:

17

A julgar pela saída específica, Connection to Connection to 10.1.0.100 53 port [udp/domain] succeeded!você está usando o openbsd-netcat.

Olhando o código para o qual o teste é vinculado ao soquete UDP, ou seja, há uma conexão aberta:

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

Problemas mais graves em torno de 3 gravações no soquete aberto. Observe que isso não funciona no IPv6 e falha após cerca de 100 portas verificadas.

Portanto, embora a outra sugestão possa ser válida, não acho que isso esteja acontecendo neste caso específico.

rochoso
fonte
assim udptesté a função que estou procurando e responde à minha pergunta. A partir do link que você forneceu "* udptest () * faça algumas gravações para ver se a porta UDP está lá" #
Patrick McMahon
Sim, acabei de verificar isso e vi as gravações também. Resposta revisada.
rochoso
@PatrickMcMahon - se isso responder à sua pergunta, aceite-a clicando no visto grande.
cas
17

De fato, não. Você pode verificar fazendo:

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

Portanto, com o UDP, não é algo que você possa realmente verificar, a menos que ele retorne informações.

Sandri_Nenes
fonte
9

Há uma mensagem ICMP para sinalizar que uma porta, mesmo uma UDP, está fechada. Portanto, se um host enviar essa mensagem, presume-se que a porta esteja fechada.

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

phk
fonte
4
Observe que, como o UDP não possui conexão, você não pode distinguir com segurança uma porta aberta de uma porta com firewall de um pacote perdido.
Mark
Muito verdadeiro. E, teoricamente, também seria possível obter o pacote e a porta não estar realmente fechada.
Phk #
9

Bem, eu tenho uma opinião diferente:

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.

Portanto, com base nisso, você pode verificar se a conexão entre aeb nessa porta udp é possível. Posteriormente, você pode continuar verificando usando tcpdump.

crashoverbike
fonte
11
Ah sim, eu gosto disso. É uma boa maneira de testar se você tem acesso aos dois nós. Eu acho que quando eu estava fazendo a pergunta, estava indo em direção a "como testar uma caixa preta" ou sondando um nó externo. Os resultados de fazer exatamente isso, netcat não pode garantir.
Patrick McMahon
Você poderia expandir o endereço IP 10.12.0.12? Por que é usado nos dois computadores?
Sopalajo de Arrierez