需要限制INPUT PSH+ACK数据包

需要限制INPUT PSH+ACK数据包

我每周都会收到几个如下所示的 HEAD 查询(我认为这是某种黑客尝试):

289 24133.787750 81.94.192.233 -> 95.85.35.251 HTTP 118 HEAD / HTTP/1.1 290 24133.987861 81.94.192.233 -> 95.85.35.251 TCP 118 [TCP Retransmission] 53341 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 291 24134.215884 81.94.192.233 -> 95.85.35.251 TCP 118 [TCP Retransmission] 53341 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 292 24134.442721 81.94.192.170 -> 95.85.35.251 TCP 118 [TCP Retransmission] 36843 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 293 24134.671833 81.94.192.233 -> 95.85.35.251 TCP 118 [TCP Retransmission] 53341 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 294 24135.583822 81.94.192.233 -> 95.85.35.251 TCP 118 [TCP Retransmission] 53341 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 295 24136.110698 81.94.192.170 -> 95.85.35.251 TCP 118 [TCP Retransmission] 36843 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 296 24137.411821 81.94.192.233 -> 95.85.35.251 TCP 118 [TCP Retransmission] 53341 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 297 24139.442873 81.94.192.170 -> 95.85.35.251 TCP 118 [TCP Retransmission] 36843 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 298 24141.063860 81.94.192.233 -> 95.85.35.251 TCP 118 [TCP Retransmission] 53341 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 299 24146.114817 81.94.192.170 -> 95.85.35.251 TCP 118 [TCP Retransmission] 36843 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 300 24148.375866 81.94.192.233 -> 95.85.35.251 TCP 118 [TCP Retransmission] 53341 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 301 24159.458755 81.94.192.170 -> 95.85.35.251 TCP 118 [TCP Retransmission] 36843 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 302 24162.983859 81.94.192.233 -> 95.85.35.251 TCP 118 [TCP Retransmission] 53341 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 303 24186.146998 81.94.192.170 -> 95.85.35.251 TCP 118 [TCP Retransmission] 36843 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 304 24192.231838 81.94.192.233 -> 95.85.35.251 TCP 118 [TCP Retransmission] 53341 → 80 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=5 305 24192.839296 95.85.35.251 -> 81.94.192.170 TCP 66 80 → 36843 [FIN, ACK] Seq=1 Ack=1 Win=14592 Len=0 306 24192.847089 81.94.192.170 -> 95.85.35.251 TCP 66 36843 → 80 [FIN, ACK] Seq=53 Ack=2 Win=29312 Len=0 307 24192.847545 95.85.35.251 -> 81.94.192.170 TCP 54 80 → 36843 [RST] Seq=2 Win=0 Len=0

我有这个 iptables 条目来删除 HEAD 请求:

iptables -A INPUT -m string --string "HEAD " --algo bm --to 300 -j DROP

它似乎没有因为随后的 [PSH, ACK] 数据包爆发而被丢弃。可能 #305 [FIN, ACK] 就是丢弃的数据包。我想要做的是停止或限制始终在 HEAD 请求之后的 [PSH, ACK] 数据包。我试过这个,但它给一些网站带来了无法访问我的网页的问题:

iptables -A INPUT -p tcp --tcp-flags ALL SYN,ACK -j DROP

我想我可以尝试这个:

iptables -A INPUT -p tcp -m multiport --dports 80,443 --tcp-flags ALL PSH,ACK -m limit --limit 10/s --limit-burst 2 -j DROP

但在设法阻止合法网页查询之前,我需要一些建议。谢谢。

答案1

HEAD 请求是完全有效的 HTTP 请求,它只返回 HTTP 标头,而不返回实际的内容主体。

除了 HEAD 请求是HTTP 标准,阻止它们以拒绝潜在攻击者获取您的 HTTP 标头信息是毫无意义的,因为他们可以同样轻松地发出 GET 请求并检索相同的信息。事实上,阻止 HEAD 请求实际上可能会增加您的带宽消耗,因为现在攻击者必须发出完整的 GET 请求,而不是低带宽的 HEAD 请求。

您看到 TCP 重传的原因在于您丢弃了 HEAD 请求而未发送任何响应。发送 HEAD 的设备认为其请求从未通过,因此它会再次尝试...一次又一次,直到连接最终超时。

正如您已经发现的那样,丢弃 SYN、ACK 数据包是一个糟糕的主意,因为这样会破坏 TCP 握手,并会阻止客户端连接到您的服务器。丢弃或限制 PSH、ACK 数据包的速率也不是一个好主意。

只要您遵循服务器上的基本安全原则,您就无需阻止对 HEAD 请求的访问,并且无论您采取什么步骤,您都将总是查看探测服务器弱点的自动访问尝试。

如果您坚持要丢弃 HEAD 请求,最好的办法是使用 TCP RST 拒绝请求,而不是默默丢弃它们。因此-j DROP,请使用而不是-j REJECT --reject-with tcp-reset。这将强制断开 TCP 连接。

相关内容