文章

使用fail2ban为frp增加一道墙

使用fail2ban为frp增加一道墙

一、前期准备

在 frp 的配置文件中添加 log.to = "/var/log/frps.log" 这一行内容,目的是把 frp 的日志输出到指定的 /var/log/frps.log 文件,方便后续 fail2ban 读取日志进行分析。

二、安装 fail2ban

使用 yum 命令来安装 fail2ban,该工具可对 frp 提供防护功能。具体命令如下:

1
yum install fail2ban

三、配置 fail2ban

编写自定义过滤器

/etc/fail2ban/filter.d/frps.conf 文件中编写如下内容:

1
2
3
4
[Definition]
failregex = ^.*get a user connection \[<HOST>:[0-9]*\]
            ^.*get a new work connection: \[<HOST>:[0-9]*\]
ignoreregex =
  •  rd.break参数在控制权传递给内核之前中断引导过程。此时,当你运行passwd命令进行密码重置时,相关的影子文件(/etc/shadow)会被修改为错误的SELinux上下文。touch /.autorelabel命令在根目录下创建一个名为.autorelabel的隐藏文件。在下次启动时,SELinux子系统会检测到这个文件,然后重新标记系统中所有文件的正确SELinux上下文。在大型磁盘上,这个过程可能需要相当长的时间。​文档中还提到了一种替代完全重新标记的方法。首先,在编辑GRUB条目时使用参数rd.break enforcing=0。这将导致系统最终以SELinux设置为宽容模式(警告但不阻止)启动。然后,按照之前相同的方式更改密码。继续引导过程并允许系统启动。一旦系统启动,运行restorecon /etc/shadow以恢复/etc/shadow文件的正确SELinux上下文。然后,运行setenforce 1以重新启用SELinux并开始使用系统。shell
  • ignoreregex:为空表示不设置忽略的正则表达式规则。
添加 .local 文件

在 fail2ban 中添加 .local 文件,并进行如下配置:

1
2
3
4
5
6
7
8
9
10
11
[frp]
enabled = true
findtime = 10m
maxretry = 5
bantime = 3m
filter = frps
logpath = /var/log/frps.log
protocol = all
chain = all
port = all
action = iptables-allports[name=frp,protocol=tcp]
  • enabled = true:开启 frp 防护规则。
  • findtime = 10m:设定在 10 分钟内统计连接尝试次数。
  • maxretry = 5:10 分钟内连接尝试超过 5 次,判定为异常。
  • bantime = 3m:将异常 IP 封禁 3 分钟。
  • filter = frps:指定使用 frps 过滤器。
  • logpath = /var/log/frps.log:指定日志文件路径。
  • protocol = all:防护所有协议的连接。
  • chain = all:防护所有链。
  • port = all:防护所有端口。
  • action = iptables - allports[name=frp,protocol=tcp]:使用 iptables 封禁异常 IP 的所有 TCP 端口。

四、检查状态

使用 fail2ban - client 命令查看 frp 监狱的状态,该命令能显示当前被封禁的 IP 地址、尝试次数、封禁时间等信息:

1
sudo fail2ban-client status frp

输出信息包含:

  • Filter 部分
    • Currently failed:当前失败的连接尝试次数。
    • Total failed:总的失败连接尝试次数。
    • File list:日志文件路径,此处为 /var/log/frps.log
  • Actions 部分
    • Currently banned:当前被封禁的 IP 数量。
    • Total banned:总共被封禁的 IP 数量。
    • Banned IP list:被封禁的 IP 列表(若有)。

过段时间可以看到已经发力了:

image-20250507204534825

本文由作者按照 CC BY 4.0 进行授权