¿Cómo enlazar con un número de puerto inferior a 1024 con acceso no raíz?

¿Por qué los primeros 1024 puertos están restringidos solo al usuario raíz?

El enlace es un paso integral para el socket del lado del servidor. Es como proporcionar alguna dirección al usuario final (servidor). Entonces, asignamos una dirección IP y un número de puerto para ejecutar un servidor. Pero no podemos proporcionar ningún número de puerto aleatorio a un servidor. Los números de puerto del 1 al 1023 están restringidos solo para usuarios root y no podemos asignar esos puertos sin tener acceso root.

La razón detrás de esta restricción es que la mayoría de los principales servicios de red como HTTP, FTP, SSH, Telnet, POP, etc. se ejecutan en este rango. Por lo tanto, si a alguien se le permite ejecutarse en esos puertos, pueden surgir las siguientes circunstancias:

  • Un usuario que no sea de confianza podría ejecutar un programa que escuchara en estos puertos los detalles de inicio de sesión (acceso).
  • Un usuario que no sea de confianza podría ejecutar una aplicación de servidor no autorizada.

El siguiente programa verifica el hecho de que los números de puerto del 1 al 1023 están restringidos para el acceso raíz.

Usamos la función bind() que devuelve 0 en caso de éxito y -1 en caso de error. Llamamos a bind en un ciclo para diferentes números de puerto hasta que devuelve 0.

// Server side C program to demonstrate
// that we can not assign port number less
// than 1024 without root access
#include<stdio.h>
#include<arpa/inet.h>
  
int main()
{
    int server = socket(AF_INET, SOCK_STREAM, 0);
    if (server < 0)
        printf("Error in server creating\n");
    else
        printf("Server Created\n");
  
    struct sockaddr_in my_addr, peer_addr;
    my_addr.sin_family = AF_INET;
    my_addr.sin_addr.s_addr = INADDR_ANY;
    my_addr.sin_addr.s_addr = inet_addr("10.32.40.213");
    int b = 1, i = 0;
    while (b)
    {
        i++;
  
        // Assigning every port number starting
        // from one to check
        // if it is able to bind properly or not
        my_addr.sin_port = htons(i);
  
        // On correct binding, it return 0
        // and so 0 in b will terminate loop
        b = bind(server, (struct sockaddr*) &my_addr,
                                    sizeof(my_addr));
    }
    printf("Binded Correctly on port number %d\n", i);
}

Producción:

Server Created
Binded Correctly on port number 1024

¿Cómo permitir que el acceso no root se enlace por debajo del número de puerto 1024?

Pero hay dos métodos mediante los cuales podemos asignar un número de puerto inferior a 1024 sin tener privilegios de root:

  1. Método 1 : usar CAP_NET_BIND_SERVICE para otorgar acceso de puerto de número bajo a un proceso:
    para esto, solo necesitamos ejecutar el siguiente comando en la terminal:
    sudo setcap CAP_NET_BIND_SERVICE=+eip /path/to/binary
  2. Método 2 : usar authbind para otorgar acceso único, con un control más preciso de usuario/grupo/puerto. Vamos a tener que asignar el número de puerto 80. Para esto, se requieren los siguientes pasos:
    • Instale authbind usando cualquier administrador de paquetes
    • Ejecute los siguientes dos comandos uno por uno en la terminal:
      sudo touch /etc/authbind/byport/80
      sudo chmod 777 /etc/authbind/byport/80

      Aquí, 80 se da al final del comando, ya que estamos intentando asignar el número de puerto 80.

    • Ahora ejecuta el siguiente comando en la terminal
      authbind --deep /path/to/binary command line args

Este artículo es una contribución de Aditya Kumar . Si le gusta GeeksforGeeks y le gustaría contribuir, también puede escribir un artículo usando contribuya.geeksforgeeks.org o envíe su artículo por correo a contribuya@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.

Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *