Como eu reservo portas para meu aplicativo?

24

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 acontecer porque um aplicativo diferente usou ":: bind" sem nenhuma 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 man:

If the socket has not already been bound to a local address, connect() shall bind it to an address which, unless the socket's address family is AF_UNIX, is an unused local address.

Então, minha pergunta é: posso reservar as portas necessárias para que o sistema operacional não as use? Isso pode ser feito com o / etc / services? Ou existe uma maneira diferente?

    
por Michael Baker 23.06.2011 / 18:16

3 respostas

12

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 é, bem, não usada para que outros aplicativos estejam livres para usá-la.

Se você estiver escrevendo software de servidor, poderá vincular seus soquetes a portas específicas, o quanto antes, no código do aplicativo. Torne os números de portas configuráveis ou, pelo menos, expresse-os claramente na documentação, para que um administrador de sistemas possa identificar rapidamente conflitos e mover aplicativos conflitantes para servidores separados.

    
por 23.06.2011 / 18:27
15

Para garantir que o kernel não forneça 49000 e 49001 aos clientes, pois você deseja usá-los para seus servidores no linux.

sysctl -w net.ipv4.ip_local_reserved_ports = 49000, 49001

solte-o em /etc/sysctl.conf e, em seguida, execute sysctl -p .

Observe que isso não foi testado.

Referências

por 24.12.2013 / 05:42
15

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 SO pode alocar para portas aleatórias. Você gostaria de ter certeza de que o intervalo de portas reservadas para seu aplicativo não se encaixa nessas variáveis.

Dê uma olhada no Manual do FreeBSD, seção: 12.14 . Ajustando Limites do Kernel . Mas a mesma premissa básica deve se aplicar ao Linux também.

    
por 15.05.2012 / 21:46

Tags