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?

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.


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.


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


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.


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.