处于 CLOSE_WAIT 状态的孤立连接

pbo*_*oin 32 linux networking tcp

我有一台 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  -     
Run Code Online (Sandbox Code Playgroud)

当涉及到 TCP 堆栈或内核网络时,我不是黑带,但 TCP 配置似乎很合理,因为根据手册页,这些值是默认值:

# cat /proc/sys/net/ipv4/tcp_fin_timeout 
60
# cat /proc/sys/net/ipv4/tcp_keepalive_time 
7200
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*kel 19

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

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

请参阅如何打破 CLOSE_WAIT

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

  • 您是否以适当的权限和能力运行(例如作为 root)?
  • 它们可能是内核进程(例如 nfsd)


Bil*_*hor 10

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

netstat -tonp 2>&1 | grep CLOSE
Run Code Online (Sandbox Code Playgroud)

确定哪些程序持有连接。

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

netstat -lntp 2>&1 | grep -- -  
Run Code Online (Sandbox Code Playgroud)

除非 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 lockd/nlockmgr
    rpc.lockd 32766/tcp
  3. 配置 statd 以使用选项 --port 32763 --outgoing-port 32764
  4. 配置 rpcmountd 以使用该选项 --port 32765
  5. 关闭并重新启动 NFS 和 RPC 服务。

  • CLOSE-WAIT 意味着 *peer* 已经结束,本地操作系统正在等待本地应用程序关闭。 (4认同)