iptables规则解释

iptables规则解释

我希望更新我们的网络服务器中的 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 识别的流即可。为了衡量此规则的效果,我们需要查看整个链(以及它引用的每个链以及它所引用的每个链)。不过,我可以告诉你一些事情:

  1. Netfilter 将 TCP 连接发起者的 ACK 视为一个数据包来完成握手RELATED。每分钟 50 个成功建立的连接完全满足了您遇到问题的第二条规则。

  2. 最常见的 TCP 实现在放弃之前会进行四次连接尝试。成功建立 50 个连接后,在最坏的情况下,您会收到 200 个连接请求。

  3. 端点发出特定连接请求的频率并不重要,只需在合理的时间内成功建立连接即可。大多数实现将 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是因为只有在这种情况下才需要这种行为。我非常确定这些规则在上下文中更有意义,因为这不是防止端口扫描的完整规则集。

相关内容