it-swarm.cn

处于CLOSE_WAIT状态的孤立连接

我有一台SLES机器,它在CLOSE_WAIT状态下累积TCP)连接,似乎永远存在。这些描述符最终占用了所有可用的内存。目前,我有3037个它们,但是在最近重新启动之前要高得多。

有趣的是,它们不是从连接到我希望具有侦听进程的本地端口。它们没有关联的PID,并且它们的计时器似乎已过期。

# netstat -ton | grep CLOSE_WAIT
tcp      176      0 10.0.0.60:54882     10.0.0.12:31663      CLOSE_WAIT  off (0.00/0/0)
tcp       54      0 10.0.0.60:60957     10.0.0.12:4503       CLOSE_WAIT  off (0.00/0/0)
tcp       89      0 10.0.0.60:50959     10.0.0.12:3518       CLOSE_WAIT  off (0.00/0/0)

# netstat -tonp | grep CLOSE_WAIT
tcp       89      0 10.0.0.59:45598     10.0.0.12:1998       CLOSE_WAIT  -                   
tcp       15      0 10.0.0.59:60861     10.0.0.12:1938       CLOSE_WAIT  -                   
tcp        5      0 10.0.0.59:56173     10.0.0.12:1700       CLOSE_WAIT  -     

对于TCP堆栈或内核网络,但我不是一个黑带,但是TCP配置似乎是明智的,因为这些值是默认值,根据手册页:

# cat /proc/sys/net/ipv4/tcp_fin_timeout 
60
# cat /proc/sys/net/ipv4/tcp_keepalive_time 
7200

那有什么呢?如果计时器已过期,堆栈不应该自动清除这些东西吗?随着这些事情的累积,我正在有效地给自己一个长期的DoS。

30
pboin

不,CLOSE_WAIT没有超时。我认为这就是off在输出中的含义。

要退出CLOSE_WAIT,应用程序必须显式关闭套接字(或退出)。

请参阅 如何打破CLOSE_WAIT

如果netstat在处理列中显示-

  • 您是否以适当的特权和功能(例如,以root身份)运行?
  • 它们可能是内核进程(例如nfsd)
16
Mikel

CLOSE_WAIT表示客户端正在关闭连接,但应用程序尚未关闭连接,或者客户端尚未关闭连接。您应该确定哪个程序有此问题。尝试使用

netstat -tonp 2>&1 | grep CLOSE

确定哪些程序可以保存连接。

如果没有列出程序,则该服务由内核提供。这些可能是RPC服务,例如nfsrpc.lockd。侦听内核服务可以用

netstat -lntp 2>&1 | grep -- -  

除非RPC服务已绑定到固定端口,否则它们将绑定到临时端口,如您的连接所示。您可能还需要检查其他服务器上的进程和安装。

通过执行以下操作,您可以将NFS服务绑定到固定端口:

  1. 为NFS选择四个未使用的端口(此处使用32763-32766)
  2. 将NFS的固定端口添加到/etc/services
    rpc.statd-bc 32763/udp#RCP statd广播
     rpc.statd-bc 32763/tcp 
     rpc.statd 32764/udp#RCP statd listen 
     rpc.statd 32764/tcp 
     rpc.mountd 32765/udp#RPC mountd 
     rpc.mountd 32765/tcp 
     rpc.lockd 32766/udp#RPC lockd/nlockmgr 
     rpc.lockd 32766 /台
  3. 将statd配置为使用选项--port 32763 --outgoing-port 32764
  4. 配置rpcmountd以使用选项--port 32765
  5. 关闭并重新启动NFS和RPC服务。
10
BillThor