我的一台服务器遭受了 DOS 攻击 - 状态下有大量连接CLOSE_WAIT
阻止合法用户连接到系统。
那么,有没有办法在CLOSE_WAIT
不终止底层服务器进程的情况下关闭连接?终止进程会导致停机,而这正是我想要避免的。
还有其他方法吗?
答案1
据我所知,如果不终止进程,就无法关闭 CLOSE_WAT 连接。
也许您可以使用 iptables 及其最新的模块来阻止在短时间内对同一 TCP 服务器端口和同一 IP 的多次连接尝试。
这里有一个例子(将 eth0 更改为您的网络接口或直接将其删除):
iptables -N LOGDOS
iptables -A LOGDOS -m limit --limit 5/minute --limit-burst 5 -j ULOG --ulog-nlgroup 1 --ulog-prefix "LOGDOS" --ulog-cprange 0 --ulog-qthreshold 1
iptables -A LOGDOS -j DROP
iptables -A INPUT -i eth0 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 27015 -m state --state NEW -m recent --set --name cssdos
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 27015 -m state --state NEW -m recent --update --name cssdos --seconds 60 --hitcount 4 -j LOGDOS
iptables -A INPUT -i eth0 -p tcp -m state --state NEW -m tcp --dport 27015 -j ACCEPT
简短解释:
- 前 3 行将由 ulogd 使用。它使我们能够记录丢弃的流量。我们正在创建一个名为 LOGDOS 的新 iptables 链。
- 第四行接受已建立的连接。
- 第五行将被最近的模块用来跟踪新的连接。
- 第 6 行将由最近模块使用。如果在 60 秒内有来自同一 IP 的新连接超过 3 个,它将被发送到 LOGDOS 链。
- LOGDOS 链将使用 ulogd 守护进程来写入日志(例如在 /var/log/ulog/syslogemu.log 中,这完全取决于 ulog 配置),并且默认情况下它将断开连接。
希望这对你有用。