我希望更新我们的网络服务器中的 iptables,这将在一定程度上防止 DoS 攻击。
1)与网络流量相关,下面是我找到的iptables规则。
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
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 50/minute --limit-burst 200 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT
我能够理解前两条规则。有人可以澄清最后两条规则吗?采用最后 2 条规则,第 1 条规则是否意味着每分钟仅接受 50 个新连接?极限爆发有什么作用?我尝试阅读相关内容。但不确定我是否理解清楚了。这是否意味着一旦一分钟内接受 200 个新连接,那么它就会限制每分钟仅 50 个新连接。任何进一步的新连接请求都将被丢弃。什么时候才能再次允许 200 个新请求的爆发?
现在,最后一条规则意味着什么?每秒只能有 50 个用户连接到我的网络服务器?为什么这里的突发计数又是相同的 50?根据最后两条规则,是否有可能丢弃一些合法流量?
2)我遇到了下面的一组规则,这些规则在很多地方都被引用来阻止端口扫描。看起来合适吗?有人能解释一下这是做什么的吗?我非常不确定最后 4 条规则中的逻辑以及为什么 dport 是 139。
# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP
# Once the day has passed, remove them from the portscan list
iptables -A INPUT -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove
# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP
答案1
该limit
扩展实现了令牌桶机制。通常,当规则匹配时,netfilter 会跳转到提供的目标(ACCEPT
在本例中)。当你插入limit
扩展时,netfilter必须从该规则的“桶”中删除一个“令牌”,然后才允许它跳转。如果存储桶中没有任何令牌,则此扩展会阻止 netfilter 跳转,即使规则确实匹配。
--limit 50/minute #tells netfilter to add 50 tokens per minute to the bucket
--limit-burst 200 #tells netfilter to use a bucket which holds up to 200 tokens
如果每分钟有 50 个连接请求(或更多),您的服务器将每分钟允许 50 个新连接。如果一分钟内的请求少于 50 个,则存储桶将被填满(实际上一开始就已满)。这意味着,如果一分钟只有几个请求,那么下一分钟服务器将接受超过 50 个新请求。为了防止这种情况失控,桶可以容纳的令牌数量有上限。在本例中为 200。当存储桶已满时,您的服务器将接受接下来的 200 个传入连接,即使它们同时访问您的服务器也是如此。由于超过 50 个,我们称之为突发,其中接受连接的数量激增至超过我们想要的 50 个平均。
第二条规则意味着该机器将立即接受 50 个 IP 数据包,无需进一步调查,只要它们属于 netfilter 识别的流即可。为了衡量此规则的效果,我们需要查看整个链(以及它引用的每个链以及它所引用的每个链)。不过,我可以告诉你一些事情:
Netfilter 将 TCP 连接发起者的 ACK 视为一个数据包来完成握手
RELATED
。每分钟 50 个成功建立的连接完全满足了您遇到问题的第二条规则。最常见的 TCP 实现在放弃之前会进行四次连接尝试。成功建立 50 个连接后,在最坏的情况下,您会收到 200 个连接请求。
端点发出特定连接请求的频率并不重要,只需在合理的时间内成功建立连接即可。大多数实现将 60 秒作为默认的合理时间量。
如果最后一条规则是50/minute
,那么这四个规则可能是一个非常酷的 DoS 保护框架的一部分。因为它缺少--dport 80
过滤器,所以50/second
我只能猜测:
a) 你完全断章取义了这句话,它与前三句话没有直接关系。
b) 这是减缓流量的一般上限。
c) 这是一个错误,但也应该是50/minute
。
d) 这是保护服务器免受 DoS 攻击和在 DoS 攻击期间和之后保持服务可访问之间的权衡。
要理解第二个片段,您首先必须深入了解recent
扩展程序使用和维护有关源 IP 地址的知识。
该recent
扩展在列表中管理其知识。默认列表已命名DEFAULT
,如果未提供其他列表,则使用该列表。一个提供了另一个列表,使用--name
.
portscan
因此,前两条规则的意思是“如果源 IP在过去 86400 秒内已放入列表中,则丢弃此数据包”。
后两条规则的意思是“从列表中删除该IP地址portscan
”。请注意,仅当先前的规则不匹配时才会评估此规则。这条规则的存在是为了保持列表portscan
简短。列表越长,搜索所需的时间就越长。
最后四个规则将源 IP 放在portscan
列表中,记录它和DROP
数据包。--dport 139
是因为只有在这种情况下才需要这种行为。我非常确定这些规则在上下文中更有意义,因为这不是防止端口扫描的完整规则集。