ウェブサイトが悪意を持ってリクエストされた場合、IP アドレスをブラックリストに登録することは重要な対策です。リクエストをブラックリストに登録するたびに nginx を設定しなければならないのであれば、それは低すぎます。nginx IP ブラックリストをより便利に制御する必要があります。 1. 解決策 ブラックリストは MySQL に保存されます (一般的なソリューションは Redis ですが、有効期間が異なるさまざまな IP 設定、IP CRUD、統計などの制御には役立ちません)。 lua-nginx-module を通じて、nginx でメモリ ブロック (lua_shared_dict) が開かれ、lua は定期的に mysql から lua_shared_dict へのブラックリストを更新します。 すべてのリクエストは、lua_shared_dict 内の IP と照合する必要があります。 2. インストール 2.1 luajitをインストールする LuaJIT-2.0.5 をCDに追加 作る PREFIX=/usr/local/luajit をインストールします 2.2. nginxをインストールするときに、luaモジュールをコンパイルします。 LUAJIT_LIB=/usr/local/luajit/lib をエクスポートします。 LUAJIT_INC=/usr/local/luajit/include/luajit-2.1 をエクスポートします。 ./configure --prefix=/nginx \ --with-ld-opt="-Wl,-rpath,/usr/local/luajit/lib" \ --add-module=/opt/ngx_devel_kit-0.3.1rc1 \ --add-module=/opt/lua-nginx-module-0.10.14rc3 -j2 を実行します インストールする nginx は sbin にあります。 3. 構成 3.1 nginxの設定 http { server_tokens オフ; lua_package_path "/usr/local/lib/lua/?.lua;;"; lua_shared_dict ip_blacklist 4m; } サーバー{ $real_ip $remote_addr を設定します。 $http_x_forwarded_for が "^(\d+\.\d+\.\d+\.\d+)" の場合 { $real_ip を $1 に設定します。 } # 管理情報、この URL にアクセスして nginx の IP ブラックリスト情報を表示します location /get-ipblacklist-info { アクセス_by_lua_file conf/lua/get_ipblacklist_info.lua; } # URL を同期し、スケジュールされたタスクを通じて URL を呼び出し、mysql から nginx の場所 /sync-ipblacklist { への IP ブラックリストのスケジュールされた更新を実装します。 アクセス_by_lua_file conf/lua/sync_ipblacklist.lua; } # 本番ドメイン名の設定、IPブラックリスト制御が必要なすべての場所に次のステートメントを含める必要があります location / { lua ファイルによるアクセス conf/lua/check_realip.lua; } } nginxサーバーは次のcrrontabを設定します * * * * * /usr/bin/curl -o /dev/null -s http://127.0.0.1/sync-ipblacklist > /dev/null 2>&1 3.2 Luaスクリプト sync_ipblacklist.lua local mysql_host = "mysql サーバーの IP" ローカル mysql_port = 3306 ローカルデータベース = "dbname" ローカルユーザー名 = "user" ローカルパスワード = "password" --cache_ttl 秒ごとに mysql から ip_blacklist を更新します ローカルcache_ttl = 1 ローカル mysql_connection_timeout = 1000 ローカル client_ip = ngx.var.real_ip ローカル ip_blacklist = ngx.shared.ip_blacklist ローカル last_update_time = ip_blacklist:get("last_update_time"); last_update_time == nil または last_update_time < ( ngx.now() - cache_ttl ) の場合 ローカル mysql = "resty.mysql" を必要とします。 ローカル red = mysql:new(); 赤:set_timeout(mysql_connect_timeout); ローカル OK、エラー、エラーコード、SQL 状態 = 赤:接続{ ホスト = mysql_host、 ポート = mysql_port、 データベース = データベース、 ユーザー = ユーザー名、 パスワード = パスワード、 文字セット = "utf8"、 最大パケットサイズ = 1024 * 1024、 } 大丈夫でなければ ngx.log(ngx.ERR, "ip_blacklist の取得中に mysql 接続エラーが発生しました: " .. err); それ以外 new_ip_blacklist、err、errcode、sqlstate = red:query("ip_blacklist から ip_addr を選択、ステータス = 0、create_time で順序付け、desc 制限 10000、100") new_ip_blacklistでない場合は ngx.log(ngx.ERR, "不正な結果。errcode: " .. errcode .. " sqlstate: " .. sqlstate .. " err: " .. err); 戻る 終わり ip_blacklist:flush_all(); k1、v1のペア(new_ip_blacklist)に対して k2、v2のペア(v1)では ip_blacklist:set(v2,true); 終わり 終わり ip_blacklist:set("last_update_time", ngx.now()); 終わり 終わり ngx.say("同期が成功しました"); get_ipblacklist_info.lua -- ブラックリスト情報を表示するには URL を呼び出します -- 10,000 個の IP は 150 万個未満の ngx.shared メモリを消費します -- すべての KEY を取得すると、他の通常のリクエストが ngx.shared メモリにアクセスするのがブロックされるため、いくつかのキーのみを表示できます "resty.core.shdict" が必要です ngx.say("合計容量: " .. ngx.shared.ip_blacklist:capacity() .. "<br/>"); ngx.say("空き領域: " .. ngx.shared.ip_blacklist:free_space() .. "<br/>"); ngx.say("最終更新時刻: " .. os.date("%Y%m%d_%H:%M:%S",ngx.shared.ip_blacklist:get("last_update_time")) .. "<br/>"); ngx.say("最初の100個のキー: <br/>"); ngx.say("--------------------------<br/>"); ip_blacklist = ngx.shared.ip_blacklist:get_keys(100); キーと値のペア(ip_blacklist)の場合 ngx.say(キー .. ": " .. 値 .. "<br/>"); 終わり チェック_realip.lua ngx.shared.ip_blacklist:get(ngx.var.real_ip) の場合 ngx.exit(ngx.HTTP_FORBIDDEN) を返します。 終わり 3.3 データベース設計 テーブル `ip_blacklist` を作成します ( `id` int(11) NOT NULL AUTO_INCREMENT, `ip_addr` varchar(15) COLLATE utf8mb4_bin デフォルト NULL, `status` int(11) デフォルト '0' コメント '0: 有効、1: 無効', `effective_hour` 小数点(11,2) デフォルト '24' コメント '有効期間、単位: 時間', `ip_source` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT 'ブラックリストソース', `create_time` 日時 DEFAULT CURRENT_TIMESTAMP、 `modify_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP、 `remark` varchar(255) COLLATE utf8mb4_bin DEFAULT NULL COMMENT '注釈', 主キー (`id`) ) エンジン=InnoDB デフォルト文字セット=utf8mb4 COLLATE=utf8mb4_bin; プロシージャ proc_ip_blacklist_status_update() を作成します。 -- 期限切れのIPステータスを無効に変更する ip_blacklist を更新 ステータスを1に設定 date_add(create_time,INTERVAL effective_hour hour) < now(); の場合 専念; 終わり; イベントの作成 job_ip_blacklist_status_update スケジュールどおり1分ごとに 完了時に保存 有効にする する proc_ip_blacklist_status_update() を呼び出します。 4 CRUD ブラックリストは、手動、自動、またはその両方で生成できます。 自動的な方法は、Python を介して elk ログを分析し、悪意のある IP を MySQL に自動的に書き込むことです。これは大きなトピックなので、ここでは説明しません。 手動の方法では、elk リクエスト ログを手動で確認し、悪意のある IP を見つけて、mysql に手動で入力します。これは、優れたユーザー エクスペリエンスを備えたオープン ソースの CRUD ツールです (直接 Navicat を使用するよりもはるかに優れています)。もちろん、自分で作成することもできます... プロジェクトアドレス: https://github.com/jonseg/crud-admin-generator このプロジェクトの強みは、すべてのテーブルがメニューの生成に役立ち、これらのテーブルの CRUD を直接使用できることです。 具体的な操作については公式のマニュアルを参照していただくとして、ここでは詳細には触れません。 上記のnginx ip blacklist dynamic banの例は、エディターがあなたと共有するすべてのコンテンツです。参考になれば幸いです。また、123WORDPRESS.COMをサポートしていただければ幸いです。 以下もご興味があるかもしれません:
|
<<: JavaScript で大きなファイルの並列ダウンロードを実装する方法
>>: mysql 5.7.23 winx64 解凍バージョンのインストールチュートリアル
この記事では、例を使用して MySQL カーソルの原理と使用方法を説明します。ご参考までに、詳細は以...
フロントエンドcss3 フィルターは、Web ページのグレー効果を実現できるだけでなく、ナイト モー...
1. ミドルウェアの紹介1. 基本概念ElasticSearch は Lucene をベースにした検...
序文CSS で水平方向と垂直方向に中央揃えする方法はたくさんあります。この記事で紹介する方法は非常に...
div がネストされているときに margin が機能しない問題の解決策を次に示します。さて、マージ...
MacにはApache環境が付属していますターミナルを開き、sudo apachectl -v と入...
目的: MySQL 集計関数のネストされた使用集計関数は直接ネストできません。例: max(coun...
導入前の記事で述べたように、NodeJS には 2 種類のスレッドがあります。1 つは、ユーザー リ...
ストアド関数ストアド関数とは: SQL コードの一部をカプセル化し、特定の関数を完了して、結果を返し...
xshellを使用してLinuxに接続する利点Windows環境でLinuxを直接操作できるインター...
数日前、同僚がポイントモールプロジェクトを受け取りました。このプロジェクトには、カードやクーポンをギ...
次のコードを index.html などのデフォルトのホームページ ファイルとして保存し、ルート デ...
React は、ユーザー インターフェイスを構築するための JavaScript ライブラリです。 ...
(1)各HTMLタグには属性スタイルがあり、CSSとHTMLを組み合わせている。 <div s...
Linux での動的ライブラリ ファイルのファイル名は libxxx.so のようになります。ここで...