Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

How do I reserve a list of ports for my custom applications?

To be specific, the product I'm creating has a lot of processes and a lot of intercommunication between them.

The problem I'm having is that - every once in a while - the OS steals my ports. It's rare, but it happens.

This could be because a different application has used "::bind" with no port specified.

Or sometimes my own applications steal the port when I call "::connect" with an unbound socket. As seen from the man page:

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.

So my question is, can I reserve the ports that I need so the OS doesn't use them? Can this be accomplished with /etc/services? Or is there a different way?

share|improve this question
1  
Can you use AF_UNIX sockets instead? –  alex Jun 23 '11 at 16:46
1  
More worried why your own application is 'stealing ports'? –  EightBitTony Jun 23 '11 at 17:04
    
I was debating if I need to go through my software and bind the client side of each connection to a specific port. It's quite the job for me to update this as there are a lot of connection paths in my applications. Reserving ports in the OS would have been a good stop gap solution until I found time to do this. –  Michael Baker Jun 23 '11 at 21:31
    
I'm not sure if SELinux in Enforcing mode can meet your requirement, I'm still learning on it. So just a guess, maybe you can define your own policy for SELinux to reserve yours ports, such as my_server_port_t tcp 1111, 2222, 3333, 4444-4600. If your application will run everywhere (not a server application), I'm afraid you can't control whether SELinux is ON or OFF. –  LiuYan 刘研 Jun 24 '11 at 1:58

3 Answers 3

up vote 7 down vote accepted

Technically, there's no such thing as a "reserved port".

In TCP/UDP, the only way to "reserve" a port is to actually bind() a socket to it. A bound port will not be used by other applications; an unused port is, well, unused so other applications are free to use it.

If you are writing server software, then you can bind your sockets to specific ports as early as you want in the application code. Make the port numbers configurable, or at least clearly state them in the documentation, so that a systems administrator can quickly identify clashes and move conflicting applications to separate servers.

share|improve this answer
1  
Also, avoid using well known/reserved ports if at all possible. –  EightBitTony Jun 23 '11 at 17:03

Actually, the above answer is not entirely accurate. The sysctls net.inet.ip.portrange.first and net.inet.ip.portrange.last specify the range of ports the OS can allocate for random ports. You would want to make sure that the range of reserved ports for your application does not fall within these variables.

Take a look in the FreeBSD Handbook, section: 12.14. Tuning Kernel Limits. But the same basic premise should apply to Linux as well.

share|improve this answer
    
Also, this link may be of assistance: stackoverflow.com/questions/913501/… –  MattK May 15 '12 at 19:51

To ensure the kernel won't give out 49000 and 49001 to clients as you wish to use them for your servers on linux.

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

drop it in /etc/sysctl.conf, and then run sysctl -p.

Note that this is untested.

References

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.