有没有办法用firewalld 来限制连接尝试的速率?

有没有办法用firewalld 来限制连接尝试的速率?

在我们的 CentOS 6 服务器上,我使用了来自本文减少我们服务器上的暴力 ssh 尝试,特别是速率限制/日志记录部分。有没有办法在 CentOS 7 中使用防火墙做同样的事情?我宁愿避免切换回 iptables,因为防火墙似乎是操作系统的发展方向。

作为参考,这是我们使用的 iptables 中的基本配置(有些值不同)

/sbin/iptables -N LOGDROP
/sbin/iptables -A LOGDROP -j LOG
/sbin/iptables -A LOGDROP -j DROP
iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 22 -i eth0 -m state --state NEW -m recent  --update --seconds 60 --hitcount 4 -j LOGDROP

答案1

尝试:

firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT_direct 0 -p tcp --dport 22 -m state --state NEW -m recent --set
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT_direct 1 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 30 --hitcount 4 -j REJECT --reject-with tcp-reset
firewall-cmd --reload

完整示例:RHEL7:如何减轻 HTTP 攻击。

关于日志记录拒绝包 FirewallD 根本不支持与旧 iptables-service 相同级别的日志记录。请参阅https://lists.fedorahosted.org/pipermail/firewalld-users/2014-February/000155.html

但可能有一个可行的解决方法:https://bluehatrecord.wordpress.com/2014/04/17/logging-packet-drops-in-firewalld/

答案2

CentOS 7 改变了一些人们已经习惯的东西,他们通常会对这些变化的现实感到不安、逃避和逃避。

许多人不知道或没有意识到,firewalld 并不是一个“新”防火墙 - 它是 iptables 的一个“前端”,Red Hat 正在将其作为一个支持 GUI 的产品附加组件。对于那些熟悉“shorewall”的人来说 - 可以这样想(http://shorewall.org) 和 shorewall 也可通过 repos 在 Centos 7 上使用 - 另请参阅https://www.cyberciti.biz/faq/centos-rhel-shorewall-firewall-configuration-setup-howto-tutorial/ shorewall 并不简单,并且/或者具有高度的 GUI,但实际上非常强大,可以将两个世界结合在一起。

我还要补充一点,如果您使用 Webmin - Shorewall,它有一个图形界面模块,如果您安装 shorewall 并重新配置 Webmin 以查看它,该模块将激活。而且,我没有推广 shorewall - 也不与这两个程序的作者有任何关系。

为此,Fail2ban 不是图形化的 - 但也是 Iptables 的“前端”,因为它可以扫描日志文件并暂时或永久禁止显示恶意迹象的 IP(密码失败次数过多、寻求漏洞等)。

通常,Fail2Ban 用于更新防火墙规则,以在指定的时间内拒绝 IP 地址,尽管也可以配置任何其他操作(例如发送电子邮件)。开箱即用的 Fail2Ban 附带各种服务(apache、courier、ssh 等)的过滤器。

Fail2ban 还可用于创建富文本规则,以及使用 Firewalld 的规则 - 优点是 Firewalld 使用 xml 文件,可以使用任何编辑器快速编辑,而无需重写 Firewall-cmd 命令。与 WinSCP 和 EditPadLite 一起使用管理简单快捷。

firewalld 具有等效的操作命令来生成 iptables 条目,例如,如果您想创建一个更复杂的条目来将端口限制到特定的 IP 或网络,则需要使用丰富的规则,如下所示的示例:

 firewall-cmd --zone=OPS --add-rich-rule='rule family="ipv4" source address="xxx.xxx.xxx.0/24" port protocol="tcp" port="9200" accept'

这将创建一个 netfilter 规则,如 iptables -nL 所报告的那样:

 ACCEPT     tcp  --  xxx.xxx.xxx.0/24     0.0.0.0/0            tcp dpt:9200 ctstate NEW

必须记住,虽然许多人不使用 GUI 来配置通常用作互联网服务器的 Linux,但有一个“控制中心”和“网络管理器”的“nm-connection-editor”和“防火墙配置”,它们都将作为图形工具启动,从而使工作更容易。

很多人想禁用防火墙并“返回” iptables - 但事实是你从未离开过 iptables

因此,答案是最简单的事情就是使用 fail2ban 将 ips 永久记录到黑名单文件中,然后使用富文本规则永久拒绝该 IP。我附带已设置好的文件,您只需将 fail2ban 指向该文件,它就会完成剩下的工作。

有很多教程和如何使用 fail2ban 将违规 IP 回显到黑名单文件并禁止它。参见例如 http://www.itadminstrator.com/2017/05/how-to-protect-ssh-with-fail2ban-on.htmlhttps://arno0x0x.wordpress.com/2015/12/30/fail2ban-permanent-persistent-bans/显示了如何将 IP 回显到黑名单文件。我将使用 /etc/fail2ban/action.d/firewallcmd-rich-rules.conf 文件(而不是 multiport.conf)来修改和添加回显命令,因为除非您编辑 xml 文件并将其删除,否则它将永久删除该 IP 违规行为。

这里有一条命令,您可以将其放在实际的 actionban 命令下的 actionban= 部分中,该命令将检查名为 ip.blacklist 的文件中是否存在重复的 ip,然后将其写入其中

 if ! grep -Fq <ip> /etc/fail2ban/ip.blacklist; then echo "<ip> # fail2ban/$( date '+%%Y-%%m-%%d %%T' ): auto-add for repeat offender" >> /etc/fail2ban/ip.blacklist; fi

它将产生类似如下的条目:

197.32.10.180 # fail2ban/2017-11-22 16:18:33:自动添加重复违规者

如果文件 ip.blacklist 在 etc/fail2ban 中不存在,则应该创建该文件

请记住,这些是针对 CentOS 的说明 - 并假设您从适用于您的 Centos 7 版本的 yum repo 安装了 fail2ban

许多攻击来自中国、俄罗斯、乌克兰、韩国等国家——这些国家的许多黑客攻击者希望破坏你的服务器(通常会删除一个你不知道的文件),然后“勒索”服务器所有者索要比特币,所以我经常进入日志并获取 IP——然后去http://whois.com/whois- 并将其转储到那里以获取完整的 CIDR 网络,然后编辑 xml 文件并删除它所在的整个子网。

最初你使用

 firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address=176.15.57.196 reject' --permanent

然后做一个

 firewall-cmd --reload

之后,您可以编辑 etc/firewalld/zones/public.xml 文件 <= 通常每个人都使用“public”作为区域 - 但无论使用哪个区域。如果这是您第一次在firewall-cmd --reload 命令后进行输入,它将创建 public.xml 文件,就像这样(视情况而定,可以输入多个)

  <rule family="ipv4">
    <source address="xxx.xxx.xx.x/xx"/>
    <reject/>
  </rule>

如果 whois 页面未列出网络的 CIDR,请使用以下在线工具:https://www.ipaddressguide.com/cidr或者https://www.derman.com/blogs/IP-Range-to-CIDR-Calculator或者其他人使用您从 whois 获得的 IP 范围来创建 CIDR 符号 - 并将其放入 xxx.xxx.xx.x/xx 的“源地址”中,保存文件,然后执行防火墙命令 --reload。您可以根据需要更改任意数量,然后执行重新加载命令 - 前提是您没有犯任何错误。该网络上的任何人都不会再次进入您的服务器 - 他们会收到一条消息“网络不可达” - 这还将减轻您的服务器处理攻击的负担,如果他们获得动态 IP 并再次访问,请抵御攻击并记录它们。许多国家没有像美国和其他主要国家那样的“反黑客”法律,因此您必须决定是否真的需要他们访问您的网站。

有一点不太明显,那就是默认情况下,firewalld 设置为不记录。它会记录到系统日志文件,但您需要进入 etc/firewalld/firewalld.conf 并设置 => LogDenied=all

对于需要日志信息的其他程序(如 psad 和 mod-evasive),也需要这样设置。

你也可以使用 modprobe 来监视简单的 DDoS 攻击,并实施规则以阻止攻击者。请参阅https://www.certdepot.net/rhel7-mitigate-http-attacks/

当然你也可以更改ssh端口号

答案3

您可以使用轻量级 IPS,例如fail2ban

适用于firewalld使用动作插件(/etc/fail2ban/action.d/firewallcmd-ipset.conf),将被禁止的 IP 添加到ipset使用直接规则中。

默认的是banaction( /etc/fail2ban/jail.conf) ,但是你可以使用不同的方法ipables-multiport来为自定监狱创建 local.conf 。[sshd-ddos]banaction

fail2ban查看wiki 和 Fedora wiki中的示例。

答案4

FirewallD 能够将 SSH 连接速率限制为每分钟一个:

firewall-cmd --add-rich-rule 'rule service name="ssh" accept limit value="1/m"'

使用建议的丰富规则https://github.com/firewalld/firewalld/issues/70

我建议使用--zone public上述速率限制并定义已知的入口点值得信赖//工作使用类似命令的区域--zone=trusted --add-source=-your-own-IP-here-来绕过速率限制。请先测试一下。当您的设置成功时,请记住坚持规则。

例子:

firewall-cmd --zone public --add-rich-rule 'rule service name="ssh" accept limit value="1/m"'
firewall-cmd --zone=trusted--add-source=-your-own-IP-here-
firewall-cmd --runtime-to-permanent

相关内容