我有一些简单的规则来阻止黑客/垃圾邮件发送者频繁使用的某些IP块,例如:
iptables -A INPUT -s 173.208.250.0/24 -j DROP
但是,我注意到apache在几天后挂起,在netstat的输出中显示了许多CLOSE_WAIT,永远不会消失:
# netstat -atlpn Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 1 0 ::ffff:10.0.0.107:80 ::ffff:173.208.250.123.50813 CLOSE_WAIT 29125/httpd
这是否可以通过在规则中指定DROP目标引起? 我应该用REJECT吗?
这是否可以通过在规则中指定DROP目标引起?
没有。
我应该用REJECT吗?
没有。
在INPUT链上的该规则的DROP目标将意味着Apache永远不会看到具有该源地址的第一个SYN包或任何包。 没有build立连接,它将永远不会以CLOSE_WAIT状态结束。 请参阅下面的维基百科的状态图:

正如你所看到的,CLOSE_WAIT只发生在build立的会话之后,并且只有在客户端启动closures会话的服务器上。 通过KeepAlive,会话保持打开状态,直到客户端或服务器中的一个达到其超时并主动closures会话。
服务器达到这个超时并closures会话是很常见的,导致服务器在TIME_WAIT状态下有很多连接。 他们将默认保持这种状态2分钟,但这很less会导致问题。 TIME_WAIT连接(在Linux上)绑定IP /端口组合,但在TIME_WAIT状态下有大约30,000个连接之前,您不会耗尽这些连接。
您的规则中的源地址范围与示例中的CLOSE_WAIT状态中的IP地址不匹配。
如果由于某种原因,你不能接受他们的连接,REJECT对于有礼貌的人是礼貌的,因为它可以让他们立即closures连接,但是对于黑客/垃圾邮件制造者来说,不需要礼貌。 让他们等待他们configuration的任何超时。
那么,什么会导致CLOSE_WAIT状态的连接呢? 客户端发送FIN,服务器以FIN / ACK作为响应,然后等待最后的ACK。 如果它从来没有收到最终的ACK,那么它就会停留在那里,直到发生其他事情,例如重新启动Apache。
其他代码(例如硬件防火墙)中的连接状态跟踪不良可能会导致此问题,客户端可能会出现问题。 我不能确定是什么原因导致你的具体问题。