Como reservo portas para o meu aplicativo?

29

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?

Michael Baker
fonte
1
Você pode usar soquetes AF_UNIX?
23411 alex
2
Mais preocupado por que seu próprio aplicativo está 'roubando portas'?
precisa
Eu estava debatendo se precisava passar pelo meu software e vincular o lado do cliente de cada conexão a uma porta específica. É o trabalho para mim atualizar isso, pois há muitos caminhos de conexão em meus aplicativos. A reserva de portas no sistema operacional teria sido uma boa solução de interrupção até encontrar tempo para fazer isso.
Michael Baker
Não tenho certeza se, SELinuxno 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 para SELinuxa reserva portas teus, tais como my_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 se SELinuxestá ativado ou desativado.
LiuYan
Ao "roubar", presumo que você queira dizer que o aplicativo de terceiros está vinculado ao número da porta escolhido antes que você tenha uma chance, porque o aplicativo de terceiros solicitou a vinculação a 0 e o sistema operacional atribuiu aleatoriamente o número da porta escolhido ao Aplicativo de terceiros. Em caso afirmativo, consulte unix.stackexchange.com/a/38724/27865
Mark Lakata

Respostas:

14

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.

Riccardo Murri
fonte
1
Além disso, evite usar portas conhecidas / reservadas, se possível.
EightBitTony
Às vezes, há portas reservadas. Este é um bom conselho geral, mas não a resposta correta no Linux.
Jason Newton
18

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

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

deixe cair /etc/sysctl.conf e depois corra sysctl -p.

Observe que isso não foi testado.

Referências

Hal Ashburner
fonte
Eu tentei isso, mas também impediu que meu próprio aplicativo usasse as portas! Que tal definir os números de porta com nomes /etc/services?
@ user134197 Isso não deve impedir que seu próprio aplicativo use essas portas se você usar explicitamente um número de porta diferente de zero em sua solicitação de ligação. Funciona para mim.
Mark Lakata
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 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.

MattK
fonte
Além disso, este link pode ser útil: stackoverflow.com/questions/913501/…
MattK 15/05
3
Eu acho que no Linux é chamadonet.ipv4.ip_local_port_range
Brian Gordon