ウェブサイトが悪意を持ってリクエストされた場合、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 解凍バージョンのインストールチュートリアル
カーソル選択クエリによって返される行のセットは、結果セットと呼ばれます。結果セット内の行は、入力した...
目次1. Linuxシステムの操作レベルの概要2. 実行レベルを確認する3. 現在のシステムの動作レ...
このドキュメントを作成した当時は2019年12月頃で、er2.200が最新バージョンでした。 1.画...
1. ソフトウェアの紹介バーチャルボックスVirtualBox は、無料のオープンソース仮想マシン ...
MySQL の通常のソート、カスタム ソート、中国語のピンイン文字によるソート。実際の SQL を記...
1. win + R を押して cmd と入力し、DOS ウィンドウに入ります。 2. MySQL...
MYSQL におけるグループ化とリンクは、データベースの操作やデータのやり取りで最もよく使用される ...
目次負荷分散負荷分散分類1. DNS 負荷分散2. IP負荷分散3. リンク層の負荷分散4. ハイブ...
1. インターネットで長時間検索しましたが、判定表が存在するかどうかがわからなかったので、漠然と削除...
この記事では、Web ページを作成する前に確認すべき、いわゆる仕様をいくつかまとめました。皆様のお役...
目次序文JSマジックナンバー数値の保存バイナリ変換方法なぜ 0.1 + 0.2 !== 0.3 なの...
エディターは、Vue3のデータの関連する問題も共有します。次のような例を見てみましょう。 Vue.c...
JDKをダウンロードしてインストールするステップ 1: まず、公式 Web サイト http://...
複数のデータベースをバックアップするには、次のコマンドを使用できます。 mysqldump -uro...