成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

IP門禁:保姆式教你用PHP實現一個IP防火墻

最近我遇到一個需求,我的一臺服務器總是遭到端口掃描和惡意登錄攻擊,對此可以怎么辦呢?似乎除了內網隔離、增強密碼認證、證書登錄、設置防火墻iptables,網上找不到什么別的方案,對了,還用堡壘機的方案。

這些方案實際上都無法解決我的問題。這是一臺公網服務器,并沒有什么復雜的網絡結構,所以不能建立內網隔離。調整賬號的密碼策略,自然是一個方案,但是人工操作太麻煩,而且我一般經常換電腦使用,如果修改密碼,公司的和家里的電腦都要更新,很麻煩。設置防火墻自然是運維的基本操作,但是iptables的配置太麻煩,ufw工具還好些,firewall-cmd就麻煩些,而且有一個巨大的痛點,眾所周知,大家的出網IP都會經常變,好不容易在命令行里一個字母一個字母的配置好了,睡了一覺,白費了。堡壘機更不是一個主流的方案,有點大材小用,用了堡壘機,反而不能隨意使用系統,更何況還沒聽說過那個免費的堡壘機呢。【推薦:PHP視頻教程】

那怎么辦呢,作為一個資深的PHP開發者,服務器這塊的應用還不是手到擒來,當初連內網穿透都能輕松實現,一個IP過濾系統,小意思。所以我打算自己開發這樣一個項目,首先能夠實現IP過濾,另外,可以輕松地將IP加入到白名單里,比如訪問一個網頁,就自動加入到白名單。

整個項目不到幾個小時就研發完了,起碼滿足了我自己的需求,并且實現了這樣幾個特性:

  • 多進程
  • 支持并發
  • 守護進程
  • 可以通過網頁面板管理IP
  • 流量統計
  • 攔截記錄

現在我們來一步一步的實現這個系統。

第一步,首先能夠簡簡單單的過濾IP

使用PHP監聽端口并且轉發數據的框架很多,對此我選擇workerman,原因有3

  • 運行簡單穩定
  • 方法接口簡單
  • 內置進程守護

至于具體的安裝方法,可以參考他的官方文檔。

版權聲明:本文由phpreturn.com(PHP武器庫官網)原創和首發,所有權利歸phpreturnPHP武器庫)所有,本站允許任何形式的轉載/引用文章,但必須同時注明出處。

IP門禁:保姆式教你用PHP實現一個IP防火墻

workerman的使用方法非常簡單,只要10行代碼,就實現了IP轉發+白名單過濾:

$worker = new Worker('tcp:0.0.0.0:' . Config::get('door.port_in')); // 監聽一個端口 $worker->count = 2; // 設置多進程 $worker->onConnect = function (TcpConnection $connection) {     // 獲取IP白名單     $list_ip = AppIp::where('status', 0)->cache(3)->column('ip');     $remote_ip = $connection->getRemoteIp();     // 攔截IP     if (!in_array($remote_ip, $list_ip)) {         $connection->close();     }     // 放行連接,連接內部目標端口     $to_connection = new AsyncTcpConnection('tcp:127.0.0.1:' . Config::get('door.port_to'));     // 互相轉發流量     $connection->pipe($to_connection);     $to_connection->pipe($connection);     $to_connection->connect(); }

正如上面代碼所示,只有簡單幾行,便實現了IP監聽和轉發,其中IP白名單通過數據庫查詢,并且緩存。

第二步,與ThinkPHP命令行整合在一起

為了項目開發方便,我都會使用ThinkPHP框架進行開發,它夠簡單,功能也比較齊全。

IP門禁:保姆式教你用PHP實現一個IP防火墻

最終實現的命令行效果如下:

版權聲明:本文由phpreturn.com(PHP武器庫官網)原創和首發,所有權利歸phpreturnPHP武器庫)所有,本站允許任何形式的轉載/引用文章,但必須同時注明出處。

運行命令 php think door start php think door start --mode d  // 守護進程重啟 重啟 php think door restart 停止 php think door stop

workerman的命令參數與thinkphp并不兼容,但是實現這樣的效果并不難,實際上很簡單,代碼如下:

<?php  declare(strict_types=1);  namespace appcommoncommand;  use thinkconsoleCommand; use thinkconsoleInput; use thinkconsoleinputArgument; use thinkconsoleinputOption; 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的代碼     } }

在上面的代碼中,主要做了兩件事:

  • 實現ThinkPHP的命令設置
  • 將命令參數重新構造為workerman兼容的方式

第三步,實現管理面板

使用PHP實現一個管理面板太簡單了,PHP到處都是這樣的后臺框架,這里我選擇ulthon_admin,這是我自己開發維護的,它基于ThinkPHP6,很簡單,為定制而生,不搞所謂的“插件”和“市場”生態,能夠自動生成CURD代碼,并且內置幾了幾個有趣的皮膚。

最終效果如下:

IP門禁:保姆式教你用PHP實現一個IP防火墻IP門禁:保姆式教你用PHP實現一個IP防火墻

以上是ulthon_admin內置的兩款皮膚效果,分別是:科幻、像素。

對于面板的管理,這里多做介紹,這算是PHP開發者的基本功,誰還不會個CURD啊。

版權聲明:本文由phpreturn.com(PHP武器庫官網)原創和首發,所有權利歸phpreturnPHP武器庫)所有,本站允許任何形式的轉載/引用文章,但必須同時注明出處。

第四步,進階,更好的性能和流量統計

我們的IP攔截客戶端需要運行在服務器上,并且直接連接數據庫,如果每次收到請求都要查詢數據庫,那么很有可能導致連接不通暢,尤其是客戶端和數據庫本身位置較遠的時候。在第一步的代碼中,我們只是簡單的使用了查詢緩存,但是還不夠,還可以優化。并且我們可以在管理面板的截圖中看到,我們是可以統計流量和攔截次數的,現在我們要實現這些功能:

流量統計

首先我們將第一個步中,流量轉發部分的代碼改造成如下的樣子:

<?php // 向TO發起連接 $to_connection = new AsyncTcpConnection('tcp://127.0.0.1:' . Config::get('door.port_to')); $to_connection->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(); };

在第一部的代碼中,只用兩行便實現了這些代碼:

// 放行連接,連接內部目標端口 $to_connection = new AsyncTcpConnection('tcp:127.0.0.1:' . Config::get('door.port_to')); // 互相轉發流量 $connection->pipe($to_connection); $to_connection->pipe($connection);

這里使用的是workerman內置的流量轉發,它很好用,但是這里我們要統計流量,所以我們手動轉發流量。

這里我們將統計的數據存儲到緩存里,而不是直接連接數據庫更新,這是為了更好的連接性能。我們會另外開啟一個進程將這些改動更新到數據庫。后面會介紹到。

攔截統計

我們將第一步中的加載IP白名單的邏輯改成下面這樣:

版權聲明:本文由phpreturn.com(PHP武器庫官網)原創和首發,所有權利歸phpreturnPHP武器庫)所有,本站允許任何形式的轉載/引用文章,但必須同時注明出處。

<?php $worker->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白名單,并且將流量統計提交到數據庫。這就是這個進程:

<?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內置的文件緩存,存儲到磁盤上,以上方法,在大量連接并發時,肯定受制于磁盤的性能。所以自然而然,我們可以使用內存緩存。

版權聲明:本文由phpreturn.com(PHP武器庫官網)原創和首發,所有權利歸phpreturnPHP武器庫)所有,本站允許任何形式的轉載/引用文章,但必須同時注明出處。

但是使用內存緩存,redis可以嗎?并不好。這里是客戶端,它只是想簡簡單單實現一個攔截轉發,還要再部署redis,不可取。

但實際上,workerman本身內置了數據共享組件,這是一個很好的方案。相當于一個極簡的redis。完美符合我們的需求。但是我并沒有實現這個功能,目前的系統已經符合我的場景。

更好的客戶端

目前攔截IP客戶端和管理面板集成在一起,使用相同的配置,面板基于ThinkPHP,客戶端只是ThinkPHP的一個命令。我之所以這樣做,是希望直接在Workerman中使用ThinkPHP的眾多特性(數據庫、緩存

實際上,我們可以將客戶端的代碼,另外開一個項目,使客戶端和面板獨立開。在面板上實現通用得API。客戶端通過API操作數據。這樣客戶端就不需要連接數據庫。好處多多。

但是這樣也帶來的

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久久久无码精品国产AV蜜桃1 | 无码动漫性爽XO视频在线观看不 | 久久久国产精品VA麻豆| 久久亚洲精品成人无码网站夜色 | 国内精品伊人久久久久妇| 精品极品三大极久久久久| 久久大香香蕉国产拍国| 蜜臀AV 国内精品久久久| 欧美最猛黑人XXXⅩ猛男视频 | 成人无码区免费AⅤ片WWW| 国产成人精品A∨一区二区| 国产精品亚洲一区二区无码| 激情五月丁香六月综合AVXXXX| 久久久久久久精品免费久精品蜜桃 | WWW国产成人免费观看视频| 丰满熟妇人妻中文字幕| 国内精品久久久久影院蜜芽蜜芽T| 精品无码国产污污污在线观看| 乱码一卡2卡3卡4卡精品| 欧洲一卡二卡三卡| 投诉12345最狠的办法| 亚洲精品NV久久久久久久久久| 亚洲午夜精品久久久久久人妖| 日韩精品无码观看视频免费| 亚洲AV怡红院AV男人的天堂| 成人无码区免费AⅤ片在线观看 | 男人边吃奶边做呻吟免费视频| 人与物VIDEOS另类XXXX| 美女黑人做受XXXXXⅩ性| 日韩欧美亚洲国产精品字幕久久久 | 三上悠亚AV资源站| 亚洲AV无码国产精品永久一区| 在线播放亚洲第一字幕| 成人精品动漫一区二区| 狠狠色丁香久久婷婷综合| 嫩B人妻精品一区二区三区| 色综合色欲色综合色综合色综合R 色综合色欲色综合色综合色综合 色综合色天天久久婷婷基地 | 厨房掀起少妇裙子挺进去| 国模小黎大尺度精品(02)[| 免费黄色电影在线观看| 私人微信放款24小时在线| 亚洲色婷婷六月亚洲婷婷6月| 美女扒开内裤无遮挡| 久久久久精品精品6精品精品 | 2012电影在线观看神马影院| 国产成人AV大片在线播放| 久久久WWW免费人成精品| 日本久久久久精品免费网播放 | 色欲国产麻豆一精品一AV一免费 | 精品久久久久久中文字幕无码软件| 欧美激情ⅩXXXX免费视频| 无码夜色一区二区三区| 最新国产精品亚洲| 国产欧美日韩综合精品二区| 妺妺窝人体色WWW写真| 无码人妻少妇久久中文字幕蜜桃| 在厨房我撕开岳的丁字裤| 国产V亚洲V天堂无码久久久| 老师扒开粉嫩粉嫩的泬| 我们还没在书房试过| 中文字幕一精品亚洲无线一区| 国产精品久久久久久吹潮| 免费观看添你到高潮视频| 玩乡下黄花小处雏女| 97色偷偷色噜噜狠狠爱网站97 | 老太太BGMBGMBGM11| 无人区码一码二码三码是什么| 99精品无人区乱码在线观看 | 超碰97人人做人人爱亚洲尤物| ASSPICS亚洲美女裸体CH| 国模无码视频一区| 人人做人人澡人人爽欧美| 亚洲人成网站18禁止大APP| 夫上司人妻秘书OL中文有码| 麻豆国产97在线 | 中文| 性色欲情网站IWWW| 波多野结衣av在线| 麻豆国产一卡二卡三卡 | 影音先锋手机AV资源站| 国产免费AV片在线观看麻豆| 人妻夜夜爽天天爽三区麻豆AV网| 野花日本大全免费观看10电影| 国产精品制服一区二区| 日本大学SGU大二大三| 在线天堂おっさんとわたしWWW | 亚洲AV午夜福利精品一区二区| 波多野结系列18部无码观看A| 浪货趴办公桌~H揉| 亚洲AV无码AV日韩AV网站| 第一章少妇初尝云雨| 男男喷液抽搐高潮呻吟AV| 亚洲欧洲无码AV电影在线观看| 国产精品久久久久久妇女| 日本老熟妇乱子伦精品| 越南少妇毛茸茸的大BBW| 精品国产国语对白久久免费| 无人区一码二码三码四码区| 成人网站亚洲二区乱码| 女人被狂躁c到高潮视频| 一边下奶一边吃面膜视频讲解| 好深好大再浪一点| 无码人妻一区二区三区在线视频| 成人免费无码AV| 欧美激情精品久久| 中文字幕V亚洲日本| 精品无人区卡一卡二卡三乱码| 亚洲 欧美 动漫 少妇 自拍| 国产成人综合久久久久久| 搡老女人老熟妇HHD| 宝贝把腿张开我要添你下边动态图 | 日本乱妇乱子视频网站-百度| 99精品欧美一区二区三区| 美女高潮无遮挡喷水视频| 一区二区三区无码被窝影院| 久久国产精久久精产国| 亚洲卡1卡2乱码新区仙踪| 黑人大雞巴ⅩⅩⅩ| 亚洲AV秘 无码一区二区三密桃| 国产精品白丝AV嫩草影院| 少妇午夜AV一区| 办公室撕开奶罩揉吮奶头在线观看 | 国产亚洲成AⅤ人片在线观看麻豆 国产亚洲成AⅤ人片在线观看 | 最新国产乱人伦偷精品免费网站| 老司机精品成人无码AV| 一本大道一卡2卡三卡4卡国产| 久久18禁高潮出水呻吟娇喘| 亚洲日韩精品A∨片无码加勒比| 激情五月综合 香亚洲| 亚洲国产一二三精品无码| 狠狠亚洲婷婷综合色香五月| 亚洲不卡无码永久在线| 狠狠色丁香婷婷久久综合| 亚洲国产精品久久久久制服| 精品成品国色天香卡一卡三| 亚洲精品无码永久电影在线| 久久99国产乱子伦精品免费| 亚洲综合成人AⅤ在线观看| 久久99精品国产麻豆不卡| 亚洲中文字幕无码AV正片| 老赵抱着媛媛在厨房做| 50岁老熟女一级毛片| 欧美一级 片内射黑人| 别揉我奶头~嗯~啊~动漫网站| 日韩人妻无码一区2区3区里沙| 大胸年轻继拇HD无码| 熟妇人妻无码中文字幕老熟妇| 国产999精品久久久久久| 无人区一码卡二卡三乱码| 国精品无码人妻一区二区三区| 亚洲精品无码日韩国产不卡AV| 久久精品国产亚洲夜色AV网站| 一本一道AV无码中文字幕﹣百度| 猫咪AV最新永久网址无码| BGMBGMBGM胖老太太XX| 日韩精品无码AV中文无码版| 工口全彩H肉无遮挡无翼乌 | 国产女主播高潮在线播放| 亚洲卡1卡2乱码新区仙踪| 毛茸茸性XXXX毛茸茸毛茸茸| CHINESE东北嫖妓女HD| 搡老女人老妇老熟女HHD| 国产美女精品一区二区三区| 亚洲人成人无码一区二区三区 | 中日AV乱码一区二区三区乱码| 欧美老妇BBBWWBBBWW| 俄罗斯PONONDLX| 亚洲AV成人无码深夜高潮| 久久久久精品国产AV麻豆| 92国产精品午夜福利| 色一情一乱一伦一区二区三区日本 | 少妇私密会所按摩到高潮呻吟| 国产帅男男Gay在线观看| 亚洲自偷自偷在线成人网站传媒 | 把女的下面扒开添视频| 无码成人亚洲AV污污污在线看| 精品无码国产日韩制服丝袜| 2022久久国产精品免费热麻豆| 日日摸日日碰夜夜爽无码| 国产一码二码三码区别| 伊人久久大香线蕉AV不卡| 日本免费人成视频在线观看| 国产日韩精品中文字无码| 尤物AV无码国产在线看| 日韩无码视频二区| 饥渴人妻被快递员玩弄的视频| 中文字幕乱码人妻一区二区三区| 日韩精品少妇无码受不了| 黑人与中国娇小美女AV在线| 18款禁用免费安装的软件APP| 熟女乱中文字幕熟女熟妇| 久久精品国产99国产精品导航 | 有人有在线观看的片吗WWW| 日产精品码2码三码四码区| 黑人刚破完处就三P| 99久E在线精品视频在线| 无码国产色欲XXXXX视频| 泷泽萝拉AV种子| 国产成人欧美一区二区三区| 曰本无码人妻丰满熟妇啪| 熟妇的荡欲BD高清|