如何在 Ubuntu 22.04 上使用 Fail2Ban 保护 SSH

前言

SSH,这玩意儿,简直是连接云服务器的标配。它不仅好用,还很灵活。新的加密技术出来,它也能跟着升级,保证核心协议的安全。但是,再牛的协议和软件,也都有可能被攻破。SSH 在网上用得这么广,就成了黑客们眼中的“肥肉”,他们会想方设法来搞事情。

只要你的服务暴露在网络上,就可能被盯上。不信你看看那些高流量服务器的 SSH 日志,是不是经常看到有人在不停地尝试登录?这些家伙,要么是人,要么是机器人,都在用暴力破解的方式撞你的密码。虽然你可以通过一些设置,比如禁用密码登录,改用 SSH 密钥,把被攻破的几率降到最低,但这些尝试还是会给你带来一些麻烦。

对于那些对安全要求极高的生产环境,通常会在 SSH 服务前面加一层 VPN,比如 WireGuard。这样一来,除非有额外的“通行证”,否则就没法直接从外网连到默认的 22 端口。VPN 确实很安全,但也会增加复杂性,有时候还会影响一些自动化脚本。

在搞 VPN 之前,或者作为 VPN 的补充,你可以试试 Fail2Ban 这个工具。Fail2Ban 可以自动修改你的防火墙设置,只要有人登录失败次数多了,就直接把他的 IP 给 ban 了。这样一来,你的服务器就能自己保护自己,不用你操心。

这篇教程,就是教你如何在 Ubuntu 22.04 服务器上安装和使用 Fail2Ban。

接下来,我一步一步带你搞定它!

准备工作

服务器准备

你需要:

  • 一颗好奇的心。
  • 一台 Linux 服务器(推荐腾讯云、阿里云或者雨云)。

我这里用 雨云 来给大家演示,教大家怎么创建自己的云服务器,方便学习这篇文章的内容。

注册链接: https://rainyun.ivwv.site

创建雨云服务器

下面的步骤只是个参考,你可以根据自己的需求来选择配置。

  • 打开 云产品云服务器立即购买
  • 选个离你近的区域,这样速度快。

https://img-blog.csdnimg.cn/img_convert/4c16271f125adea69da6ed9e7b2a4226.png

  • 按照你的需求选配置,系统选 Ubuntu 22.04,看你需不需要预装 Docker。
  • 最后,按照提示买就行了。
  • 买完之后,等机器部署好,点开你刚买的服务器,进到管理面板,找到远程连接的信息。

https://img-blog.csdnimg.cn/img_convert/414570cd3da48d4cc4bf51489992000b.png

  • 我们用 PowerShell 通过 SSH 远程连接服务器。Win+R 打开运行窗口,输入 powershell,然后点确定。

https://img-blog.csdnimg.cn/img_convert/c8afbeb764459a37a8451dd2ed8eeff1.png

  • 输入 ssh root@你的服务器IP,比如 ssh root@154.9.227.239。第一次要输入 yes,然后回车,就能登录服务器了。

https://img-blog.csdnimg.cn/img_convert/ea5814f1d1068ca9fa2bb94631cfbdf1.png

  • 到这里,你的云服务器就远程连上了。

第1步 - 安装 Fail2Ban

Fail2Ban 在 Ubuntu 的软件仓库里有。先用非 root 用户更新一下软件包列表,然后安装 Fail2Ban:

sudo apt update
sudo apt install fail2ban

装好之后,Fail2Ban 会自动启动一个后台服务。不过,默认情况下它是禁用的,因为有些默认设置可能会导致一些不希望出现的问题。你可以用 systemctl 命令来检查一下:

systemctl status fail2ban.service

你可以直接启用 Fail2Ban,但最好先了解一下它的功能。

第2步 - 配置 Fail2Ban

Fail2ban 的配置文件都放在 /etc/fail2ban 目录里。默认的配置文件是 jail.conf。我们先去这个目录,用 head -20 看看这个文件的前 20 行:

cd /etc/fail2ban
head -20 jail.conf

你会看到,文件的前几行都被注释掉了,就是以 # 开头的那些。这表示它们是说明文档,不是设置。注释里也说了,不要直接改这个文件。你有两个选择:要么在 jail.d/ 目录里为 Fail2Ban 创建单独的配置文件,要么在 jail.local 文件里设置你的本地配置。jail.conf 文件会随着 Fail2Ban 的更新而更新,它相当于一个默认设置的“源”,如果你没有做任何覆盖,就会用这里的设置。

这篇教程里,我们用 jail.local。你可以复制 jail.conf 来创建它:

sudo cp jail.conf jail.local

现在你可以开始修改配置了。用 nano 或者你喜欢的文本编辑器打开这个文件:

sudo nano jail.local

当你浏览这个文件时,我会介绍一些你可能需要修改的选项。文件顶部的 [DEFAULT] 部分的设置会应用到 Fail2Ban 支持的所有服务。在文件的其他地方,比如 [sshd],是针对特定服务的设置,这些设置会覆盖默认设置。

/etc/fail2ban/jail.local

[DEFAULT]
. . .
bantime = 10m
. . .

bantime 参数设置了客户端被 ban 的时间,单位是秒。默认是 10 分钟。

/etc/fail2ban/jail.local

[DEFAULT]
. . .
findtime = 10m
maxretry = 5
. . .

接下来的两个参数是 findtimemaxretry。它们一起决定了什么情况下客户端会被认为是恶意用户,需要被 ban。

maxretry 变量设置了在 findtime 定义的时间窗口内,客户端尝试登录的最大次数。如果超过这个次数,就会被 ban。默认设置下,Fail2ban 会 ban 掉在 10 分钟内尝试登录失败 5 次的客户端。

/etc/fail2ban/jail.local

[DEFAULT]
. . .
destemail = root@localhost
sender = root@<fq-hostname>
mta = sendmail
. . .

如果你想在 Fail2Ban 有动作的时候收到邮件提醒,你需要设置 destemailsendernamemta 这几个参数。destemail 参数设置了接收 ban 消息的邮箱地址。sendername 设置了邮件中“From”字段的值。mta 参数配置了发送邮件的邮件服务。默认是 sendmail,你也可以用 Postfix 或者其他邮件服务。

/etc/fail2ban/jail.local

[DEFAULT]
. . .
action = $(action_)s
. . .

这个参数配置了 Fail2Ban 在需要 ban 的时候采取的动作。值 action_ 在这个参数前面不远的地方定义。默认的动作是更新你的防火墙配置,拒绝来自违规主机的流量,直到 ban 的时间结束。

默认情况下,还有其他 action_ 脚本,你可以用 $(action_) 替换上面的值:

…
# ban & send an e-mail with whois report to the destemail.
action_mw = %(action_)s%(mta)s-whois[sender="%(sender)s", dest="%(destemail)s", protocol="%(protocol)s", chain="%(chain)s"]# ban & send an e-mail with whois report and relevant log lines
# to the destemail.
action_mwl = %(action_)s%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]# See the IMPORTANT note in action.d/xarf-login-attack for when to use this action
#
# ban & send a xarf e-mail to abuse contact of IP address and include relevant log lines
# to the destemail.
action_xarf = %(action_)sxarf-login-attack[service=%(__name__)s, sender="%(sender)s", logpath="%(logpath)s", port="%(port)s"]# ban IP on CloudFlare & send an e-mail with whois report and relevant log lines
# to the destemail.
action_cf_mwl = cloudflare[cfuser="%(cfemail)s", cftoken="%(cfapikey)s"]%(mta)s-whois-lines[sender="%(sender)s", dest="%(destemail)s", logpath="%(logpath)s", chain="%(chain)s"]
…

比如,action_mw 会 ban 掉 IP 并发送邮件,action_mwl 会 ban 掉 IP、发送邮件并包含日志记录,而 action_cf_mwl 除了以上所有操作,还会向你的 Cloudflare 账户发送更新,在那里 ban 掉违规者。

单独的监狱设置

接下来是配置文件中处理单独服务的部分。这些部分用 [sshd] 这样的标题来区分。

每个部分都需要通过在标题下添加 enabled = true 来单独启用,以及其他设置。

/etc/fail2ban/jail.local

[jail_to_enable]
. . .
enabled = true
. . .

默认情况下,SSH 服务是启用的,其他服务都是禁用的。
这里设置的其他一些设置是 filterlogpathfilter 用来决定日志中的一行是否表示登录失败,logpath 告诉 fail2ban 特定服务的日志在哪里。

filter 的值实际上是对 /etc/fail2ban/filter.d 目录中的文件的引用,只是去掉了 .conf 扩展名。这些文件包含正则表达式,用来判断日志中的一行是不是登录失败的尝试。我们这里就不深入研究这些文件了,因为它们比较复杂,而且预设的设置已经能很好地匹配相应的行了。

不过,你可以看看这个目录,了解一下有哪些可用的过滤器:

ls /etc/fail2ban/filter.d

如果你看到一个看起来和你正在使用的服务相关的文件,你应该用文本编辑器打开它。大多数文件都有很好的注释,你至少应该能知道这个脚本是用来防范哪种类型的攻击的。大多数过滤器在 jail.conf 文件中都有相应的(禁用)部分,如果需要,我们可以在 jail.local 文件中启用这些部分。

例如,假设你正在用 Nginx 为网站提供服务,并且发现网站中需要密码才能访问的部分正在被暴力破解。你可以告诉 fail2ban 用 nginx-http-auth.conf 文件来检查 /var/log/nginx/error.log 文件中是否有这种情况。

实际上,这已经在 /etc/fail2ban/jail.conf 文件中名为 [nginx-http-auth] 的部分设置好了。你只需要添加 enabled 参数:

/etc/fail2ban/jail.local

. . .
[nginx-http-auth]enabled = true
. . .

改完之后,保存并关闭文件。现在,你可以启用 Fail2ban 服务,让它自动运行了。首先,运行 systemctl enable

sudo systemctl enable fail2ban

然后,用 systemctl start 手动启动它:

sudo systemctl start fail2ban

你可以用 systemctl status 验证它是否正在运行:

sudo systemctl status fail2ban
● fail2ban.service - Fail2Ban ServiceLoaded: loaded (/lib/systemd/system/fail2ban.service; enabled; vendor preset: enab>Active: active (running) since Tue 2022-06-28 19:29:15 UTC; 3s agoDocs: man:fail2ban(1)Main PID: 39396 (fail2ban-server)Tasks: 5 (limit: 1119)Memory: 12.9MCPU: 278msCGroup: /system.slice/fail2ban.service└─39396 /usr/bin/python3 /usr/bin/fail2ban-server -xf startJun 28 19:29:15 fail2ban20 systemd[1]: Started Fail2Ban Service.
Jun 28 19:29:15 fail2ban20 fail2ban-server[39396]: Server ready

下一步,我们来演示一下 Fail2ban 是怎么工作的。

第 3 步 — 测试禁止策略(可选)

你可以从另一台服务器(这台服务器以后不需要登录你的 Fail2ban 服务器)来测试规则,通过 ban 掉第二台服务器来测试。登录到第二台服务器后,尝试通过 SSH 访问 Fail2ban 服务器。你可以尝试用一个不存在的用户名来连接:

ssh blah@your_server

在密码提示中输入一些随机字符。重复几次。过一会儿,你收到的错误应该从 Permission denied 变成 Connection refused。这表示你的第二台服务器已经被 Fail2ban 服务器 ban 掉了。

在 Fail2ban 服务器上,你可以通过检查 iptables 的输出来查看新规则。iptables 是一个用来和服务器上的底层端口和防火墙规则交互的命令。如果你按照 DigitalOcean 的教程进行初始服务器设置,你会用 ufw 在更高层级管理防火墙规则。运行 iptables -S 会显示 ufw 创建的所有防火墙规则:

sudo iptables -S
Output
-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N f2b-sshd
-N ufw-after-forward
-N ufw-after-input
-N ufw-after-logging-forward
-N ufw-after-logging-input
-N ufw-after-logging-output
-N ufw-after-output
-N ufw-before-forward
-N ufw-before-input
-N ufw-before-logging-forward
-N ufw-before-logging-input
-N ufw-before-logging-output
…

如果把 iptables -S 的输出通过管道传给 grep,搜索字符串 f2b,你就能看到 failed2ban 添加的规则:

sudo iptables -S | grep f2b
Output
-N f2b-sshd
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A f2b-sshd -s134.209.165.184/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -j RETURN

包含 REJECT --reject-with icmp-port-unreachable 的那一行就是 Fail2ban 添加的,应该会显示你的第二台服务器的 IP 地址。

结论

现在你应该可以为你的服务配置一些 ban 策略了。Fail2ban 是一个保护任何需要身份验证的服务的有效工具。

相关链接
雨云 - 新一代云服务提供商: https://rainyun.ivwv.site
我的博客:https://blog.ivwv.site

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/490452.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能家居WTR096-16S录放音芯片方案,实现语音播报提示及录音留言功能

前言&#xff1a; 在当今社会的高速运转之下&#xff0c;夜幕低垂之时&#xff0c;许多辛勤工作的父母尚未归家。对于肩负家庭责任的他们而言&#xff0c;确保孩童按时用餐与居家安全成为心头大事。此时&#xff0c;家居留言录音提示功能应运而生&#xff0c;恰似家中的一位无形…

EasyGBS国标GB28181-2016标准解读:基于TCP协议的视音频媒体传输

在探讨EasyGBS平台基于GB28181-2016标准的TCP协议视音频媒体传输时&#xff0c;我们首先需要了解GB28181标准的基本背景。GB28181&#xff0c;即GB/T28181—2016《公共安全视频监控联网系统信息传输、交换、控制技术要求》&#xff0c;是公安部提出的公共安全行业标准&#xff…

[C++]C++工具之对异常情况的处理(throw、catch、try)以及用命名空间避免同名冲突

一、C 异常处理&#x1f60a; 1.1 定义 C 中的异常处理用于应对程序运行中的异常情况&#xff08;如除零、数组越界等&#xff09;&#xff0c;通过 try-catch 机制捕获和处理错误&#xff0c;防止程序崩溃。 异常是程序运行时意外发生的事件&#xff0c;可以通过抛出&#xf…

博客MDX渲染方案

MDX渲染方案 Link 本文不由AI生成,原创,转载请注明 当个人博客网站或是独立网站有博客页时,通过渲染mdx文件是一种效率比较高的方式生成博客文章的一种方式 MDX渲染方案 我之前是通过typora直接导出html文件,这种纯静态页面 缺点:太繁琐优点:可以自己选不同的主题,成本…

VScode MAC按任意键关闭终端 想要访问桌面文件

说明 最近配置MAC上CPP的运行环境&#xff0c;在安装必要的CPP插件后&#xff0c;配置launch和task等json文件后&#xff0c;点击运行三角形&#xff0c;每次都会跳出main想要访问桌面上的文件。并且输出也是在调试控制台&#xff0c;非常逆天。 尝试 尝试1:尽管我尝试将ta…

注意力机制+时空特征融合!组合模型集成学习预测!LSTM-Attention-Adaboost多变量时序预测

注意力机制时空特征融合&#xff01;组合模型集成学习预测&#xff01;LSTM-Attention-Adaboost多变量时序预测 目录 注意力机制时空特征融合&#xff01;组合模型集成学习预测&#xff01;LSTM-Attention-Adaboost多变量时序预测效果一览基本介绍程序设计参考资料 效果一览 基…

29.在Vue 3中使用OpenLayers读取WKB数据并显示图形

在Web开发中&#xff0c;地理信息系统&#xff08;GIS&#xff09;应用越来越重要&#xff0c;尤其是在地图展示和空间数据分析的场景中。OpenLayers作为一个强大的开源JavaScript库&#xff0c;为开发者提供了丰富的地图展示和空间数据处理能力。在本篇文章中&#xff0c;我将…

qt 设置系统缩放为150%,导致的文字和界面的问题

1 当我们设置好布局后&#xff0c;在100%的设置里面都是正常的&#xff0c;但是当我们修改缩放为150%后&#xff0c;字体图标&#xff0c;界面大小就出现问题了&#xff0c;这就需要我们设置一些参数。 QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QCoreAppl…

3个关于协程的题目

题目1&#xff1a; 题目1&#xff1a;启动2个协程&#xff0c;1个管道&#xff0c;每隔1秒交替输出1次1-10和a-j。 预期效果&#xff1a; 实现方式&#xff1a; package mainimport ("fmt""sync""time" )var ch make(chan struct{}, 1) var wg…

基于ESP32的桌面小屏幕实战[4]:硬件设计之PCB Layout

1. PCB Layout 步骤 生成PCB 确定PCB layout规范 绘制板框尺寸 布局 布局规范&#xff1a; 按电气性能合理分区&#xff0c;一般分为&#xff1a;数字电路区&#xff08;即怕干扰、又产生干扰&#xff09;、模拟电路区(怕干扰)、功率驱动区&#xff08;干扰源&#xff09;&a…

(六)科研技能-论文写作中的常用单词和句式

针对论文写作过程&#xff0c;会用到很多单词及短语。为了文章书写的规范&#xff0c;需要总结一些常用的单词、短语以及一些句式&#xff0c;因此进行了简单的总结以及梳理。后续会根据情况适时更新对应的内容。 一、常用单词、短语 关于&#xff1a;with respect to 更具体地…

无限次使用 cursor pro

github地址 cursor-vip 使用方式 在 MacOS/Linux 中&#xff0c;请打开终端&#xff1b; 在 Windows 中&#xff0c;请打开 Git Bash。 然后执行以下命令来安装&#xff1a; 部分电脑可能会误报毒&#xff0c;需要关闭杀毒软件/电脑管家/安全防护再进行 方式1&#xff1a;通过…

【Email】基于SpringBoot3.4.x集成发送邮件功能

【Email】基于SpringBoot3.4.x集成发送邮件功能 摘要本地开发环境说明pom.xml启动类application.yaml写一个邮件模板定义模板引擎工具类定义一个邮件发送对象封装一个邮件发送器单元测试邮件模板单元测试发送邮件单元测试 邮件效果参考资料 摘要 在业务系统开发过程中&#xf…

hoppscotch VS postman

下载&#xff1a;https://hoppscotch.com/download 使用&#xff1a;

使用LSTM神经网络对股票日线行情进行回归训练(Pytorch版)

版权声明&#xff1a;本文为博主原创文章&#xff0c;如需转载请贴上原博文链接&#xff1a;使用LSTM神经网络对股票日线行情进行回归训练&#xff08;Pytorch版&#xff09;-CSDN博客 前言&#xff1a;近期在尝试使用lstm对股票日线数据进行拟合&#xff0c;初见成型但是效果不…

Web项目图片视频加载缓慢/首屏加载白屏

Web项目图片视频加载缓慢/首屏加载白屏 文章目录 Web项目图片视频加载缓慢/首屏加载白屏一、原因二、 解决方案2.1、 图片和视频的优化2.1.1、压缩图片或视频2.1.2、 选择合适的图片或视频格式2.1.3、 使用图片或视频 CDN 加速2.1.4、Nginx中开启gzip 三、压缩工具推荐 一、原因…

MATLAB选取向量中最大的若干个值个值,并返回所在位置的函数

在 MATLAB 中&#xff0c;可以使用 maxk 函数来选取向量中最大的 ( k ) 个值&#xff0c;并返回它们的索引位置。maxk 函数非常方便&#xff0c;适用于需要获取前几个最大值的情形。 文章目录 语法 示例输出结果总结 语法 [M, I] maxk(A, k)A 是输入向量。k 是要选择的最大值…

PDFMathTranslate,PDF多语言翻译,批量处理,学术论文,双语对照(WIN/MAC)

分享一个非常实用的PDF文档翻译项目——PDFMathTranslate。作为一个经常逛GitHub的开发者&#xff0c;我总喜欢翻看各种项目附带的论文&#xff0c;虽然大多时候是瞎研究&#xff0c;但却乐在其中。该项目能够完美保留公式、图表、目录和注释&#xff0c;对于需要阅读外文文献的…

Mvc、Springmvc框架

一.Mvc&#xff1a; 1.概念&#xff1a; MVC它是一种设计理念。把程序按照指定的结构来划分: Model模型 、View视图 、Controller控制层&#xff1b; 结构图&#xff1a; 二.Springmvc: 1.概念&#xff1a; springmvc框架它是spring框架的一个分支。它是按照mvc架构思想设计…

item2 for macos

安装Item2 brew install iterm2 查看终端类型 cat /etc/shells Mac OS X 10.15 已经将默认的shell从Bash换成了zsh&#xff0c;所以不用安装&#xff0c;10.15以前的可以使用下面的命令进行安装 brew install zsh 安装Oh My ZSH # curl sh -c "$(curl -fsSL https://ra…