处于CLOSE_WAIT状态的孤立连接


30

我有一台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。


哦,我的研究表明,其他人正在'lsof -i'中看到这样的工件。我没有看到什么奇怪那里。
pboin 2011年

2
尝试sudo netstat -tonp查看正在使用哪个程序。
BillThor

1
该帖子和我的答案stackoverflow.com/a/17697733/540323将有所帮助。
Amil Waduwawara

Answers:


16

不,没有超时CLOSE_WAIT。我认为这就是off您输出中的意思。

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

请参阅如何打破CLOSE_WAIT

如果netstat是显示-在过程塔:

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

是的,在进行netstat时,我具有完全特权。我将检查内核进程的角度-这是一个好主意。我真的很沮丧,因为除了两个或三个众所周知的特权端口外,根本不应该有任何侦听套接字。也许这是一个奇怪的iptables问题。我也会检查一下。
pboin 2011年

1
链接断开。
内森2015年


10

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监听
    rpc.statd 32764 / tcp
    rpc.mountd 32765 / udp#RPC mountd
    rpc.mountd 32765 / tcp
    rpc.lockd 32766 / udp#RPC锁定/ nlockmgr
    rpc.lockd 32766 / TCP
  3. 配置状态以使用选项 --port 32763 --outgoing-port 32764
  4. 配置rpcmountd以使用该选项 --port 32765
  5. 关闭并重新启动NFS和RPC服务。

我写道,没有PID,但没有显示我的工作。我根据您的建议进行了快速编辑,谢谢。
pboin 2011年

@opboin:在不带PIDS(内核服务)的端口上添加了注释。
BillThor

3
CLOSE-WAIT表示对端已关闭其端,并且本地OS正在等待本地应用程序关闭。
user207421 '17
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.