在设置 VPS(特别是防火墙规则)时,我遇到了本文关于使用 iptables 缓解 DDOS 攻击。我在网络上看到过这篇文章的引用,所以我尝试按照它的建议实施规则。
现在,一切都很好,直到我从“使用 Synproxy 缓解 SYN 洪水”部分添加了此规则,如下所示...
iptables -t raw -A PREROUTING -p tcp -m tcp --syn -j CT --notrack
当我添加此规则时,我立即失去了连接/联系我的服务器的能力(端口 80,SSH - 尽管当前打开的 SSH 会话保持连接)。
我尝试禁用 UFW,它似乎工作正常,所以我完全禁用了 UFW 并只设置了一些基本的 iptables 规则(我不再使用 UFW)。
我再次尝试按照文章输入规则,但仍然发生了同样的事情。
如果我只是添加上面显示的规则(而不是文章中的其他规则),那么我就不会失去连接,因此我仔细检查了每个原始规则,确定了哪一个导致了问题,这就是我发现的......
文章中的第一条规则...
iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP
... 与上面引用的规则结合使用时似乎导致了问题(请注意,我还按照建议将内核规则添加到 sysctl.conf 中)。
这是我的 iptables 规则(为了简洁起见,我省略了参考文章中的大部分规则,只使用那些似乎导致问题的规则)。
*raw
:PREROUTING ACCEPT [537:54944]
:OUTPUT ACCEPT [290:34648]
-A PREROUTING -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j CT --notrack
COMMIT
*mangle
:PREROUTING ACCEPT [580:65738]
:INPUT ACCEPT [580:65738]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [372:43208]
:POSTROUTING ACCEPT [372:43208]
-A PREROUTING -m conntrack --ctstate INVALID -j DROP
COMMIT
*filter
:INPUT DROP [15:5300]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [21:4232]
-A INPUT -s 127.0.0.0/8 ! -i lo -j REJECT --reject-with icmp-port-unreachable
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460
-A INPUT -m conntrack --ctstate INVALID -j DROP
COMMIT
大约一个星期以来,我一直在寻找为什么会发生这种情况的线索,但到目前为止没有任何进展,如果有比我更熟悉 iptables 的人可以为我解释一下或者指出正确的方向,我将不胜感激。
PS 我正在使用 Ubuntu Server 20.04