Pergunta sobre udp, network-programming, port-scanning, port, c++ – Verificando a porta UDP aberta em C ++

5

Como posso verificar se uma porta UDP remota está aberta usando o C ++ nativo? Como o UDP é sem conexão, chamarconnect() não é útil. Eu não posso tentar vinculá-lo, pois não é local.nmap também não pode indicar. (Contudonetstat pode descobrir, mas acho que se olha para informações internas sobre portas / arquivos abertos). Existe alguma maneira de detectá-lo? Se eu passar uma camada para baixo no nível da rede, é possível enviar uma mensagem ICMP por C ++ para verificar o status de porta inacessível? Quer dizer, isso daria informações suficientes sobre o status da porta?

Plataforma é Linux.

Está na plataforma Linux Mustafa
@STATUS_ACCESS_DENIED Nada disso tem nada a ver com uma porta remota. user207421
@STATUS_ACCESS_DENIED Essa questão também é irrelevante. Ele está falando sobre o status de uma porta remota. Privilégios no sistema local não têm nada a ver com isso. Ele precisa se comunicar com o sistema remoto e não precisa de privilégios para fazer isso. user207421
@ EJP: oh? Por favor, me explique por que certas operações de soquete são permitidas apenas para usuários privilegiados?traceroute por exemplo, é limitado em alguns sistemas por essa mesma razão. Estou genuinamente curiosa. 0xC0000022L

Sua resposta

2   a resposta
5

Eu suponho que você está tentando determinar se uma porta UDP em uma máquina remota está sendo passada ou não por um firewall e / ou tem um aplicativo em execução nela.

Você não pode determinar isso com segurança. O mais próximo que você pode chegar é tentar enviar uma série de pequenos datagramas para esse endereço e porta, espaçados por aproximadamente 1 segundo entre 10 segundos.

Se não houver firewalls bloqueando a porta e nenhum aplicativo estiver em execução, o sistema remoto poderá enviar de voltaICMP_UNREACH_PORT (porta inacessível). Se não houver firewalls de bloqueio e o sistema remoto estiver inoperante, um roteador poderá enviar de voltaICMP_UNREACH_HOST ouICMP_UNREACH_NET. Se um firewall está bloqueando você, ele pode enviar de voltaICMP_UNREACH_FILTER_PROHIB, mas a maioria dos firewalls não envia de volta nada.

As chances de conseguir qualquer um desses itens são muito pequenas, porque a maioria dos firewalls bloqueia esse tipo de feedback de ICMP. Mesmo que uma mensagem ICMP retorne, o Linux geralmente não permite que você a veja, a menos que você esteja executando como root. Alguns sistemas operacionais reportarão erros de ICMP como uma falha da próximasendto() para o mesmo endereço / porta, e é por isso que você precisa repetir a mensagem várias vezes. Mas alguns não, caso em que você deve abrir uma porta ICMP específica e analisar as mensagens de retorno.

Mesmo se você de alguma forma receber uma mensagem ICMP, entenda que eles não são confiáveis. Por exemplo, você pode obterICMP_UNREACH_PORT mesmo que um aplicativo não esteja apenas ouvindo, mas ativamente enviando dados para você. (Isso é raro, mas eu já vi isso acontecer.)

Se um aplicativo estiver sendo executado na porta especificada e se você souber o que é esse aplicativo e souber criar uma mensagem que faça com que esse aplicativo responda a você, faça isso e obtenha uma resposta é a melhor indicação de que a porta está aberto. Mas não obter resposta significa nada: talvez a porta esteja bloqueada, talvez o aplicativo não esteja em execução ou talvez não tenha gostado da sua mensagem.

Resumindo: não, não realmente.

0

Não há uma maneira à prova de balas para verificar se uma porta remota está pronta para receber seus datagramas UDP. Como o UDP é sem conexão, você pode apenas dizer se o host remoto está respondendo a algo significativo para você. Pode haver maneiras de obter uma dica (como fazem os scanners de portas), mas isso não é nada em que eu confiaria no código de produção.

Perguntas relacionadas