如何通过 iptables 阻止 FIN-WAIT-2?

如何通过 iptables 阻止 FIN-WAIT-2?

我的网站现在遭受了 ddos​​ 攻击,“ss -ant”显示很多FIN-WAIT-2(还有一些FIN-WAIT-1)来自一个IP(和随机端口)的连接,大约500-700个连接:

FIN-WAIT-2 0      0         ::ffff:MY_IP:443                 ::ffff:ATTACKERS_IP:RANDOM_PORT   
.... 500-700 times

我正在尝试使用

iptables -A INPUT -s ATTACKERS_IP -j DROP

iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,RST RST -m limit --limit 1/s -j ACCEPT

echo "2" > /proc/sys/net/ipv4/tcp_fin_timeout

但它没有帮助——新的连接通过另一个随机端口进入。

那么,如何通过 iptables(或者其他方法)彻底阻止特定 IP,以防止 FIN-WAIT-2 泛洪导致服务器冻结?

答案1

正如所解释的那样https://benohead.com/blog/2013/07/21/tcp-about-fin_wait_2-time_wait-and-close_wait/(见下文)

TCP fin-wait1 和 finwait2 是从正常 TCP 关闭中关闭的连接。它们会停留一个称为 2 MSL(最大段寿命)的计时器,在具有默认配置的服务器上,该计时器通常为 4 分钟。它们本身并没有危害,但如果有很多,则表明服务器上存在大量连接流失。这可能是由于 DDOS 攻击,或网站问题(例如关闭 http keepalives)。通常,DDOS 攻击不会关闭套接字,而是将其挂起。

如果有一个 IP 对您造成压力,那么删除该 IP 是最好的方法,最好在防火墙或上游路由器上删除该 IP,以减轻系统负载。

Fin-wait1 是主动关闭(四次握手)的第一步。本地端点已向远程端点发送连接终止请求。

您的规则看起来正确,在它之前是否还有其他允许该规则应阻止的连接?您可以使用以下方式检查规则列表和计数器

iptables -nvL --line-numbers
iptables -t raw -nvL --line-numbers

我会改变规则,使用 PREROUTING 链来尽早删除它们

iptables -A PREROUTING -s ATTACKERS_IP -j DROP

您可以通过修改 sysctl 变量来更快地清理 timw_waits。不知道您的设置,我只建议这两个在 10 秒内关闭,如果需要,重新使用处于 timewait 状态且未超时的套接字

sudo sysctl -w net.ipv4.tcp_fin_timeout=10
sudo sysctl -w net.ipv4.tcp_tw_reuse=1

希望有帮助

FIN-WAIT-1:已执行主动关闭(四次握手)的第一步。本地端点已向远程端点发送连接终止请求。

FIN-WAIT-2:远端端点已发送对先前发送的连接终止请求的确认。本地端点等待来自远端端点的主动连接终止请求

相关内容