nginx ip ブラックリストの動的禁止の例

nginx ip ブラックリストの動的禁止の例

ウェブサイトが悪意を持ってリクエストされた場合、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をサポートしていただければ幸いです。

以下もご興味があるかもしれません:
  • Nginxを再コンパイルしてモジュールを追加する方法
  • NginxはURLのパスに応じてアップストリームに動的に転送します
  • NginxはLua+Redisを使用してIPを動的にブロックします
  • Nginx ダイナミック DNS リバース プロキシの書き方をいくつか詳しく説明します
  • Nginxにモジュールを動的に追加する方法

<<:  JavaScript で大きなファイルの並列ダウンロードを実装する方法

>>:  mysql 5.7.23 winx64 解凍バージョンのインストールチュートリアル

推薦する

Angular Cookie の読み取りおよび書き込み操作コード

Angular Cookie の読み取りおよび書き込み操作のコードは次のようになります。 var a...

クエリプロファイラを使用して MySQL ステートメントの実行時間を表示する方法

前回の記事では、MySQL ステートメントの実行時間をチェックする 2 つの方法を紹介しました。今日...

CSS の優先順位に関する詳細な紹介

CSS の優先順位について話す前に、CSS とは何か、CSS が何に使用されるのかを理解する必要があ...

波効果を作成するための CSS のトリック

純粋な CSS を使用して波の効果を実現することは、常に非常に困難でした。 波形曲線を実現するにはベ...

VMware Workstation での VMware vSphere のセットアップ (グラフィック チュートリアル)

VMware vSphere は、業界をリードする最も信頼性の高い仮想化プラットフォームです。 v...

CentOS の MySQL に MariaDB をインストールするときに発生する方法と問題

以前にインストールしたmariadbを削除する1. rpm -qa | grep mariadb を...

Three.js が Facebook Metaverse 3D ダイナミック ロゴ効果を実現

目次背景メタバースとは何ですか?成果を達成するトライアル 1: THREE.TorusGeometr...

MySQL SHOW PROCESSLISTはトラブルシューティングの全プロセスを支援します

1. SHOW PROCESSLISTコマンドSHOW PROCESSLIST は実行中のスレッド ...

Reactイベントバインディングの詳細な説明

1. 何ですかreactアプリケーションでは、イベント名はキャメルケース形式で記述されます。たとえ...

Linux で ffmpeg をインストールするための詳細なチュートリアル

1. CentOS Linuxにffmpegをインストールする1.ダウンロードして解凍する http...

Redo ログと Undo ログに基づく MySQL クラッシュ回復の分析

目次MySQLクラッシュ回復プロセス1. ブラックボックス下のデータフローを更新する2. やり直しロ...

nginx ベースのブラウザネゴシエーションキャッシュプロセスの詳細な説明

この記事は主に、nginx に基づいてブラウザネゴシエーションキャッシュを設定する詳細なプロセスを紹...

docker createコマンドの使用方法

docker create コマンドは、イメージに基づいてコンテナを作成できます。このコマンドの効果...

Vue プロジェクトで addRoutes を使用する際の問題の解決策

目次序文1. 404 ページ1. 原因2. 解決策2.白い画面を更新する1. 原因2. 解決策3. ...

MySQL 構成マスタースレーブサーバー (マスター 1 台とスレーブ複数台)

目次アイデアホスト構成confを変更する再起動テストスレーブ 1 の構成スレーブ2の構成マスターとス...