IP门禁:手把手教你用PHP实现一个IP防火墙( 三 )


<?php$worker_ip = new Worker();$worker_ip->name = 'report';$worker_ip->onWorkerStart = function () {Timer::add(5, function () {$disable_cache_key = 'disable_ip_list';$list_ip = AppIp::where('status', 1)->column('ip');Cache::set($disable_cache_key, $list_ip);foreach ($list_ip as$ip) {$ip_md5 = md5($ip);$in_length = Cache::pull("$ip_md5-in");// 请求的数据$to_length = Cache::pull("$ip_md5-to");// 返回的数据if (!empty($in_length) || !empty($to_length)) {$model_ip = AppIp::where('ip', $ip)->find();$model_ip->in_buffer += $in_length;$model_ip->to_buffer += $to_length;$model_ip->save();}}});};他做的事情很简单,读取缓存,更新数据到数据库,并且更新IP白名单 。这里不需要考虑它和数据库之间的性能问题,这是额外的进程,不影响端口的连接和转发 。
下一步,更好的性能设计以上,只有几行代码,几个小时(如果不含设计系统的时间,代码量可能只有一两个小时) 。还能再怎么优化呢?实际上还是可以优化的 。
更好的内存驱动这里使用的是ThinkPHP内置的文件缓存,存储到磁盘上,以上方法,在大量连接并发时,肯定受制于磁盘的性能 。所以自然而然,我们可以使用内存缓存 。
但是使用内存缓存,redis可以吗?并不好 。这里是客户端,它只是想简简单单实现一个拦截转发,还要再部署redis,不可取 。
但实际上,workerman本身内置了数据共享组件,这是一个很好的方案 。相当于一个极简的redis 。完美符合我们的需求 。但是我并没有实现这个功能,目前的系统已经符合我的场景 。
更好的客户端目前拦截IP客户端和管理面板集成在一起,使用相同的配置,面板基于ThinkPHP,客户端只是ThinkPHP的一个命令 。我之所以这样做,是希望直接在Workerman中使用ThinkPHP的众多特性(数据库、缓存) 。
实际上,我们可以将客户端的代码,另外开一个项目,使客户端和面板独立开 。在面板上实现通用得API 。客户端通过API操作数据 。这样客户端就不需要连接数据库 。好处多多 。
但是这样也带来的更多的工作量,这种情况下,我们自然而然的认为客户端的环境不安全,所以要做权限认证,登录认证 。接口开发也要写更多的代码 。
总结这篇文章主要介绍了我实现IP防火墙的思路 。这些技术,需要开发者有丰富的网站开发经验,这个要求不高,但是也要有基本的网络开发经验,这就有一定的门槛 。Workerman非常简单,但是Workerman不是HTTP,这不是一般的网站开发,需要一定的学习和思路转变 。但是对于我来说,轻车驾熟 。如果我去找其他的方案,学习、部署、测试,可能还不如我自己开发来更快 。
IP白名单是怎么管理的呢,既可以通过面板添加,也可以访问面板的一个页面,自动获取出网IP添加到白名单中,使用体验和很好 。
实际上还有更好的方式,那就是做一个rss服务器,自动获取订阅rss的客户单的出网IP加入到白名单 。但是我本身没有使用rss的习惯,并且手机上也没有好的rss阅读器,也不想每次更新IP白名单都要特意打开它,也就没使用这个方案 。
我把它开源了,如果有需要可以参考:
https://gitee.com/augushong/ip-door
更多这个系统,跟iptables相比,只是有一个更方便的IP白名单管理体验而已,相当于一个简单堡垒机 。他可以实现,将一些端口隐藏起来,只有“我”能连接 。
比如将ssh的端口隐藏起来,通过ip门禁转发过去 。再比如将80端口隐藏起来,通过ip门禁转发过去 。
目前我的系统还没有实现多个端口的同时绑定转发,但是核心的思路是一样的,可以参考使用 。
 

原文标题:IP门禁:手把手教你用PHP实现一个IP防火墙
原文地址:
https://phpreturn.com/index/a62e1ddd672933.html
原文平台:PHP武器库
版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处 。




推荐阅读