¿Por qué la pila de red de Linux impide que los usuarios no root escuchen en puertos conocidos tcp? (0-1023)?

Una de las desventajas de ser el estándar para los sistemas operativos de servidores de red es que a veces las cosas funcionan porque así es como funcionan. Si bien la restricción de los primeros 1024 puertos puede parecer un inconveniente, la razón es doble. La primera de las razones de esto es para que las personas no usen puertos de servicio que son servicios designados para uso aleatorio, ya que CADA uno de los primeros 1024 tiene un servicio asociado que “posee” ese número de puerto. La segunda de estas razones es que reconocimos en los años 90 que el uso de un firewall de red con enmascaramiento de puertos nos permitió no solo redirigir esos puertos a cualquier puerto no privilegiado en el que se ejecute el servicio, sino también inspeccionar y filtrar el tráfico antes del punto final de servicio para despido, modelado o cualquier otra cosa que nuestros pequeños corazones negros desearan.

El hecho de que un usuario no root no pueda escuchar en estos puertos es absolutamente intencional para alentar a las personas a descubrir cómo se supone que debes ejecutar un servicio que se conecta a un puerto privilegiado de forma segura, ya que rara vez es obvio, y el los pasos no tienen mucho sentido si no te los explican. Desafortunadamente, es una de esas cosas que solo sueles aprender con la experiencia. Voy a proporcionar los pasos para asegurar adecuadamente un servicio a continuación, en caso de que no esté claro:

  1. Instale el servicio en un entorno limitado que esté configurado para ejecutarse como un usuario sin privilegios. Configure el servicio para escuchar en una interfaz de red interna (como una interfaz de bucle invertido) en el puerto Y, que es un puerto no privilegiado (superior a 1024).
  2. Modifique el guión de inicio o el guión de inicio de systemd para ejecutar la cárcel e inicie el servicio para escuchar en el puerto Y, que está por encima de 1024, y con firewall externo. (esto permite que el servicio se inicie en un entorno seguro sin ser bloqueado por el tráfico entrante).
  3. Una vez que se inician todos los servicios de red del sistema, inicialice la interfaz de red externa.
  4. Inicie el filtro / firewall local y redirija el tráfico desde la interfaz A EXTERNA en el puerto X a la interfaz INTERNA en el puerto Y, que conecta el servicio a la red.
  5. Conecte la interfaz de red externa (usando DHCP, o asignándole una IP fija).
  6. Opcionalmente notifique al equilibrador de carga que hay disponible un nuevo servidor para el servicio.
  7. Para cerrar correctamente el servicio, realice estos pasos hacia atrás (excepto el paso 1).

Me doy cuenta de que no está claramente escrito en las páginas del manual cuál es la teoría para este patrón de ejecución, pero esta es la práctica generalmente aceptada para crear servicios de red en un entorno de red DMZ. Además, es una buena práctica de seguridad de red.

Si tiene preguntas más o más específicas, me complacerá proporcionarle una aclaración.

El equipaje de la historia. Tienes toda la razón de que tiene menos sentido en los días de las máquinas Linux controladas personalmente que en los días de las máquinas Unix compartidas, pero cambiarlo ahora probablemente no causaría efectos secundarios desagradables. Linux es, sin embargo, de código abierto. Siéntete libre de ejecutar una versión personalizada si te molesta tanto.

Eso es para que los usuarios no puedan actuar como impostores de servicios bien conocidos.