2008-10-03 19 views

Respuesta

17

Normalmente, solo el superusuario (raíz) puede vincularse a puertos 'privilegiados' (es decir, los números de puerto inferiores a 1024).

Esto significa que o bien tiene que ejecutar su programa como root o hacer que su ejecutable sea 'suid root'.

Ambos tienen consecuencias para la seguridad por lo que es posible que desee considerar el uso del enfoque de suid y renunciar a los privilegios de superusuario, una vez se haya realizado la llamada bind.

+0

Los puertos 1024 y siguientes se llaman realmente "puertos con privilegios" y no "puertos seguros", todo lo que está por encima de 1024 son "puertos efímeros". Aclamaciones. – paxos1977

0

Si usted está en un sistema compartido (como una computadora de la universidad) y no la raíz, entonces no hay manera 'fácil' para conseguir ese permiso, por diseño.

4

Encontrará this tutorial muy útil en la programación de la red con C/C++. Por favor, ANSI C no tiene forma de acceder a la red. Son las bibliotecas proporcionadas por el SO (la API de socket BSD, también portada a Windows como winsock) que proporcionan esta capacidad.

+0

La guía de enchufes de Beej es lo que aprendí de la programación de tomas en la universidad, junto con generaciones de otros estudiantes de informática. Es muy bueno. Además, las obras de W. Richard Stevens son un buen tutorial en este espacio. – ConcernedOfTunbridgeWells

+0

Sí, aunque toma menos tiempo leer los tutoriales de Beej que las biblias de Stevens :-) –

0

Es tan @Charles Bailey pone ... y me gustaría añadir que esta es la razón que se utiliza para ver las direcciones del servidor HTTP en 8080 por la especificación de puerto en la URL como http://some.url: 8080/

3

puertos 1024 y por debajo de los llamados puertos privilegiados , la unión a estos puertos requiere el permiso elevada.

Los puertos de más de 1024 se llaman Emphemeral Ports. La vinculación a estos no requiere permisos especiales.

La manera más fácil de obtener acceso a puertos privilegiados es ser el usuario root.

-3

Sí, puede enlazar fácilmente al puerto 80. Use Apache. Escribe una aplicación web. Apache se une al puerto 80 y ejecuta su aplicación web.

¿Estás tratando de escribir el próximo Apache? Si es así, deberá conocer la llamada a la API setuid en su sistema operativo.

Si no está escribiendo una nueva versión de Apache, la mayoría de las personas usan un puerto no privilegiado. 8000 es popular, 8080.

0

La respuesta de S.Lott puede haber provocado reacciones muy negativas, pero su idea no es estúpida: si la pregunta original es para un programa real (no una tarea escolar), desarrollándolo como un la aplicación detrás de un servidor HTTP es a menudo una elección razonable. De esta forma, puede dejar muchos detalles de bajo nivel en un programa bueno y bien depurado, Apache.

La aplicación no tiene que ser un CGI, puede ser un módulo de Apache. Apache, de la versión 2, ya no es solo un servidor HTTP. Ahora es una plataforma para desarrollar programas de red. Escribir un módulo Apache puede ser la respuesta correcta a la pregunta original (consulte Apache documentation)

+0

Gracias. Me tomó un tiempo aprender * por qué * hay puertos privilegiados. Tiene que ver con las expectativas: esperas que el protocolo http en el puerto 80, y ya hay una buena pieza de software para manejar ese protocolo por ti. –

0

Los programas normales no pueden enlazar puertos "privilegiados", es decir, los que están por debajo de 1024.Esta es una característica de seguridad mayormente obsoleta de los sistemas operativos tipo UNIX.

Correr como superusuario, aunque sugerido por muchos otros aquí, es una mala solución a este problema. Si está ejecutando un sistema Debian o Ubuntu, le sugiero que instale el paquete authbind, que le permitirá otorgar permiso a su programa para abrir puertos con privilegios sin tener que darle a su programa ningún otro permiso especial.

Si está ejecutando en cualquier otro sistema, sugiero instalar debian o ubuntu ;-).

Cuestiones relacionadas