当前位置: 首页 > 科技观察

linux下监听端口被占用,如何解决?

时间:2023-03-12 13:33:58 科技观察

本文转载自微信公众号《Linux开发那些事》,作者LinuxThings。转载此文请联系Linux开发那些事公众号.不知道大家有没有遇到过这样的问题:在同一台物理机上,服务A启动时监听1端口,同时作为客户端连接服务B,连接服务B时,??a端口号将被随机分配。如果Random是2号端口。此时服务C正在启动。发现要监听的端口号已经被服务A的随机端口(端口号2)占用,导致服务C无法启动。上面的问题是服务端监听的端口被客户端的随机端口占用,导致服务端无法启动。下面就为大家介绍一下出现这种情况的原因以及解决方法。如何随机化端口号要找出问题的原因,需要了解系统是如何工作的在随机端口号的Linux下,/proc/sys/net/ipv4/ip_local_port_range定义了本地端口的范围。这个文件有两个整型参数,分别代表本地最小端口号和最大端口号。当客户端调用connect函数连接到服务器时,操作系统会从本地端口范围中随机选择一个未使用的端口作为本次连接的源端口号。如果没有可用的随机端口,连接将失败。在早期的Linux版本中,本地端口范围是从1024到5000,总共有3976个端口可用。随着网络应用的不断增加,并发连接数将达到一个新的水平,端口范围可能会不够用。因此,新的Linux版本调整了本地端口范围。下面是在Linux3.10下查看结果[root@cghost22~]#cat/proc/sys/net/ipv4/ip_local_port_range3276861000注意:1024以下的端口是系统保留端口。如果要修改ip_local_port_range中的端口,请确保它们都大于1024。如何解决问题?对于随机端口的理解和问题的分析,调整服务器启动顺序有以下解决方案。前面提到,服务A作为客户端先连接服务B,客户端的随机源端口和服务C的监听端口是重复的。导致服务C无法监听。如果是这种情况,那么调整服务启动顺序,让服务C先于服务A启动,这样可以保证服务C先监听端口,然后服务A再随机端口不会和那些一样服务C的监听端口重复使得一些服务需要先于其他服务启动,这样会增加服务之间的耦合度。在设计中,我们需要尽可能避免这样做。退一步说,即使这样做了,如果服务C稍后重启,在其重启的中途,服务A恰好正在重启新连接服务B,此时服务A的随机端口仍然有可能与服务C的监听端口重复,当该端口先被服务A使用后,服务C仍会监听失败的监听端口的修改从上面的随机端口部分可以看到,监听端口和随机端口重叠的原因是监听端口刚好在随机端口的范围内,所以随机端口有机会与监听端口相同。只要修改监听端口,使其不出现在随机端口范围内,例如:设置随机端口范围为32768-61000,然后将监听端口设置为1024-32767之间的值,这样随机端口监听端口不会重复出现。确实可以解决问题,但是修改服务的监听端口需要在与服务有逻辑关系的上下游做相应的调整。如果项目已经上线,则需要花费大量时间来完成发布和更新过程。如果项目还在开发中,可以直接修改监听端口,设置本地保留端口。该方法是将监听端口添加到本地保留端口列表中。系统在随机端口时,会过滤掉本地保留端口列表中配置的端口。不需要,服务只需要做任何改动,重启两个端口重复的服务即可,本地保留端口配置位于/proc/sys/net/ipv4/ip_local_reserved_ports,支持端口范围和单个端口号配置.各个端口号用逗号隔开,端口范围的最小值和最大值用“-”符号隔开。例如:50001,5200-5300,6001表示本地保留5001、5200到5300、6001。但是,这些端口如果直接配置/proc/sys/net/ipv4/ip_local_reserved_ports文件,重启机器后配置就会失效。如果想重启机器仍然生效,直接配置/etc/sysctl.conf。6001端口示例使用vim编辑/etc/sysctl.conf,在文件末尾添加如下行net.ipv4.ip_local_reserved_ports=5001,5200-5300,6001,然后执行sysctl-p命令重新加载/etc/sysctl.confConfigurationSummary这篇文章介绍Linux下随机端口和监听端口重复的原因和解决方法,虽然可以可以通过设置本地保留端口来解决,但这毕竟需要多做一次配置操作,而且如果服务迁移到另一台机器上或者本机上的服务使用了新的监听端口,就得在本地保留端口。因此,该方法更适用于在线应急处理。推荐的方法是修改监听端口,保证监听端口不在随机端口范围内。