2021-03-01 19:19:08
“Can't assign requested address”错误通常由端口耗尽、网络配置错误或应用程序问题导致,可通过调整端口范围、复用TIME_WAIT端口、检查网络配置、排查程序代码、调整防火墙规则和ulimit限制等方法解决。 以下是具体解决方案:
检查并扩大本地端口范围
查看当前范围:通过命令cat /proc/sys/net/ipv4/ip_local_port_range查看当前本地端口范围。
临时调整:使用sysctl -w net.ipv4.ip_local_port_range="32768 60999"临时扩大范围。
永久修改:编辑/etc/sysctl.conf文件,添加net.ipv4.ip_local_port_range=32768 60999,然后执行sysctl -p使配置生效。
监控TIME_WAIT连接:使用netstat -ant | grep TIME_WAIT | wc -l或ss -ant | grep TIME_WAIT | wc -l查看TIME_WAIT状态连接数量,大量此类连接会占用端口资源。
复用TIME_WAIT端口
启用tcp_tw_reuse:允许复用处于TIME_WAIT状态的端口,通过sysctl -w net.ipv4.tcp_tw_reuse=1临时启用,或在/etc/sysctl.conf中添加net.ipv4.tcp_tw_reuse=1后执行sysctl -p永久生效。
谨慎使用tcp_tw_recycle:该参数在NAT环境下可能导致连接问题,非必要不启用。若需使用,通过sysctl -w net.ipv4.tcp_tw_recycle=1临时设置,或在/etc/sysctl.conf中添加net.ipv4.tcp_tw_recycle=1后执行sysctl -p。
检查网络配置
验证IP、子网、网关:使用ifconfig或ip addr命令检查网络接口配置,确保IP地址、子网掩码和网关设置正确。
确认应用程序绑定地址:若服务器有多个网卡,确保应用程序绑定到正确的IP地址,避免因绑定错误导致无法分配地址。
排查应用程序代码问题
检查绑定地址和端口:确认应用程序未尝试绑定到无效IP地址(如不存在的地址)或冲突端口(如多个程序绑定同一端口)。
确保端口释放:检查应用程序是否在关闭连接后正确释放端口,避免资源泄漏。
优化连接池配置:若应用程序使用连接池,检查连接超时时间是否合理,避免长时间占用端口。
检查防火墙规则
查看防火墙规则:使用iptables -L或firewall-cmd --list-all检查防火墙规则,确保允许应用程序所需端口的流量通过。
调整规则:若发现阻止规则,根据需求修改或删除相关规则。
调整ulimit限制
查看当前限制:使用ulimit -n查看进程可打开的文件数量限制。
临时修改限制:通过ulimit -n 65535临时提高限制。
永久修改限制:编辑/etc/security/limits.conf文件,添加* soft nofile 65535和* hard nofile 65535,然后重新登录或重启系统使配置生效。
监控端口使用情况
netstat -antp:显示所有TCP连接、监听端口及对应进程ID。
ss -antp:功能更强大的netstat替代工具,可更快获取信息。
lsof -i :端口号:查看占用指定端口的进程。
排查应用程序绑定地址失败原因
避免错误再次发生