Pregunta sobre udp, port-scanning, c++, network-programming, port – Comprobando el puerto UDP abierto en C ++

5

¿Cómo puedo verificar si un puerto UDP remoto está abierto usando C ++ nativo? Dado que UDP no tiene conexión, las llamadasconnect() no es de ayuda No puedo intentar enlazarlo ya que no es local.nmap no puede también indicar. (sin embargonetstat puede averiguarlo, pero creo que mira información interna sobre puertos / archivos abiertos). ¿Hay alguna forma de detectarlo? Si desciendo una capa en el nivel de la red, ¿es posible enviar un mensaje ICMP por C ++ para verificar el estado de puerto inaccesible? Quiero decir, ¿eso daría suficiente información sobre el estado del puerto?

La plataforma es Linux.

@EJP: oh? Por favor, explícame por qué ciertas operaciones de socket solo están permitidas para usuarios privilegiados.traceroute por ejemplo, está limitado en algunos sistemas por esa misma razón. Soy genuinamente curioso. 0xC0000022L
@STATUS_ACCESS_DENIED Nada de esto tiene nada que ver con un puerto remoto. user207421
@STATUS_ACCESS_DENIED Esa pregunta también es irrelevante. Él está hablando sobre el estado de un puerto remoto. Los privilegios en el sistema local no tienen nada que ver con eso. Necesita comunicarse con el sistema remoto y no necesita privilegios para hacerlo. user207421
(sobrenmapes lo suficientemente bajo. Básicamente, utiliza ciertas heurísticas para clasificar si el comportamiento observado significa que un puerto está abierto o no. Pero debido a que este nivel es tan bajo, se requieren derechos de superusuario. 0xC0000022L

Tu respuesta

2   la respuesta
0

No hay una manera a prueba de balas para verificar si un puerto remoto está listo para recibir sus datagramas UDP. Ya que UDP no tiene conexión, puedes decir si el host remoto te está respondiendo algo significativo. Puede haber formas de obtener una pista (como lo hacen los escáneres de puertos), pero eso no es algo en lo que pueda confiar en el código de producción.

5

remota se está pasando a través de un firewall o si tiene una aplicación ejecutándose.

Usted no puede determinar esto de manera confiable. Lo más cerca que puede llegar es intentar enviar una serie de pequeños datagramas a esa dirección y puerto, separados aproximadamente 1 segundo durante aproximadamente 10 segundos.

Si no hay firewalls bloqueando el puerto y ninguna aplicación se está ejecutando, entonces el sistema remoto podría enviarICMP_UNREACH_PORT (puerto inalcanzable). Si no hay ningún cortafuegos de bloqueo y el sistema remoto está inactivo, es posible que un enrutador envíe de vueltaICMP_UNREACH_HOST oICMP_UNREACH_NET. Si un firewall te está bloqueando, podría enviarlo de vuelta.ICMP_UNREACH_FILTER_PROHIB, pero la mayoría de los cortafuegos no devuelven nada.

Las probabilidades de recuperar alguno de estos son bastante escasas porque la mayoría de los firewalls bloquean ese tipo de comentarios ICMP. Incluso si un mensaje ICMP vuelve, linux generalmente no te deja verlo a menos que estés ejecutando como root. Algunos sistemas operativos informarán los errores ICMP como una falla de la próximasendto() a la misma dirección / puerto, por lo que debe repetir el mensaje varias veces. Pero algunos no lo hacen, en cuyo caso debe abrir un puerto ICMP específico y analizar los mensajes de retorno.

Incluso si de alguna manera recibe un mensaje ICMP, entienda que no son confiables. Por ejemplo, usted podría obtenerICMP_UNREACH_PORT aunque una aplicación no solo está escuchando, sino que también le está enviando datos activamente. (Eso es raro, pero lo he visto suceder.)

Si una aplicación se está ejecutando en el puerto dado y si sabe qué es esa aplicación y si sabe cómo crear un mensaje que hará que esa aplicación le responda, entonces hacerlo y obtener una respuesta es la mejor indicación de que el puerto Esta abierto. Pero no obtener respuesta no significa nada: tal vez el puerto esté bloqueado, tal vez la aplicación no se esté ejecutando, o tal vez simplemente no le haya gustado su mensaje.

En pocas palabras: no, en realidad no.

Preguntas relacionadas