您当前的位置:首页 >> 智慧农业
智慧农业

IP形同虚设:手把手教你用PHP实现一个IP防火墙

发布时间:2025-11-16

ption;use thinkconsoleOutput;class Door extends Command{ protected function configure() { // 指令内嵌 $this->setName('door') // 所设think的下令给定 ->addArgument('action', Argument::OPTIONAL, "start|stop|restart|reload|status|connections", 'start') ->addOption('mode', 'm', Option::VALUE_OPTIONAL, 'Run the workerman server in daemon mode.') ->setDescription('the door command'); } protected function execute(Input $input, Output $output) { // 指令转换器 $output->writeln('door'); $action = $input->getArgument('action'); $mode = $input->getOption('mode'); // 重新构造下令讫给定,以马上兼容workerman的下令 global $argv; $argv = []; array_unshift($argv, 'think', $action); if ($mode == 'd') { $argv[] = '-d'; } else if ($mode == 'g') { $argv[] = '-g'; } // ...workerman的code }}

在后面的code中所,主要好好了一一:

付诸ThinkPHP的下令所设将下令给定重新构造为workerman兼容的方式将第三步,付诸管理工作元件

用到PHP付诸一个管理工作元件有点简马上了,PHP乡间都是这样的后台构建,这中都我并不并不需要ulthon_admin,这是我自己掀共同开发公共安全的,它基于ThinkPHP6,很简马上,为定制而生,不花钱所谓的“插件”和“市场”生态,尽确实启动时生成CURDcode,并且内嵌几了几个有趣的肌肤。

终于真实感如下:

以上是ulthon_admin内嵌的两款肌肤真实感,分别是:科幻、像素。

对于元件的管理工作,这中都多好好介绍,这算是PHPValve的基本功,谁还不就会个CURD啊。

第四步,高阶,尽确实的耐用性和容生产量大粗略估计

我们的IP截获消费者端并不需要掀开始运讫在IP上,并且同样连结资料库,如果每次收到请求都要核对资料库,那么很有确实造成了连结不不畅,常常是消费者端和资料库本身位置较远的时候。在第一步的code中所,我们只是简马上地用到了核对调用,但是还实在,还可以最佳化。并且我们可以在管理工作元件的截图中所看得见,我们是可以粗略估计容生产量大和截获最少的,现今我们要付诸这些动态:

容生产量大粗略估计

首先我们将第一个步骤,容生产量大发文部份的code技术改造成如下的看上去:

onMessage = function ($source, $data) use ($connection, $remote_ip) { // 接收到来自TO的图表,返回的图表 $connection->send($data); // 将容生产量大粗略估计存储到调用中都 Cache::inc(md5($remote_ip) . '-to', strlen($data));};// 系统新设计和容生产量大控制$to_connection->onClose = function ($source) use ($connection) { $connection->close();};$connection->onBufferFull = function ($dest) use ($to_connection) { $to_connection->pauseRecv();};$connection->onBufferDrain = function ($dest) use ($to_connection) { $to_connection->resumeRecv();};$connection->onMessage = function ($source, $data) use ($to_connection, $remote_ip) { // 接收来自IN的图表,请求的图表 $to_connection->send($data); // 将容生产量大粗略估计存储到调用中都 Cache::inc(md5($remote_ip) . '-in', strlen($data));};// 系统新设计和容生产量大控制$connection->onClose = function ($source) use ($to_connection) { $to_connection->close();};$to_connection->onBufferFull = function ($dest) use ($connection) { $connection->pauseRecv();};$to_connection->onBufferDrain = function ($dest) use ($connection) { $connection->resumeRecv();};

在第一部的code中所,只用右方马上付诸了这些code:

// 放讫连结,连结内部尽确实终端$to_connection = new AsyncTcpConnection('tcp:127.0.0.1:' . Config::get('door.port_to'));// 互相发文容生产量大$connection->pipe($to_connection);$to_connection->pipe($connection);

这中都用到的是workerman内嵌的容生产量大发文,它很差用,但是这中都我们要粗略估计容生产量大,所以我们手动发文容生产量大。

这中都我们将粗略估计的图表存储到调用中都,而不是同样连结资料库新版本,这是为了尽确实的连结耐用性。我们就会另外掀开启一个发挥作用将这些删改新版本到资料库。后面就会介绍到。

截获粗略估计

我们将第一步中所的加载IP白名单的逻辑改成下面这样:

onConnect = function (TcpConnection $connection) { $disable_Cache_key = 'disable_ip_list'; $list_ip = Cache::get($disable_cache_key); if (empty($list_ip)) { $connection->close(); } $remote_ip = $connection->getRemoteIp(); if (!in_array($remote_ip, $list_ip)) { AppIpReject::initRecord($remote_ip); $connection->close(); }};

在这中都我们不连结资料库核对,而是同样从本地调用读取白名单,这样就会有尽确实的耐用性。我们就会在另一个发挥作用中所新版本这份白名单。

另外我们可以看得见,截获的IP线程了一个静态方法,这中都的动态很简马上,断定资料库中所该IP是否存有,如果不存有则新增,如果存有,则新版本截获最少+·1。这中都就不多介绍了。这中都也很难必要好好什么耐用性最佳化,反正本来就是截获的IP,最佳化个小叶。

高耐用性解决问题调用图表

后面我们介绍,我们就会另外掀开启一个发挥作用,公共安全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白名单。这中都不并不需要考虑它和资料库之间的耐用性疑问,这是额外的发挥作用,不制约终端的连结和发文。

下一步,尽确实的耐用性新设计

以上,只有几讫code,几个星期(如果不内含新设计系统就会的时间,code生产量确实只有一两个星期)。还能马上怎么最佳化呢?显然还是可以最佳化的。

尽确实的调用驱动

这中都用到的是ThinkPHP内嵌的副本调用,存储到存储器上,以上方法,在大生产量连结即刻时,肯定受制于存储器的耐用性。所以理所当然,我们可以用到调用调用。

但是用到调用调用,redis可以吗?并不好。这中都是消费者端,它只是一心简简马上单付诸一个截获发文,还要马上调遣redis,不不对。

但显然,workerman本身内嵌了图表共享组件,这是一个很差的解决方案。大概一个极简的redis。完美符合标准我们的消费。但是我并很难付诸这个动态,迄今为止的系统就会已经符合标准我的过场。

尽确实的消费者端

迄今为止截获IP消费者端和管理工作元件内置在独自一人,用到不尽相同的内嵌,元件基于ThinkPHP,消费者端只是ThinkPHP的一个下令。我之所以这样好好,是愿意同样在Workerman中所用到ThinkPHP的众多特点(资料库、调用)。

显然,我们可以将消费者端的code,另外掀开一个这两项,使消费者端和元件独立掀开。在元件上付诸通用得API。消费者端通过API操作图表。这样消费者端就不并不需要连结资料库。好处多多。

但是这样也带来的更为多的工作生产量,这种情况下,我们理所当然的视为消费者端的生态系统不安全,所以要好好权限认可,写明认可。分析方法程序掀共同开发也要写更为多的code。

概括

这篇短文主要介绍了我付诸IPSSL的初衷。这些技术,并不需要Valve有珍贵的的网站掀共同开发长处,这个要求不高,但是也要有基本的网络掀共同开发长处,这就有一定的门槛。Workerman十分相似,但是Workerman不是HTTP,这不是一般的的网站掀共同开发,并不需要一定的进修和初衷改变。但是对于我来说,较重车驾熟。如果我去找其他的解决方案,进修、调遣、测试,确实还不如我自己掀共同开发来更为快。

IP白名单是怎么管理工作的呢,既可以通过元件添加,也可以就会面时元件的一个网址,启动时得到出网IP添加到白名单中所,用到互动和很差。

显然还有尽确实的方式将,那就是好好一个rssIP,启动时得到订阅rss的消费者单的出网IP转至到白名单。但是我本身很难用到rss的习惯,并且手一号机上也很难好的rss阅读器,也一心要每次新版本IP白名单都要特意打掀开它,也就没用到这个解决方案。

我把它掀开源了,如果有并不需要可以参阅:

更为多

这个系统就会,跟iptables相比,只是有一个更为方马上的IP白名单管理工作互动而已,大概一个简马上碉堡一号机。他可以付诸,将一些终端暗藏上来,只有“我”能连结。

比如将ssh的终端暗藏上来,通过ip院外发文从前。马上比如将80终端暗藏上来,通过ip院外发文从前。

迄今为止我的系统就会还很难付诸多个终端的同时默认发文,但是一个中心的初衷是一样的,可以参阅用到。

原意标题:IP院外:手把手教你用PHP付诸一个IPSSL

原意电话号码:

原意平台:PHP散弹枪

著作权声明:本文由phpreturn.com(PHP散弹枪官网)原创和上半年,所有平等权利归phpreturn(PHP散弹枪)所有,本站受限制任何基本的转载/引用短文,但需同时加注引自。

泉州白癜风医院网站
福建治疗白癜风
福建治疗白癜风费用
福建白癜风医院哪家专业
泉州白癜风医院哪家治疗最好

上一篇: 恭喜唐佳丽!中国女足会合西甲第一人即将诞生,球王梅西奉上祝福

下一篇: 台州又没戏了 救火外援再次拒回CBA 难怪他们刚官宣新大外加盟

友情链接