内部应用的最佳TCP端口号范围

132
我在一家公司工作,我们的每个内部应用程序都在单独的Tomcat实例上运行,并使用特定的TCP端口。为了避免与服务器上的任何其他进程发生端口号冲突,最好使用哪个IANA端口范围来运行这些应用程序?
根据http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xml,目前我看到的选项如下:
1.系统端口(0-1023):我不想使用此范围内的任何端口,因为服务器可能正在运行此范围内的标准端口服务。
2.用户端口(1024-49151):考虑到这些应用程序是内部使用的,我不打算请求IANA为我们的任何应用程序保留端口号。但是,我希望减少其他进程使用相同端口的可能性,例如Oracle Net Listener使用的1521端口。
3.动态和/或私有端口(49152-65535):这个范围非常适合自定义端口号。我的唯一担忧是如果发生以下情况:
I希望您能将我的一个应用程序配置为使用X端口, 该应用程序将在几分钟或几小时内关闭(根据应用程序的性质而定),使端口在一段时间内未被使用, 操作系统将端口号X分配给另一个进程,例如当该进程充当客户端需要与另一台服务器建立TCP连接时。如果它落在动态范围内并且X在操作系统看来当前未被使用,则此过程成功, 但是,由于端口X已经被占用,该应用程序无法启动。

3
我在这里回答了一个类似的问题,链接是https://dev59.com/xXVC5IYBdhLWcg3wqzHV#38141340,你可能会发现它有帮助。 - adrianwadey
3个回答

159
我决定从IANA下载指定的端口号,过滤已使用的端口,并按可用端口数降序排序每个“未分配”范围。这种方法行不通,因为csv文件中标记为“未分配”的范围会与其他端口号预留重叠。我手动扩展了已分配端口号的范围,得到了所有已分配端口号的列表。然后,我对该列表进行排序并生成了自己的未分配范围列表。
由于此stackoverflow.com页面在我的搜索中排名很高,所以我想将最大的范围发布在这里,以供其他对此感兴趣的人参考。这些范围适用于TCP和UDP,其中范围内的端口数至少为500个。
Total   Start   End
829     29170   29998
815     38866   39680
710     41798   42507
681     43442   44122
661     46337   46997
643     35358   36000
609     36866   37474
596     38204   38799
592     33657   34248
571     30261   30831
563     41231   41793
542     21011   21552
528     28590   29117
521     14415   14935
510     26490   26999

来源(通过CSV下载按钮):

http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.xhtml

这里提供了一个CSV下载按钮,可以从上述链接中获取服务名称和端口号的列表。

“它既支持TCP又支持UDP”,例如,我可以打开所有这些端口,比如“44100-44199”,这看起来很容易记住,因为音频在UDP和TCP上都使用了44100采样率,是安全的吗?UDP 44100-44199和TCP 44100-44199都是免费的吗? - Lapsio
1
很遗憾,自从我发布后,已经有额外的预订了。现在您的范围内有一个端口。 "z-wave-tunnel 44123 tcp Z-Wave Secure Tunnel" - David Vereb
好在我不打算在开发服务器上安装Z-Wave智能家居安全系统,哈哈。以前使用的端口范围涵盖了许多重要内容,包括一些VMWare工具,所以情况更糟。如果现在只有这一个冲突,那么我就没问题了,谢谢 :) - Lapsio
3
所以我决定重新运行列表,基于更新的数据得出一组新的范围。结果发现“未分配”的范围似乎没有正确编号。例如,43124-44320被标记为未分配,然而44123却在该范围内,被列在它上面作为已分配。看来我需要手动计算未分配的范围,因为它们似乎被错误地计算了。 - David Vereb

43

我不知道你为什么会关心这个问题。除了“不要使用低于1024的端口”特权规则外,你应该可以使用任何端口,因为你的客户端应该可以配置成与任何IP地址和端口通信!

如果它们不能这样做,那么它们就没有做好。回去重新正确地完成它们吧:-)

换句话说,在 IP 地址 X 和端口 Y 上运行服务器,然后使用该信息配置客户端。然后,如果你必须在 X 上运行一个与你的 Y 冲突的不同服务器,只需重新配置你的服务器和客户端使用一个新的端口。无论你的客户端是代码还是人们在浏览器中输入 URL。

和你一样,我也不会尝试获取由 IANA 分配的数字,因为那应该是为了服务如此常见以至于许多,许多环境将使用它们(想想 SSH 或 FTP 或 TELNET)。

你的网络是你的网络,如果你想将你的服务器放在1234或甚至TELNET或FTP端口上,那是你的事情。例如,在我们的大型机开发区域,端口23用于3270终端服务器,这是一个非常不同的东西。如果你想telnet到大型机的UNIX侧,你使用端口1023。如果你在没有指定端口1023的情况下使用telnet客户端,有时会很麻烦,因为它会连接到一个不知道telnet协议的服务器-我们必须退出telnet客户端并正确地完成它:

telnet big_honking_mainframe_box.com 1023

如果你真的无法让客户端进行配置,那就选择第二个范围中的一个,比如48042,并声明任何在这些盒子上运行的其他软件(包括将来添加的任何软件)都必须避开它。


谢谢。在阅读了您的答案并经过更深入的思考后,我决定采用第二个范围内使用端口的选项。我们选择了46xxx,因为IANA目前在这个子范围中分配的端口非常少链接。我们没有选择第三个范围,因为我描述的理论上可能发生(尽管极不可能)的情况。 - Juanal

10

简短回答:使用未分配的用户端口

高级回答 - 选择并部署资源发现解决方案。让服务器动态选择一个私有端口。让客户端使用资源发现。

服务器因为要监听的端口不可用而失败的风险是很真实的;至少我曾经遇到过这种情况。另一个服务或客户端可能会抢先占用该端口。

你可以通过避免使用私有端口来几乎完全降低客户端的风险,这些端口是动态分配给客户端的。

使用用户端口则从另一个服务带来的风险最小。未分配端口的风险仅在于其他服务正在使用该端口(静态配置或动态分配)。但至少这可能是在您的控制之下。

包含用户端口在内的所有端口分配信息均在此处提供: http://www.iana.org/assignments/service-names-port-numbers/service-names-port-numbers.txt ,请查找未分配的标记。


7
在您的网络上,对于永远不会使用的协议,使用已分配的端口是否更好?未分配的端口可能随时变为已分配的端口,并给您带来问题。 - adrianwadey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接