为 frp 后的 SSH 配置 fail2ban

家里的 NAS 一直被 SSH 爆破,即使我已经把密码登录关了,还是在不停地刷 SSH 登录失败的系统日志。

于是尝试配置 fail2ban 解决这个问题。

fail2ban 配置

参考了这篇博客(使用 fail2ban 保护 frp 服务)并做了一些修改,从 systemd 而不是从文件读取日志,去掉了 get a new work connection 的匹配(因为 work connection 是从 frpc 发起的连接)。

文件 /etc/fail2ban/jail.d/frps.conf

[frps]
enabled = true
findtime = 10m
maxretry = 100
bantime = 1d
backend = systemd
filter = frps
journalmatch = _SYSTEMD_UNIT=frps.service
port = all
action = iptables-allports[name=frp,protocol=tcp]

文件 /etc/fail2ban/filter.d/frps.conf

[Definition]

failregex = ^.*ssh] get a user connection \[<HOST>:[0-9]*\]
ignoreregex =

注意 failregex 开头的 ssh] 部分,用于匹配以 ssh 结尾的 frp 服务。

frps 配置

这台机器上的 frps 是由 systemd 启动的,日志默认从 stdout 输出,并被 systemd 读取和存储。

我们只需要设置 log_level = debug 以启用 get a user connection 这类日志就好。

文件 frps.ini

[common]
log_level = debug
...

效果

$ sudo fail2ban-client status frps
Status for the jail: frps
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     1344
|  `- Journal matches:  _SYSTEMD_UNIT=frps.service
`- Actions
   |- Currently banned: 1
   |- Total banned:     1
   `- Banned IP list:   <此处是攻击者 IP>