在本文中,小编将介绍一种简单有效的小技巧,那便是使用一个小脚本,再加上iptables和Fail2Ban等工具自动阻止可疑IP 。这些工具功能强大、轻量级,可以保护你的Linux服务器免受暴力攻击、机器人或任何恶意流量的侵害。
本文内容对初学者友好,尤其适合Linux系统管理员、学生,或任何运行虚拟专用服务器(VPS)、Web服务器甚至家庭Linux服务器的用户,接下来一起来看看吧。
什么是iptables和Fail2Ban?
在了解设置步骤之前,首先简单介绍下本文正在使用的两个关键工具——iptables
和Fail2Ban
。
iptables
iptables
是大多数Linux发行版内置的命令行防火墙实用程序,其通过应用一组规则(一般称为策略链)来控制网络流量。
这些规则可以根据IP地址、端口号或协议过滤数据包。简单来说就是,你可以将iptables
想象成站在服务器门口的守门人,只允许受信任的流量进入,同时阻止其余流量进入。
Fail2Ban
Fail2Ban
是一款日志监控工具,可以自动检测并响应恶意行为,它实时监控日志文件,并查找可疑模式,例如多次登录失败。
当它发现可疑情况时,例如对你的SSH进行暴力破解攻击,它会介入并通过在iptables中添加阻止规则来禁止违规IP。用户可以设置允许失败的次数、禁止IP的时长,甚至可以自定义响应。
iptables
和Fail2Banli
两者结合使用的话,能够为用户提供简单而强大的服务器保护方案。其中,iptables
充当防火墙的“肌肉”的角色,而Fail2Ban
则如同 “大脑”,负责识别威胁并实时更新防火墙规则。
为什么要使用自定义IP阻止程序脚本?
虽然Fail2Ban本身已经能够根据预定义的日志模式自动禁止可疑IP地址,并且表现出色,但自定义IP阻止程序脚本可以增加额外的灵活性和控制力。
自定义脚本能让你快速在阻止列表中添加或移除IP地址,无需直接修改复杂的防火墙规则。它还允许你基于自定义日志或Fail2Ban可能未监控到的触发条件构建逻辑。例如,如果你有一个可以会生成自有日志的Web应用程序,或者一个可以检测特定模式的监控工具,那么你可以轻松地将这些警报绑定到脚本中以实现自动拦截。
此外,该脚本可以集成到其它自动化任务或服务器管理工具中,这使其在较大的环境中或管理多个服务器的系统管理员中特别有用。
步骤1、安装iptables和Fail2Ban
在开始设置之前,请确保Linux系统上已安装iptables
和Fail2Ban
,这两个工具在大多数主流Linux发行版的默认软件包存储库中都有,因此安装非常简单。
如果使用的是基于Debian的系统(例如Ubuntu或Debian本身),请先更新软件包列表以确保所有内容都是最新的:
sudo apt update
更新完成后,通过运行以下命令安装iptables
和fail2ban
:
sudo apt install iptables fail2ban
对于基于RPM的系统,可以使用yum包管理器安装这两个工具:
sudo yum install iptables-services fail2ban
安装完成后,接着就可以配置防火墙并使用Fail2Ban
设置自动保护。
步骤2、创建简单的IP阻止程序脚本
现在iptables
和Fail2Ban
都已安装,接下来创建一个简单的bash脚本(block-ip.sh
),它允许你使用iptables手动阻止任何IP地址:
sudo nano /usr/local/bin/block-ip.sh
在此文件中,粘贴以下代码内容:
#!/bin/bash if [ -z "$1" ]; then echo "Usage: $0 " exit 1 fi IP=$1 # Check if IP is already blocked if iptables -L INPUT -v -n | grep -q "$IP"; then echo "IP $IP is already blocked." else iptables -A INPUT -s $IP -j DROP echo "IP $IP has been blocked." fi
此脚本首先检查你是否已提供IP地址作为参数。如果没有,它会打印一条使用信息并退出。如果提供了IP,它会使用iptables检查该IP是否已被阻止。如果该IP尚未包含在防火墙规则中,它会添加一条新规则以丢弃来自该IP地址的所有流量,并确认操作。
脚本内容完成后,按CTRL+O
保存并CTRL+X
退出编辑器。现在,使脚本可执行,以便可以直接从命令行运行:
sudo chmod +x /usr/local/bin/block-ip.sh
脚本准备好后,这里可以来测试一下,例如屏蔽一个IP地址,这里要屏蔽某个IP 192.168.1.102
,请运行:
sudo /usr/local/bin/block-ip.sh 192.168.1.102
如果一切正常,应该会看到一条输出消息:
IP 192.168.1.100 has been blocked.
要确认IP确实被阻止,可以通过运行以下命令查看当前
iptables
规则:
sudo iptables -L -n -v
当你想要手动或从自定义日志阻止IP时,此脚本非常有用。
步骤3、使用iptables设置Fail2Ban
iptables
已准备就绪,并且我们的自定义脚本也已部署到位,接下来就该配置Fail2Ban。通过简单配置,Fail2Ban
就可以自动检测并阻止试图破坏SSH、Apache或服务器上任何其它面向互联网的应用程序等服务的恶意IP。
Fail2Ban使用一种名为“ jail ”的概念,它只是一些用于监控特定服务的配置块。每个jail都会告诉Fail2Ban需要监控哪些日志、需要查找哪些模式,以及在检测到攻击时如何响应。
首先需要编辑或创建jail.local
文件,你可以在其中定义自定义设置而不影响默认配置。
sudo nano /etc/fail2ban/jail.local
将以下块内容粘贴到文件中:
[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 bantime = 3600 findtime = 600
简单解释上面每一个选项的含义:
enabled = true
:这将打开jail,以便它主动监控SSHport = ssh
:这告诉Fail2Ban要监视哪个端口filter = sshd
:指定用于检测登录失败的过滤器logpath = /var/log/auth.log
:这是Fail2Ban将用于扫描失败SSH登录尝试的日志文件maxretry = 5
:如果某个IP在规定时间范围内登录失败5次,就会被封禁bantime = 3600
:这将禁令持续时间设置为3600秒(1小时)findtime = 600
:这定义了计算最大重试次数的时间窗口(以秒为单位),在本例中为10分钟。
如果你正在运行CentOS或基于RHEL的系统,则需要更改日志路径以匹配存储SSH日志的位置:
/var/log/secure
保存jail配置文件后,重新启动Fail2Ban服务以应用更改:
sudo systemctl restart fail2ban
要验证你的jail是否正常工作,请使用以下命令检查SSH jail的状态:
sudo fail2ban-client status sshd
这将向你显示有多少IP被禁止、检测到了多少次尝试以及jail是否处于活动状态。
如果你想查看当前被iptables
阻止的IP(包括被Fail2Ban禁止的IP),请运行以下命令:
sudo iptables -L -n
最后,如果你想取消禁止Fail2Ban自动阻止的特定IP地址,可以使用以下命令手动将其删除:
sudo fail2ban-client set sshd unbanip 192.168.1.102
步骤4、将脚本与Fail2Ban结合(可选)
默认情况下,Fail2Ban使用其内部操作通过iptables
来阻止IP地址。但是,如果你希望Fail2Ban调用你自定义的IP阻止程序脚本(例如,例如添加了自定义逻辑或日志记录功能),则可以设置自定义Fail2Ban操作。
为此,首先需要创建一个新的动作定义文件:
sudo nano /etc/fail2ban/action.d/customblock.conf
在此文件中,粘贴以下配置:
[Definition] actionstart = actionstop = actioncheck = actionban = /usr/local/bin/block-ip.sh actionunban = iptables -D INPUT -s -j DROP [Init]
此配置告知Fail2Ban每当需要禁止IP地址时,都使用你的自定义脚本。actionban
行将运行你的脚本,并将违规IP地址传递给它。对于解禁,它会直接从iptables中删除阻止规则。
接下来,你需要告诉Fail2Ban在你的jail配置中使用此自定义操作:
sudo nano /etc/fail2ban/jail.local
在你的[sshd]
jail或你配置的任何其它jail下面,更新操作行以指向你的自定义操作:
[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/auth.log maxretry = 5 bantime = 3600 findtime = 600 action = customblock
完成这些更改后,重新启动Fail2Ban服务以应用它们:
sudo systemctl restart fail2ban
现在,每当Fail2Ban检测到可疑IP时,它都会调用你的脚本来处理阻止,以便让你灵活地根据实际需求记录日志、发送警报或执行其它附加操作。
保存iptables规则
需要注意的一件重要事情是,iptables
规则默认不是持久的,这意味着任何添加的规则(无论是手动添加还是通过Fail2Ban添加)都会在服务器重启后丢失,除非你明确保存它们。
在Debian或Ubuntu系统上,可以通过安装iptables-persistent
软件包使防火墙规则持久化:
sudo apt install iptables-persistent
安装之后,使用以下命令保存当前规则:
sudo netfilter-persistent save
在CentOS或RHEL系统上,过程略有不同,你可以使用以下服务命令保存规则:
sudo service iptables save
或者,你可以手动将规则保存到适当的配置文件中,命令如下:
sudo iptables-save > /etc/sysconfig/iptables
通过保存规则,你可以确保手动或通过Fail2Ban阻止的IP即使在系统重启后仍然保持被阻止状态。
小结
实际上,保护Linux服务器的安全并非易事。通过将iptables
的强大功能与Fail2Ban
的智能功能相结合,你可以构建强大而灵活的防御体系,从而有效抵御暴力破解攻击、恶意登录尝试及可疑IP活动。
Fail2Ban
在自动执行检测和禁止过程的同时,自定义IP阻止程序脚本可在你最需要时为你提供手动控制能力。