如何为应用程序保留端口?


29

如何为自定义应用程序保留端口列表?

具体来说,我正在创建的产品具有很多流程,并且它们之间有很多相互联系。

我遇到的问题是-操作系统偶尔会窃取我的端口。很少见,但确实如此。

这可能是因为其他应用程序使用了“ :: bind”,但未指定端口。

有时,当我使用未绑定的套接字调用“ :: connect”时,我自己的应用程序会盗用该端口。从手册页可以看出:

如果套接字尚未绑定到本地地址,则connect()应将其绑定到一个地址,除非该套接字的地址族为AF_UNIX,否则为未使用的本地地址。

所以我的问题是,我可以保留我需要的端口以便操作系统不使用它们吗?可以用/ etc / services完成吗?还是有其他方法?


1
您可以改用AF_UNIX套接字吗?
亚历克斯

2
更担心为什么您自己的应用程序是“窃取端口”?
SevenBitTony11年

我正在辩论是否需要浏览我的软件并将每个连接的客户端绑定到特定端口。因为我的应用程序中有很多连接路径,所以更新它是我的工作。在我没有时间之前,在OS中保留端口将是一个很好的解决方案。
Michael Baker

我不确定SELinux执行模式是否可以满足您的要求,我仍在学习中。所以只是猜测,也许你可以定义自己的策略SELinux,以储备你的端口,比如my_server_port_t tcp 1111, 2222, 3333, 4444-4600。如果您的应用程序可以在任何地方运行(而不是服务器应用程序),那么恐怕您无法控制SELinuxON或OFF。
LiuYan刘研

通过“窃取”,我假设您的意思是第三方应用已在您获得应用机会之前绑定到您选择的端口号,因为第三方应用已请求绑定到0,并且操作系统已将您选择的端口号随机分配给了第三方应用程序。如果是这样,请参阅unix.stackexchange.com/a/38724/27865
Mark Lakata 2015年

Answers:


14

从技术上讲,没有“保留端口”之类的东西。

在TCP / UDP中,“保留”端口的唯一方法是实际bind()使用套接字。绑定的端口将不会被其他应用程序使用。一个未使用的端口是未使用的,因此其他应用程序可以自由使用它。

如果要编写服务器软件,则可以尽早在应用程序代码中将套接字绑定到特定端口。使端口号可配置,或者至少在文档中清楚地声明它们,以便系统管理员可以快速识别冲突并将冲突的应用程序移至单独的服务器。


1
另外,请尽可能避免使用众所周知的/保留的端口。
NovemberBitTony 2011年

有时有保留端口。这是很好的一般建议,但在Linux上不是正确的答案。
杰森·牛顿

18

为了确保内核不会将49000和49001分配给客户端,因为您希望将其用于Linux上的服务器。

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

将其放入/etc/sysctl.conf,然后运行sysctl -p

请注意,这未经测试。

参考文献


我尝试了此操作,但是它也阻止了我自己的应用程序使用端口!如何用in定义端口号/etc/services

@ user134197如果您在绑定请求中明确使用非零端口号,则这不会阻止您自己的应用程序使用这些端口。这个对我有用。
Mark Lakata 2015年

15

实际上,以上答案并不完全正确。sysctls net.inet.ip.portrange.first和net.inet.ip.portrange.last指定操作系统可以为随机端口分配的端口范围。您可能要确保为应用程序保留的端口范围不在这些变量之内。

看一下FreeBSD手册的第12.14调整内核限制。但是同样的基本前提也应该适用于Linux。


此外,这个环节可能是帮助: stackoverflow.com/questions/913501/...
MattK

3
我认为在Linux中,它称为net.ipv4.ip_local_port_range
Brian Gordon
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.