Como reservo uma lista de portas para meus aplicativos personalizados?
Para ser específico, o produto que estou criando tem muitos processos e muita intercomunicação entre eles.
O problema que estou tendo é que - de vez em quando - o sistema operacional rouba minhas portas. É raro, mas acontece.
Isso pode ocorrer porque um aplicativo diferente usou ":: bind" sem porta especificada.
Ou, às vezes, meus próprios aplicativos roubam a porta quando eu chamo ":: connect" com um soquete não acoplado. Como visto na página de manual:
Se o soquete ainda não tiver sido associado a um endereço local, connect () o vinculará a um endereço que, a menos que a família de endereços do soquete seja AF_UNIX, seja um endereço local não utilizado.
Portanto, minha pergunta é: posso reservar as portas necessárias para que o sistema operacional não as use? Isso pode ser feito com / etc / services? Ou existe uma maneira diferente?
SELinux
no modo de imposição, pode atender aos seus requisitos, ainda estou aprendendo sobre isso. Assim, apenas um palpite, talvez você possa definir a sua própria política paraSELinux
a reserva portas teus, tais comomy_server_port_t tcp 1111, 2222, 3333, 4444-4600
. Se seu aplicativo for executado em qualquer lugar (não um aplicativo de servidor), receio que você não possa controlar seSELinux
está ativado ou desativado.Respostas:
Tecnicamente, não existe uma "porta reservada".
No TCP / UDP, a única maneira de "reservar" uma porta é na verdade
bind()
um soquete para ela. Uma porta vinculada não será usada por outros aplicativos; uma porta não utilizada não é utilizada, portanto outros aplicativos podem usá-la gratuitamente.Se você estiver escrevendo um software para servidor, poderá vincular seus soquetes a portas específicas o quanto antes no código do aplicativo. Torne os números de porta configuráveis ou, pelo menos, indique-os claramente na documentação, para que um administrador de sistemas possa identificar rapidamente conflitos e mover aplicativos conflitantes para servidores separados.
fonte
Para garantir que o kernel não forneça 49000 e 49001 aos clientes, como você deseja usá-los para seus servidores no linux.
deixe cair
/etc/sysctl.conf
e depois corrasysctl -p
.Observe que isso não foi testado.
Referências
fonte
/etc/services
?Na verdade, a resposta acima não é totalmente precisa. Os sysctls net.inet.ip.portrange.first e net.inet.ip.portrange.last especificam o intervalo de portas que o sistema operacional pode alocar para portas aleatórias. Você deseja garantir que o intervalo de portas reservadas para o seu aplicativo não se enquadre nessas variáveis.
Dê uma olhada no FreeBSD Handbook, seção: 12.14. Ajustando os limites do kernel . Mas a mesma premissa básica também deve se aplicar ao Linux.
fonte
net.ipv4.ip_local_port_range