为了方便管理我的OpenWRT,我使用了IPV4/IPV6公网直接访问我的OpenWRT。但是又觉得LUCI页面暴露在公网不够安全,所以研究了一下fail2ban发现用这个工具可以一定程度的保护好登录页面的安全。
安装了fail2ban之后发现并没有适用于luci登录页面的规则,于是乎我看了一下其它规则,发现都是基于正则表达式匹配错误日志,而我本人对正则表达式略有研究,所以直接自己写了一个luci的登录失败匹配规则。
废话不多说,直接上教程。
1.安装fail2ban
# 1 登录你的 OpenWRT
ssh root@192.168.1.1
# 2 更新 opkg
opkg update
# 3 安装 fail2ban
opkg install fail2ban
2.创建 luci 登录失败匹配规则
# 使用 vi / vim 编辑 luci 规则文件
vim /etc/fail2ban/filter.d/luci.conf
# ========== 文件内容 开始
# fail2ban filter configuration for luci
[INCLUDES]
# Read common prefixes. If any customizations available -- read them from
# common.local
before = common.conf
[Definition]
_daemon = luci
prefregex = ^%(__prefix_line)s<F-CONTENT>(?:[Ff]ailed).+</F-CONTENT>$
failregex = ^[Ff]ailed\s+login\s+on\s+/.*\s+for\s+.+\s+from\s+<HOST>(:\d+)?$
ignoreregex =
# ========== 文件内容 结束
3.创建 fail2规则
# 创建 fail2ban 规则目录 (默认不存在)
mkdir /etc/fail2ban/jail.d/
# 编辑 luci 规则
vim /etc/fail2ban/jail.d/luci.local
# ========== 文件内容 开始
[luci]
enabled = true
filter = luci
action = iptables[name=LUCI, port=http, protocol=tcp]
logpath = /tmp/log/system.log
maxretry = 5
bantime = 604800
# ========== 文件内容结束
fail2ban规则中 port=http 就是默认的80端口 如果你的登录页面是 443可以用 https 也可以直接使用 443或者80或者其它实际的端口号
maxretry 就是密码错误次数 错误次数达到这个就封禁这个IP
bantime 就是封禁时间 (秒)
logpath = 具体的日志文件路径
OpenWRT默认没有保存日志文件需要手动到 luci界面配置
默认将系统日志写入文件是灰色的,也就是不写入。我们需要填入 /tmp/log/system.log 到里面,然后保存应用之后,OpenWRT才会把日志写入我们指定的路径。
4.重启fail2ban 并查看规则是否生效
# 重启 fail2ban
fail2ban-client restart
# 查看 fail2ban 状态
fail2ban-client status
# 执行这个命令后应该看到 Jail list里面有 luci
# Status
# |- Number of jail: 2
# `- Jail list: luci, sshd
# 查看 luci 的错误次数以及封禁装
fail2ban-client status luci
#执行这个命令后应该会看到
# Status for the jail: luci
# |- Filter
# | |- Currently failed: 0
# | |- Total failed: 0
# | `- File list: /tmp/log/system.log
# `- Actions
# |- Currently banned: 0
# |- Total banned: 0
# `- Banned IP list:
# 然后为了验证效果 你可以在OpenWRT的登录页面输错密码登录后 再执行 fail2ban-client status luci 就会看到 Currently failed 和 Total failed 数量增加了 错误次数达到 设定的值 就会封禁这个IP
至此大功告成