这是我们使用的 apache 版本 - httpd-2.2.15-39.el6.centos.x86_64
最近,我们的网站因 DoS 攻击而关闭,因此开始探索 iptables 以及如何使用它来防止 DoS 攻击。浏览了几个论坛,并有足够的规则,我现在正在尝试理解。为了限制单个 IP 的连接数量,我想了解客户端(Web 浏览器)和服务器(Web 服务器 - httpd)之间的通信。比如说,我在谷歌浏览器中点击“www.mywebsite.com”,然后开始浏览我网站的各个页面。现在,客户端和网络服务器之间有多少个连接。我尝试在我的网络服务器中运行 netstat 并进行检查。我只能看到与我的 IP(chrome 网络浏览器)建立的一个连接。总是这样吗?客户端和网络服务器之间仅建立 1 个连接,并且仅通过这一连接进行通信?此连接保持多久?
使用以下规则安全吗?
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
上述 2 条规则将完全排除以下情况的风险:某人试图从他的计算机与我的网络服务器建立如此多的连接(考虑到每分钟 10 个连接是不合法的?)?
现在,考虑以下 2 条规则
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 50/minute --limit-burst 200 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT
现在,上面的规则有什么作用?我已经在下面的问题中问过这个问题,但仍然无法全面了解这一点。
第一个规则是否说每分钟只接受 50 个连接,并且可以扩展到 200 个。一旦每分钟接受 200 个连接,在连续的分钟内,只接受 50 个连接。
关于极限爆发,它从 200 个代币开始。这意味着,假设我的网络服务器在这一分钟内收到了 200 个请求,那么令牌计数将变为 50,并且下一分钟仅接受 50 个连接。现在,第 3 分钟会发生什么,它会再次允许 200 个请求吗?与前一分钟一样,连接数<=50?我的理解对吗?
最后一条规则说了什么?在任何给定点,只能建立 50 个连接?
是否有可能因上述 2 条规则而导致合法流量被丢弃?
您是否建议使用任何其他 iptables 规则来防止 DoS 攻击以及一般情况下针对网络服务器的攻击?
答案1
客户端和网络服务器之间有多少个连接。
通常,浏览器会与网络服务器建立 6-10 个 TCP 连接。
我用 chrome 进行测试,这就是我所看到的。我通常使用端到端测试运行程序进行测试,该运行程序会快速发出请求,因此您可能需要调整您的设置或 netstat 命令 - 我通常从netstat -plunt
或类似的命令开始。
也许您看到的内容较少,因为您访问的是相同的网址并且浏览器正在缓存 - 尝试请求不同的页面。
连接能保持多久?
这是在 apache 中的指令中设置的keepalive
- 通常根据 apache 版本设置大约 5-10 秒 - 只需 grep 即可。有时,出于性能原因,其设置较低或关闭 - 但如果您是唯一管理服务器的人,那么您就会知道这一点。
如果它被调低到零,这可能是你的 netstat 命令没有获取连接的原因 - 因为它们在 netstat 报告它们之前被释放。
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 50/分钟 --limit-burst 200 -j ACCEPT
首先这条规则追加- 到现有规则集的末尾,这意味着如果在其之前有任何其他规则匹配,则甚至不会考虑该规则。
它来自 netfilter limit 模块,该模块使用令牌桶概念进行数学计算。在这种情况下,200个令牌被放入桶中,规则将匹配,直到所有令牌被消耗——即桶被清空。
但水桶正以每分钟50个的速度不断补充。
所以基本的想法是说你想要匹配平均每分钟 50 次 - 并且您希望全天继续每分钟匹配 50 个请求。
那么,如果有人突然发出 120 个请求,但在接下来的 3 分钟内没有发出任何请求,该怎么办?从技术上讲,它们在您的定义范围内每分钟 50 次 - 平均。
所以你需要在桶里放一些额外的令牌来解决这个问题。
欲了解更多信息,请参阅网络过滤器文档
答案2
为了防止 DoS 攻击,您必须深入研究网络层。搜索“DoS 攻击 Linux”,查阅适用于您的发行版的网络指南。大多数缓解措施都是使用 iptables 限制流量。
答案3
优化指令MaxRequestWorkers
定义资源耗尽的最大并发连接数。另请参阅Apache 性能调优
用一个米米模块线程允许您利用同时连接的优势,从而最大限度地减少拒绝服务攻击。将来,mpm Module 事件将使用异步处理,以便不再为每个连接分配一个线程。根据 OpenSSL 库的性质,mpm 模块事件当前与模块 mod_ssl 和其他输入过滤器不兼容。在这些情况下,它们的行为被简化为模块 mpm worker 的行为。
有许多第三方模块可用Apache 模块列表这可以缩小某些客户的行为并最大程度地减少 DoS 问题。