¿Cómo reservo una lista de puertos para mis aplicaciones personalizadas?
Para ser específicos, el producto que estoy creando tiene muchos procesos y mucha intercomunicación entre ellos.
El problema que tengo es que, de vez en cuando, el sistema operativo me roba los puertos. Es raro, pero sucede.
Esto podría deberse a que una aplicación diferente ha usado ":: bind" sin ningún puerto especificado.
O, a veces, mis propias aplicaciones roban el puerto cuando llamo ":: connect" con un socket independiente. Como se ve desde la página del manual:
Si el socket no se ha vinculado a una dirección local, connect () lo vinculará a una dirección que, a menos que la familia de direcciones del socket sea AF_UNIX, sea una dirección local no utilizada.
Entonces mi pregunta es, ¿puedo reservar los puertos que necesito para que el sistema operativo no los use? ¿Se puede lograr esto con / etc / services? ¿O hay una manera diferente?
SELinux
en el modo de cumplimiento puede cumplir con sus requisitos, todavía estoy aprendiendo sobre ello. Así que sólo una suposición, tal vez usted puede definir su propia política paraSELinux
que encaje puertos suyo, tales comomy_server_port_t tcp 1111, 2222, 3333, 4444-4600
. Si su aplicación se ejecutará en todas partes (no en una aplicación de servidor), me temo que no puede controlar siSELinux
está activada o desactivada.Respuestas:
Técnicamente, no existe un "puerto reservado".
En TCP / UDP, la única forma de "reservar" un puerto es en realidad
bind()
un zócalo. Un puerto vinculado no será utilizado por otras aplicaciones; un puerto no utilizado es, bueno, no utilizado, por lo que otras aplicaciones pueden usarlo libremente.Si está escribiendo software de servidor, puede vincular sus sockets a puertos específicos tan pronto como lo desee en el código de la aplicación. Haga que los números de puerto sean configurables, o al menos indíquelos claramente en la documentación, para que un administrador de sistemas pueda identificar rápidamente conflictos y mover aplicaciones en conflicto a servidores separados.
fuente
Para garantizar que el kernel no distribuya 49000 y 49001 a los clientes, ya que desea utilizarlos para sus servidores en Linux.
déjalo caer
/etc/sysctl.conf
y luego corresysctl -p
.Tenga en cuenta que esto no se ha probado.
Referencias
fuente
/etc/services
?En realidad, la respuesta anterior no es del todo precisa. Los sysctls net.inet.ip.portrange.first y net.inet.ip.portrange.last especifican el rango de puertos que el sistema operativo puede asignar para puertos aleatorios. Debería asegurarse de que el rango de puertos reservados para su aplicación no se encuentre dentro de estas variables.
Eche un vistazo en el Manual de FreeBSD, sección: 12.14. Tuning Kernel Limits . Pero la misma premisa básica debería aplicarse también a Linux.
fuente
net.ipv4.ip_local_port_range