iptables放弃一段时间IP最近失败的连接

我想减less在Linux系统上成功的ssh攻击的可能性。 唯一的端口是22(我使用端口转发的一切),当然,我确信ssh只接受基于密钥对的login(无密码)。

失败的sshlogin尝试的数量( last -f /var/log/btmp )是相当大的(因为任何开放22端口的人都应该这样做),所以在过去的2年中,我一直依靠变化af基于iptables的解决scheme经常提到阻止ssh攻击,例如, 数百个失败的sshlogin 。

这种scheme的一个令人讨厌的缺点是它限制了每个时间段从一个IP地址的新连接的数量,不pipe这个IP的先前连接是否成功以及它们是以同一个用户login还是不。 设想一个脚本,其中包含六十个来自国外的用来更新该服务器上各个区域的rsync命令:它通常会遇到“新的连接限制”,并在中间的某个地方出现故障。 如果路由器后面的几个用户(显示为相同的IP地址)同时连接到我的服务器上,情况也是如此。

所以,我想知道,如果不诉诸parsing/var/log文件 ,有可能实现以下策略与iptables

  1. 接受build立的连接
  2. 允许以前成功连接的新连接
  3. 将IP连接失败的连接关进监狱一段时间

奖励积分:

  1. 同上,但允许/监禁特定的user@ip而不是所有人@ip

并试图遏制僵尸networking攻击:

  1. 在ssh尝试失败后,暂时把用户(无论他连接哪个IP)关进监狱。

在不分析日志文件的情况下,您无法知道sshlogin尝试是否成功。 幸运的是,你不必自己parsing这些日志文件。 fail2ban可以为你做这个。 我经常在3次失败的login尝试之后监禁一周的IP。

首先, 没有 ssh监听port 22以减less自动扫描器发现端口的机会。

还可以使用psad 自动阻止扫描您的计算机的主机达到可configuration的时间(默认为1小时)。

一个非常简单的解决方法是租一个64 or 128 meg openvz容器并configurationopenvpn这样你就有一个fixed ip address ,然后将你的iptables规则限制在你希望保护的主机上的--source vpn.ip.address

更好的解决scheme是用fwknop完全隐藏你的ssh端口。 那么当你的ssh端口closures之前,不需要运行fail2ban ,直到你从fwknop-client发送一个gpg签名和encryption的数据包,这将打开你的防火墙一个可configuration的时间(默认30秒)。 你也可以configurationfwknop只接受某些ip地址(比如你的vpn )。

我在这里有一些相当广泛的笔记 fwknop

如果你认真对待ssh安全,你也应该使用ed25519键。 更多的注意事项在openssh使用安全密码 。 另一个不错的select是tinyssh ,它依赖于openssl ,默认情况下是安全的 。

这里提到的所有软件都存在于Alpine Linux中 ,它也受益于Parse在Grsecurity内核中的地址空间布局随机化 。