Come riservare le porte per la mia applicazione?


29

Come posso prenotare un elenco di porte per le mie applicazioni personalizzate?

Per essere precisi, il prodotto che sto creando ha molti processi e molta intercomunicazione tra di loro.

Il problema che sto riscontrando è che - ogni tanto - il sistema operativo ruba le mie porte. È raro, ma succede.

Ciò potrebbe essere dovuto al fatto che un'applicazione diversa ha utilizzato ":: bind" senza alcuna porta specificata.

O a volte le mie applicazioni rubano la porta quando chiamo ":: connect" con un socket non associato. Visto dalla pagina man:

Se il socket non è già stato associato a un indirizzo locale, connect () lo assocerà a un indirizzo che, a meno che la famiglia di indirizzi del socket non sia AF_UNIX, sia un indirizzo locale inutilizzato.

Quindi la mia domanda è: posso prenotare le porte di cui ho bisogno in modo che il sistema operativo non le usi? Questo può essere realizzato con / etc / services? O c'è un modo diverso?


1
È possibile utilizzare invece le prese AF_UNIX?
alex,

2
Sei più preoccupato perché la tua applicazione sta 'rubando porte'?
EightBitTony,

Stavo discutendo se devo passare attraverso il mio software e associare il lato client di ogni connessione a una porta specifica. È abbastanza per me aggiornare questo in quanto ci sono molti percorsi di connessione nelle mie applicazioni. Riservare le porte nel sistema operativo sarebbe stata una buona soluzione di stop gap fino a quando non avessi trovato il tempo di farlo.
Michael Baker,

Non sono sicuro che SELinuxin modalità Enforcing possa soddisfare le tue esigenze, sto ancora imparando su di esso. Quindi, solo una supposizione, forse si può definire la propria politica per SELinuxdi riserva Distinti porti, come ad esempio my_server_port_t tcp 1111, 2222, 3333, 4444-4600. Se la tua applicazione verrà eseguita ovunque (non un'applicazione server), temo che non puoi controllare se SELinuxè ON o OFF.
LiuYan 刘 研

"Rubando" presumo che intendi che l'app di terze parti è vincolante per il numero di porta scelto prima che l'applicazione abbia una possibilità, perché l'app di terze parti ha richiesto di associarsi a 0 e il sistema operativo ha assegnato casualmente il numero di porta scelto al App di terze parti. In tal caso, consultare unix.stackexchange.com/a/38724/27865
Mark Lakata,

Risposte:


14

Tecnicamente, non esiste una "porta riservata".

In TCP / UDP, l'unico modo per "riservare" una porta è in realtà bind()un socket ad essa. Una porta associata non verrà utilizzata da altre applicazioni; una porta non utilizzata è, quindi, inutilizzata, quindi altre applicazioni sono libere di usarla.

Se si sta scrivendo un software server, è possibile associare i socket a porte specifiche non appena si desidera nel codice dell'applicazione. Rendere configurabili i numeri di porta o almeno indicarli chiaramente nella documentazione, in modo che un amministratore di sistema possa identificare rapidamente gli scontri e spostare le applicazioni in conflitto su server separati.


1
Inoltre, evitare di utilizzare porte note / riservate, se possibile.
EightBitTony,

Ci sono porte riservate a volte. Questo è un buon consiglio generale ma non la risposta corretta su Linux.
Jason Newton,

18

Per garantire che il kernel non distribuisca 49000 e 49001 ai client come si desidera utilizzarli per i propri server su Linux.

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

rilasciarlo /etc/sysctl.confe quindi eseguire sysctl -p.

Si noti che questo non è testato.

Riferimenti


Ho provato questo, ma ha anche impedito alla mia stessa applicazione di usare le porte! Che ne dici di definire i numeri di porta con i nomi in /etc/services?

@ user134197 Questo non dovrebbe impedire alla propria applicazione di utilizzare tali porte se si utilizza esplicitamente un numero di porta diverso da zero nella richiesta di bind. Per me funziona.
Mark Lakata,

15

In realtà, la risposta sopra non è del tutto accurata. Sysctls net.inet.ip.portrange.first e net.inet.ip.portrange.last specificano l'intervallo di porte che il sistema operativo può allocare per porte casuali. Si desidera assicurarsi che l'intervallo di porte riservate per l'applicazione non rientri in queste variabili.

Dai un'occhiata al Manuale di FreeBSD, sezione: 12.14. Ottimizzazione dei limiti del kernel . Ma la stessa premessa di base dovrebbe valere anche per Linux.


Inoltre, questo link può essere di aiuto: stackoverflow.com/questions/913501/...
MattK

3
Penso che in Linux si chiaminet.ipv4.ip_local_port_range
Brian Gordon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.