![Linux:防止传出 TCP 洪水](https://linux22.com/image/598899/Linux%EF%BC%9A%E9%98%B2%E6%AD%A2%E4%BC%A0%E5%87%BA%20TCP%20%E6%B4%AA%E6%B0%B4.png)
我在负载均衡器后面运行着数百个 Web 服务器,托管着许多不同的网站和大量应用程序(我无法控制)。大约每个月,其中一个网站就会被黑客入侵,然后会上传一个洪水脚本来攻击某个银行或政治机构。过去,这些洪水攻击总是 UDP 洪水,通过在单个 Web 服务器上阻止传出的 UDP 流量可以有效解决。昨天,他们开始从我们的服务器使用许多到端口 80 的 TCP 连接来洪水攻击一家大型美国银行。由于这些类型的连接对我们的应用程序完全有效,因此仅仅阻止它们并不是一个可接受的解决方案。
我正在考虑以下替代方案。您会推荐哪一个?您是否实施了这些方案?如何实施的?
- 限制 Web 服务器 (iptables) 发出的源端口为 != 80 的 TCP 数据包
- 相同,但使用排队 (tc)
- 限制每个服务器每个用户的出站流量。这是一个相当大的管理负担,因为每个应用服务器可能有 1000 个不同的用户。可能是这样的:我如何限制每个用户的带宽?
- 还要别的吗?
当然,我也在寻找方法来尽量减少黑客进入我们托管的网站的机会,但由于这种机制永远不可能 100% 防水,所以我想严格限制入侵的影响。
更新:我目前正在测试这些规则,这些规则本来可以阻止这种特定的攻击。您建议如何使它们更通用?当我仅对 SYN 数据包进行速率限制时,我是否会错过已知的 TCP DoS 攻击?
iptables -A OUTPUT -p tcp --syn -m limit --limit 100/min -j ACCEPT
iptables -A OUTPUT -p tcp --syn -m limit --limit 1000/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
iptables -A OUTPUT -p tcp --syn -j REJECT --reject-with tcp-reset
干杯!
答案1
我认为最好的解决方案和对我而言非常有效的解决方案是限制目标 IP 的连接/数据包数量。将限制设置为合理的速率将阻止攻击者向目标发送大量连接。设置端口和协议不是一个好主意,因为如果攻击者今天发送 http 洪水攻击,明天他将使用不同类型的攻击。因此,限制每个 IP 的连接数通常是解决您问题的方法。
希望对您有帮助:)
答案2
我始终坚持的立场是,Web 服务器根本不应该建立出站 TCP 连接 - 仅作为响应入站请求的服务器发送流量。(我还允许 Web 服务器和 SSH 仅使用入站 TCP。)(与此相关,我还认为 Web 服务器永远不是发送邮件的合适主机。)这不仅可以防止出站攻击 - 还可以为对您的系统的攻击增加一些难度(黑客无法获取 xterm 窗口或将他们的工具包 wget 到您的主机)。