目 录CONTENT

文章目录

外网OpenWRT预防攻击

成培培
2024-10-24 / 0 评论 / 0 点赞 / 41 阅读 / 0 字

需求来源

家里软路由是安装的OpenWRT系统,我会把它的web页面以及ssh连接方式映射到外网以方便我随时使用,比如远程打开电脑、一键远程执行脚本等,所以我太喜欢用VPN,但是这就导致经常性的有外部的IP会尝试登录进来,系统日志里有大量的这种日志,所以考虑有没有方案能将这种非法的IP给拉黑。

部署架构

家里除了OpenWRT,还有WebDAV、docker registry、filebrowser、博客等HTTP服务可能会映射出去,所以这里我直接在软路由里部署了Nginx反向代理了以上的所有服务,将入口统一,这样如果有可疑IP,我可以直接在Nginx里配置黑名单拦截

实现方式

在Nginx中的conf.d中增加一个黑名单文件ip_blacklist.conf,如果nginx.conf配置文件的http配置中有include /etc/nginx/conf.d/*.conf; 则会被自动引入,只需要在黑名单文件中增加如下IP配置即可:

deny 113.204.34.150;

deny 114.93.1.7;

deny 49.71.17.70;

deny 49.71.17.8;

deny 112.46.70.2;

deny 180.141.130.32;

现在问题是怎么识别到可疑IP,并且将它自动添加到我们的黑名单配置文件中,这里我主要自动采集进入我的OpenWRT页面,并且密码输入错误的IP,所以首先我需要监听到openwrt密码输入错误这个事件。

我这里时修改了openwrt页面源码,在页面中注入了以下代码:

<%- if fuser then %>
<script type="text/javascript">

	const Http = new XMLHttpRequest();

	Http.open("GET", '/api/applets/send/subMsg?title=密码错误告警&context=有人在尝试输入错误的web页面密码!!!');

	Http.send();

</script>
<% end -%>

对应的页面代码在:/usr/lib/lua/luci/view/themes/argon/sysauth.htm

因为我使用的主题是argon,所以代码在这,如果是其他主题就到对应主题的文件夹中找,这里的if fuser 判断就是密码错误是触发的脚本注入,脚本的作用就是发送一个ajax请求到当前服务的指定地址,因为是Nginx代理了,所以这里/api前缀的请求我特地转发到我搭建的一个小服务里,该接口主要做了两件事:

  1. 获取当前请求的IP地址,将其添加到/etc/nginx/conf.d/ip_blacklist.conf,并重启nginx

  2. 给我发送一条消息,告诉我有人在尝试输入错误的web页面密码

发不发消息无所谓,主要是第一个操作,当该IP第二次再访问我的页面是就会被Nginx拦截下来,报错"403 Forbidden"了

然后是ssh登录的攻击预防,我这里是直接把密码登录给禁用了,只允许使用密钥登录即可

0

评论区