Testando a conectividade da porta UDP

37

Estou tentando testar se posso acessar uma porta específica em um servidor remoto (ao qual tenho acesso) através do UDP.

Ambos os servidores estão voltados para a Internet. Estou usando o netcat para ter uma certa porta ouvindo.

Em seguida, uso o nmap para verificar se essa porta está aberta, mas não parece estar.

Iptables está desligado.

Alguma sugestão para que isso possa ser? Acabarei configurando um túnel VPN, mas como sou muito novo nos túneis, quero ter certeza de que tenho conectividade na porta UDP 1194 antes de avançar.

Bloquear
fonte
Respondi à pergunta "Testando a conectividade da porta UDP". Mas sugiro que me concentre na parte mais específica "certifique-se de que o OpenVPN receba meus pacotes UDP" - que pode ser facilmente alcançada observando os logs do OpenVPN.
precisa saber é o seguinte

Respostas:

46

Não existe uma porta UDP "aberta", pelo menos não no sentido que a maioria das pessoas costuma pensar (que responde a algo como "OK, aceitei sua conexão"). O UDP não possui sessão, portanto, "uma porta" (leia-se: o protocolo UDP na pilha de IPs do sistema operacional) nunca responderá "sucesso" por si próprio.

As portas UDP possuem apenas dois estados: escutando ou não. Isso geralmente se traduz em "ter um soquete aberto por um processo" ou "não ter nenhum soquete aberto". O último caso deve ser fácil de detectar, pois o sistema deve responder com um pacote de Destino Inacessível do ICMP com o código = 3 (Porta inacessível). Infelizmente, muitos firewalls podem descartar esses pacotes; portanto, se você não receber nada de volta, não terá certeza se a porta está nesse estado ou não. E não vamos esquecer que o ICMP também não tem sessão e não faz retransmissões: o pacote Port inacessível pode muito bem estar perdido em algum lugar da rede.

Uma porta UDP no estado "escutando" pode não responder de maneira alguma (o processo que escuta apenas recebe o pacote e não transmite nada) ou pode enviar algo de volta (se o processo agir na recepção e se agir por responder via UDP ao IP do remetente original: porta). Então, novamente, você nunca sabe ao certo qual é o estado se não receber nada de volta.

Você diz que pode ter o controle do host de recebimento: isso permite que você construa seu próprio protocolo para verificar a acessibilidade da porta UDP: basta colocar um processo no host de recebimento que escutará na porta UDP fornecida e responderá de volta (ou enviará você um email, ou apenas surte e unlink()tudo no sistema de arquivos host ... qualquer coisa que desperte sua atenção fará).

Luke404
fonte
Acho que estou entendendo agora. Portanto, um netstat no servidor com a porta udp de escuta nunca mostrará o host remoto ... Apenas um tcpdump deve mostrar as solicitações remotas?
Bloqueia
O netstat e o tcpdump têm a capacidade de despejar dados sobre você, este último de uma forma mais legível para humanos. Confira suas páginas de manual para obter detalhes.
precisa saber é o seguinte
56

Para testar se a porta udp está respondendo, use netcat.

Um exemplo da página do manual :

nc -v -u -z -w 3 example.host 20-30
    Send UDP packets to ports 20-30 of example.host, and report which ones
    did not respond with an ICMP packet after three seconds.

Obviamente, se um firewall estiver em uso DROP, o que normalmente ocorre quando se lida com gateways com acesso à Internet, você não recebe uma resposta ICMP.

motobói
fonte
1
Essa resposta me deu um falso positivo, onde, em contraste, a resposta de Sasha mostra o que eu espero.
texas-Bronius
@ texas-Bronius Se você tiver acesso a outro servidor, é provavelmente melhor para fazer o caminho de Sasha
motobói
27
  1. ambos no cliente e servidor instalar nc: yum install nc(para centos)
  2. na porta UDP de escuta do servidor: nc -ul 6111
  3. no cliente nc -u <server> 6111
  4. digite qualquer coisa no cliente e pressione enter - você deverá ver este texto no servidor

Nota: Quando você executa o nc -ulcomando no servidor, ele se conecta apenas à primeira conexão que chega a ele. Como eu descobri, você não pode alternar entre os servidores que executam ping sem parar e reiniciar nc -ul. De fato, se você ^ C parar o cliente ( nc -u ...), também não poderá reiniciar o cliente sem antes reiniciar o ouvinte do servidor.

Sasha
fonte
1
Eu gosto dessa resposta inteligente, porque alimenta meus próprios entendimentos (e mal-entendidos!) De como o UDP é "envie e esqueça" e toda confirmação só pode ser obtida da configuração adequada. Muitos fatores. Essa resposta fornece uma chamada e resposta realmente simples e definitivas que funcionam ou não, alteram a configuração, enxaguam e repetem.
texas-Bronius
10

Testar portas UDP abertas com o nmap é repleto de perigos - não há handshake de três vias para indicar abertura. A menos que o processo de escuta responda ao que o nmap enviar, não há como o nmap diferenciar entre uma porta aberta que não está respondendo e uma porta filtrada.

Muito mais fácil é apenas ouvir em uma extremidade o netcat e usar o netcat na outra extremidade para enviar pacotes e ver que eles chegam na outra extremidade. Faça as duas coisas apenas tenha certeza. Você também pode tcpdumpver os pacotes chegando aonde precisam ir.

mulher
fonte
Entendo ... Então, como o nmap conhece exatamente uma porta aberta? Ele envia dados para essa porta e, se receber uma resposta, é considerado aberto? Vou usar uma combinação de tcpdump e netcat. Obrigado pela sua resposta bem explicada.
Bloqueia
2

Você pode verificar portas udp usando o seguinte comando

nmap -sU -v <hostname or ip>
Koray Güclü
fonte
1

Você pode fazer isso com netcat(nc) ou iperf, supondo que você tenha outra máquina para testar fora da rede. Minha escolha seria uma nmapvarredura UDP de um sistema fora do seu ambiente. Qual foi a sua linha de comando do nmap? Existem firewalls de hardware ou outros dispositivos no mix?

ewwhite
fonte
1

Eu tenho uma abordagem simplória. Se o servidor UDP não retornar os dados esperados, simplesmente paro de coletar dgrams, assumindo que ele caiu:

LINE: while(1)
{
    my $line;
    my $flags;

    local $SIG{ALRM} = sub {die "exceeded timeout for recv"};
    alarm 5;
    eval {
        $socket->recv($line,2024,$flags);
    };

    unless($line =~ /\{.*\}/){
        if($verbose){
            print STDERR "Invalid or empty dgram:\n",'"', $line, '"',"\n";
        }

        last LINE;
    }
}
David Waddell
fonte