Linux网络端口耗尽


10

在不深入研究内核源代码的情况下,我已经尽了最大的努力。关于该主题似乎有大量虚假信息/错误信息,所以我希望这能为我和其他人一劳永逸地回答这个问题。

严格说来IPv4,端口耗尽实际上有可能吗?让我解释:

  • 似乎有65535个端口可以使用。0不可用。
  • 我读过端口耗尽要求(src ip,src端口,dst ip,dst端口)元组是唯一的。
  • 为了清楚起见,并假设我可以通过sysctl net.ipv4.ip_local_port_range设置使用100%的临时端口

这就是问题:这是如何工作的?

  • 我可以从127.0.0.1:(x)到127.0.0.1:80有65k个连接
  • 我可以从127.0.0.1:(x)到127.0.0.1:555有65k个连接
  • 基本上再一次,问题是(srcip,srcport,dstip,dstport)必须是唯一的,对吗?
  • 我无法打开 IP“ A”到IP“ B”,端口“ N”的超过65k个连接
  • 同样,单个IP不能在xxxx:80处打开到我的Web服务器的超过65k的连接,但是,只要它们来自不同的源IP,我就可以总体支持超过65k的连接。

最后,我对正在侦听的(传出)临时端口和传入端口有些困惑。我意识到,一旦建立了连接,连接的每一端都是对等的,并且相等,但是在此之前发生了:

例如,如果确实(srcip,srcport,dstip,dstport)元组必须是唯一的,那么如果启用,为什么会这样呢?

net.ipv4.ip_local_port_range = 1024 65535

这允许使用1024-65535的临时端口,如果我有绑定在端口3306上的服务(例如,mySQL),则由于使用该端口,有时它们将无法启动。

这是否与以下事实有关:(这是我要验证的声明):

  • (srcip,srcport,dstip,dstport)对于端口范围为1-65535的每个连接都必须是唯一的(不注意操作系统对临时端口的使用)
  • 但是,对于要绑定的套接字,可以将其视为(srcip,srcport,*,*)。换一种说法,IP是否一定出于某种原因不能使用该端口?

我可以验证上述行为,即使用上面的确切sysctl行,由于这个原因,我将mySQL移到了一个低于1024的端口,因为它偶尔会非常随机地失败,因为假设操作系统正在使用该端口(3306)临时港口。


我用更多信息更新了答案。随时回答任何问题。
89c3b1b8-b1ae-11e6-b842-48d705

Answers:


8

您在这里有两个主要问题:

1。

严格说来IPv4,端口耗尽实际上有可能吗?

是。以一个负载平衡路由器为例,该路由器将所有连接发送到NAT IP地址。当您有多个SRC IP连接到单个瓶颈时,很可能会发生这种情况DST IP

这意味着您的网络服务器可能有很多连接,例如:

root@buglab:~# netstat -pnt
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 173.200.1.18:80      10.100.1.100:49923        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.200.1.200:10155        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:14400        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.10.1.10:50652        ESTABLISHED 13939/nginx: worker
tcp        0      0 173.200.1.18:80      10.20.1.20:57554        ESTABLISHED 13939/nginx: worker 

很好。但是,如果所有“外部地址”都相同,则可能会引起问题(例如“使用一个IP地址执行NAT <--->服务器的大型路由器”)。

如果我不得不假设短暂端口耗尽不是一个普遍的问题,我建议这是因为每个端口都需要侦听服务和足够的资源来响应-另一个资源(内存,cpu)通常是瓶颈。

但是,在负载平衡公司工作时,我个人遇到了一些端口耗尽问题。

2.为什么使用的端口会给侦听服务带来问题?

“这允许使用1024-65535的临时端口,如果我有绑定在端口3306(例如,mySQL)上的服务,由于使用该端口,它们有时将无法启动。”

如果使用了mySQL服务器,则无法将其绑定到该端口-例如,由localhost:3306或在所有接口上。例如,在以下netstat输出中看到0.0.0.0:80行?

root@buglab:~# netstat -lnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State      PID/Program name
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      964/php-fpm.conf)
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      1660/mysqld     
tcp        0      0 0.0.0.0:842             0.0.0.0:*               LISTEN      1317/inetd      
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      13938/nginx     

这意味着端口80正在服务器本地所有接口上监听。如果在我的nginx服务器启动之前另一个进程持有端口80 ,nginx则将无法控制该端口,并且可能会导致启动过程失败。

通常,端口3306很好,因为侦听服务具有从主机请求的预定义端口(或范围),例如,Web服务器的端口80和443。


0

我可以从127.0.0.1:(x)到657.0连接到127.0.0.1:80我可以从127.0.0.1:(x)到65k连接到127.0.0.1:555

a:是的,如果您的本地端口为1-65535,则连接数为65k-1(一个端口正在监听)

基本上再一次,问题是(srcip,srcport,dstip,dstport)必须是唯一的,对吗?答:是的

从IP“ A”到IP“ B”,端口“ N”,我最多只能打开65k个连接同样,在xxxx:80,单个IP不能打开到我的Web服务器的超过65k个连接,但是我可以支持更多只要它们来自不同的源IP,总的数量是否会超过65k?

答:单个IP不能在xxxx:80处打开到我的Web服务器的超过65k的连接,因为srcip,srcport,dstip,dstport是唯一的。是的,如果soruce ip不同,则您可以支持超过65k

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.