如何通过 Iptables 阻止 SSH 蛮力以及它是如何工作的?

fcu*_*hoo 4 security ssh firewall iptables

我打算添加以下规则来iptables阻止这些天常见的 ssh 蛮力攻击。

-A INPUT -i eth0.103 -p tcp -m tcp --dport 4522 -m state --state NEW -m recent --set --name SSH --rsource    
-A INPUT -i eth0.103 -p tcp -m tcp --dport 4522 -m recent --rcheck --seconds 30 --hitcount 4 --rttl --name SSH --rsource -j REJECT --reject-with tcp-reset    
-A INPUT -i eth0.103 -p tcp -m tcp --dport 4522 -m recent --rcheck --seconds 30 --hitcount 3 --rttl --name SSH --rsource -j LOG --log-prefix "SSH brute force "    
-A INPUT -i eth0.103 -p tcp -m tcp --dport 4522 -m recent --update --seconds 30 --hitcount 3 --rttl --name SSH --rsource -j REJECT --reject-with tcp-reset    
-A INPUT -i eth0.103 -p tcp -m tcp --dport 4522 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

我知道第二条、第三条和第四条规则负责在 30 秒内记录和阻止来自同一 IP 的攻击。间隔。

问题

  1. 当文档说“将其记录到系统日志一次,然后立即拒绝并忘记它”时,忘记它是什么意思?
  2. 永远忘记它?
  3. 有iptables检查的黑名单吗?
  4. 如果某个 IP 被拒绝,但一小时后又尝试了另一个连接,那么该 IP 还会再尝试 3 次吗?
  5. 如果是这种情况,那么只要iptables没有黑名单计数,这不是阻止而是减慢攻击速度?

slm*_*slm 5

问题#1:当文档说“将其记录到系统日志一次,然后立即拒绝并忘记它”时,忘记它是什么意思?

意味着该消息将显示在日志中,但只会出现一次,因此每次触发规则时,您的日志都不会被连续的消息流污染。

问题 2:永远忘记它?

不,不是永远。有一个与这些消息在日志中出现的频率相关的时间段。

问题#3:有iptables检查的黑名单吗?

不,没有iptables“检查”的黑名单。从某种意义上说它是愚蠢的,它只会过滤你告诉它的内容,并且只允许你告诉它的内容通过。

问题 #4:如果一个 IP 被拒绝,但一小时后又尝试了另一个连接,是否还会有来自该 IP 的 3 次尝试?

这取决于什么是拱形超时。如果发生了额外的尝试并且原始超时未从初始尝试过去,则日志中不应有额外的消息传递,也不应有允许的连接。但是,如果超时已经过去,那么是的,您将看到有关这些后续尝试的其他消息。

我鼓励您查看 Iptablerecent模块的文档,了解有关其工作原理的更多详细信息。

端口扫描

IP 保留在“坏人”列表中的时间长度将由您的规则结构来控制,如下所示:

iptables -A INPUT -i $OUTS -m recent --name badguys --update --seconds 3600 -j DROP
iptables ...
 .
 .
 .
iptables -A INPUT  -t filter -i $OUTS -j DROP -m recent --set --name badguys
Run Code Online (Sandbox Code Playgroud)

第一条规则将检查传入的数据包是否已经在“badguy”列表中。如果是,那么时钟将被--update交换机“重置”,坏人的 IP 将在此列表中保留长达 1 小时(3600 秒)。随后的每次尝试都会重置这个 1 小时的窗口!

注意:按照这样的规则结构,违规者必须完全沉默一小时才能再次与我们沟通

SSH

对于 SSH 连接,策略略有不同。与 IP 进入我们的“坏人”列表相关的超时仍然是 1 小时,并且仍然会在 1 小时窗口内每次重新连接时重置。

对于 SSH,我们需要计算每个--syn连接。这是一个 TCP SYN 数据包,在 TCP 3 次握手中发生。通过计算这些,我们可以“跟踪”每个连接尝试。如果您在 30 秒内尝试与我们联系超过 2 次,我们会放弃您。

为了获得这些不断尝试连接到“badguy”列表中的 IP,我们可以合并另一个规则,如果它们在 5 分钟窗口(300 秒)内尝试连接到我们 6 次,则添加它们。

这是相应的规则 -它们的顺序至关重要!

iptables -N BADGUY
iptables -t filter -I BADGUY -m recent --set --name badguys

iptables -A INPUT -i $OUTS -p tcp --syn --dport ssh -m recent --name ssh --set
iptables -A INPUT -i $OUTS -p tcp --syn --dport ssh -m recent --name ssh --rcheck --seconds 300 --hitcount 6 -j BADGUY
iptables -A INPUT -i $OUTS -p tcp --syn --dport ssh -m recent --name ssh --rcheck --seconds  30 --hitcount 2 -j DROP
Run Code Online (Sandbox Code Playgroud)

注意:您可以在/proc/net/ipt_recent. 那里应该有一个带有列表名称的文件badguys

问题 #5:如果是这种情况,那么只要 iptables 没有一些黑名单计数,这不是阻塞而是减慢攻击速度?

我想你会发现,从 iptable 的角度来看,通常有 3 种方法来处理连接尝试。

  1. 允许已知可接受的流量
  2. 禁止已知不可接受的流量
  3. 可能出现问题的流量会无限期地或“超时”期间减速和/或拒绝。如果已使用“超时”处理了所述行为,请在超时过后重新允许它。

#3是大多数复杂性来自设置iptables和/或一般防火墙的地方。由于互联网上的大部分流量在某种程度上是可以的,并且当该流量表现出“强迫性”行为时,从某种意义上说,单个 IP 尝试连接到服务器的端口 X 次,从而成为问题。

参考