使用fail2ban解决基于frp内网穿透的远程桌面爆破问题

使用fail2ban解决基于frp内网穿透的远程桌面爆破问题

需求分析

家中Windows server通过RDP远程桌面进行连接,为方便随时使用,使用frp内网穿透暴露到公网中。但会受到爆破攻击,windows安全策略在失败过多后会锁定账户一段时间,引起不便。

尝试在Windows端进行安全策略的配置,但基于frp的连接,IP等效于127.0.0.1即本地,故在Windows进行处理比较麻烦。

故尝试在内网穿透中转服务器上进行处理和拦截。

Fail2Ban简介

Fail2Ban 扫描/var/log/auth.log等日志文件,并禁止进行过多失败登录尝试的 IP 地址。它通过更新系统防火墙规则以在可配置的时间内拒绝来自这些 IP 地址的新连接来实现此目的。 Fail2Ban 开箱即用,可以读取许多标准日志文件,例如 sshd 和 Apache 的日志文件,并且可以轻松配置为读取任何日志文件。

安装fail2ban

1
2
3
4
5
6
# CentOS
yum install -y fail2ban
# Ubuntu
sudo apt-get install -y fail2ban
# 验证
fail2ban-client -h

编写FRP防爆规则配置文件

规则是使用正则匹配对应的服务名称,所以FRPC启用的名称需要相应匹配,比如SSH服务的FRPC启动服务名为HOME_SSH,则正则为failregex = ^.*\[.*HOME_SSH.*\] get a user connection \[<HOST>:[0-9]*\]

防SSH爆破规则文件

  1. 编写规则配置文件

    注意规则文件名称,下面定义配置文件时需要使用

    1
    vim /etc/fail2ban/filter.d/frps-ssh-ban.conf
  2. 写入以下代码

    1
    2
    3
    [Definition]
    failregex = ^.*\[.*SSH.*\] get a user connection \[<HOST>:[0-9]*\]
    ignoreregex =

防FTP爆破规则配置文件

  1. 编写规则文件

    注意规则文件名称,下面定义配置文件时需要使用

    1
    vim /etc/fail2ban/filter.d/frps-ftp-ban.conf
  2. 写入以下代码

    1
    2
    3
    [Definition]
    failregex = ^.*\[.*FTP_21.*\] get a user connection \[<HOST>:[0-9]*\]
    ignoreregex =

防RDP爆破规则配置文件

  1. 编写规则文件

    注意规则文件名称,下面定义配置文件时需要使用

    1
    vim /etc/fail2ban/filter.d/frps-rdp-ban.conf
  2. 写入以下代码

    1
    2
    3
    [Definition]
    failregex = ^.*\[.*RDP.*\] get a user connection \[<HOST>:[0-9]*\]
    ignoreregex =

编辑配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# FRP SSH防爆破
[frps-ssh-ban]
# 是否启用
enabled = true
# 检测时长
findtime = 3m
# 允许的最大重试次数,超过则封锁
maxretry = 3
# 封锁时长
bantime = 120m
# 过滤规则文件,即上面定义的规则文件
filter = frps-ssh-ban
# 存放日志的路径
logpath = /var/log/frps.log
# 匹配协议
protocol = all
# 端口号
port = all
# 拦截动作(基于iptables)
chain = all
action = iptables-allports[name=frps,protocol=tcp]

# FRP RDP防爆破
[frps-rdp-ban]
# 是否启用
enabled = true
# 检测时长
findtime = 3m
# 允许的最大重试次数,超过则封锁
maxretry = 6
# 封锁时长
bantime = 30m
# 过滤规则文件,即上面定义的规则文件
filter = frps-rdp-ban
# 存放日志的路径
logpath = /var/log/frps.log
# 匹配协议
protocol = all
# 端口号
port = all
# 拦截动作(基于iptables)
chain = all
action = iptables-allports[name=frps,protocol=tcp]

# FRP FTP防爆破
[frps-ftp-ban]
# 是否启用
enabled = true
# 检测时长
findtime = 5m
# 允许的最大重试次数,超过则封锁
maxretry = 30
# 封锁时长
bantime = 60m
# 过滤规则文件,即上面定义的规则文件
filter = frps-ftp-ban
# 存放日志的路径
logpath = /var/log/frps.log
# 匹配协议
protocol = all
# 端口号
port = all
# 拦截动作(基于iptables)
chain = all
action = iptables-allports[name=frps,protocol=tcp]

测试

  1. 验证fail2ban是否成功运行

    1
    sudo fail2ban-client ping

    返回Server replied: pong则表示正常

  2. 测试并查看日志文件

    查看日志

    1
    sudo tail -f /var/log/fail2ban.log

查看被Fail2ban封锁的IP

  1. 查看SSH被Fail2ban封锁的IP

    1
    sudo fail2ban-client status frps-ssh-ban
  2. 查看RDP被Fail2ban封锁的IP

    1
    sudo fail2ban-client status frps-rdp-ban
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    sudo fail2ban-client status frps-rdp-ban
    Status for the jail: frps-rdp-ban
    |- Filter
    | |- Currently failed: 4
    | |- Total failed: 968
    | `- File list: /var/log/frps.log
    `- Actions
    |- Currently banned: 2
    |- Total banned: 7
    `- Banned IP list: 193.3.19.26 80.94.95.39
  3. 查看FTP被Fail2ban封锁的IP

    1
    sudo fail2ban-client status frps-ftp-ban

解封IP

1
sudo fail2ban-client set sshd unbanip 193.3.19.26

可能存在的问题

frps未开启日志功能导致Fail2ban无法起作用

方法:修改配置文件,指定日志路径,与Fail2ban中的配置相匹配,重启frps服务

1
2
3
4
#日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3

参考文章

https://www.alainlam.cn/?p=620


使用fail2ban解决基于frp内网穿透的远程桌面爆破问题
http://example.com/2024/07/28/使用fail2ban解决基于frp内网穿透的远程桌面爆破问题/
作者
Sanli Ma
发布于
2024年7月28日
许可协议