最近无缘故的看了一下sing-box服务端后台日志,发现很多尝试连接的错误日志,虽然都是失败的,但是还是看着揪心,于是把错误日志信息都输出到“sing-box_error.log"文件,接下来就请Gemini搬我完善拦截规则了。

Prompt:

附件sing-box_error.log是sing-box日志中尝试访问anytls、shadowsocks和Hysteria2服务尝试访问者报错日子,使用fail2ban增加规则可以识别日志,尝试超过5次后加入屏蔽名单

于是就有了下文,基本无修改就可以识别进行正常拦截了。

1. 更新过滤规则 (/etc/fail2ban/filter.d/sing-box.conf)

您的日志中包含大量 Shadowsocks 的认证失败、头部错误以及 AnyTLS 的握手错误。针对 Hysteria2,日志中大部分错误似乎没有直接附带源 IP(如 handle stream request),但 AnyTLS 和 Shadowsocks 的记录非常清晰。

请使用以下内容覆盖或更新您的 filter 文件:

[Definition]
# 匹配 Shadowsocks 和 AnyTLS 的恶意探测/错误
# <HOST> 是 Fail2Ban 用于提取 IP 的变量

failregex = ^.*inbound/shadowsocks\[.*\]: process (connection|packet) from <HOST>:\d+: .*cipher: message authentication failed.*$
            ^.*inbound/shadowsocks\[.*\]: process (connection|packet) from <HOST>:\d+: .*bad header.*$
            ^.*inbound/shadowsocks\[.*\]: process (connection|packet) from <HOST>:\d+: .*salt not unique.*$
            ^.*inbound/shadowsocks\[.*\]: process (connection|packet) from <HOST>:\d+: .*packet too short.*$
            ^.*inbound/anytls\[.*\]: process connection from <HOST>:\d+: .*unknown user password.*$
            ^.*inbound/anytls\[.*\]: process connection from <HOST>:\d+: .*fallback disabled.*$
            ^.*inbound/anytls\[.*\]: process connection from <HOST>:\d+: .*TLS handshake:.*$

# 忽略规则 (ignoreregex)
# 如果您想通过正则忽略某些特定情况(例如忽略本地 IP 127.0.0.1 的错误),可以使用如下格式:
# ignoreregex = ^.*process connection from 127\.0\.0\.1.*$
# 但通常建议在 jail.local 中使用 ignoreip 来处理白名单。

ignoreregex =

2. 配置 Jail 适配 Debian + UFW (/etc/fail2ban/jail.local)

在 Debian 系统中使用 ufw 作为防火墙时,需要在 jail.local 中明确指定 banactionufw。同时,我已添加了您要求的 ignoreip 设置位置。

编辑或创建 /etc/fail2ban/jail.local

Ini, TOML

[DEFAULT]
# 白名单 IP 设置 (ignoreip)
# 在这里添加您自己的 IP、家里/公司的固定 IP,防止自己被封。
# 多个 IP 或网段用空格隔开,例如: 127.0.0.1/8 192.168.1.0/24 1.2.3.4
ignoreip = 127.0.0.1/8 ::1

[sing-box]
enabled = true
filter = sing-box
logpath = /var/log/sing-box.log

# 针对 Debian + UFW 的关键配置
banaction = ufw

# 封禁策略
maxretry = 5
findtime = 600
bantime = 3600

# 日志时间格式处理
# 您的日志使用了 "+0800" 时区格式,建议指定 datepattern 以防识别失败
datepattern = ^%%z %%Y-%%m-%%d %%H:%%M:%%S

关于 banaction = ufw 的说明:

Fail2Ban 默认通常使用 iptables-multiport。在启用了 UFW 的 Debian 上,使用 ufw action 可以让封禁规则直接体现在 ufw status 中,更便于管理。


3. 应用与验证

  1. 确保 UFW 已启用:

    Fail2Ban 的 ufw 动作依赖于 ufw 本身是运行状态。

    sudo ufw status
    # 如果是 inactive,请先配置并开启 ufw (注意先允许 SSH 端口!)
    # sudo ufw allow ssh
    # sudo ufw enable
    
  2. 重启 Fail2Ban

    sudo systemctl restart fail2ban
    
  3. 检查 Jail 状态

    sudo fail2ban-client status sing-box
    
  4. 验证封禁是否生效:

    您可以使用以下命令手动测试正则是否能匹配到文件中的 IP(假设您已将上传的日志保存为 /var/log/sing-box.log):

    fail2ban-regex /var/log/sing-box.log /etc/fail2ban/filter.d/sing-box.conf
    

    如果看到 Matched 部分有大量数字(如 Matched: 500 lines),则说明配置成功。

  5. 查看 UFW 中的封禁列表:

    当有 IP 被封禁时,您可以通过以下命令查看 UFW 添加的规则:

    sudo ufw status numbered
    

    您会看到类似 Anywhere (v6) DENY IN ... 的规则。