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

Mic*_*ker 33 tcp udp socket

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

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

我遇到的问题是——每隔一段时间——操作系统就会窃取我的端口。这是罕见的,但它发生了。

这可能是因为不同的应用程序使用了未指定端口的“::bind”。

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

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

所以我的问题是,我可以保留我需要的端口以便操作系统不使用它们吗?这可以通过 /etc/services 完成吗?或者有不同的方法吗?

小智 26

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

sysctl -w net.ipv4.ip_local_reserved_ports = 49000, 49001
Run Code Online (Sandbox Code Playgroud)

把它放进去/etc/sysctl.conf,然后运行sysctl -p

请注意,这是未经测试的。

参考


Ric*_*rri 16

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

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

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


小智 15

其实,上面的回答并不完全准确。sysctls net.inet.ip.portrange.first 和 net.inet.ip.portrange.last 指定操作系统可以为随机端口分配的端口范围。您可能希望确保应用程序的保留端口范围不属于这些变量。

请查看 FreeBSD 手册的第12.14调整内核限制。但同样的基本前提也适用于 Linux。

  • 我认为在 Linux 中它被称为 `net.ipv4.ip_local_port_range` (4认同)