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 解凍バージョンのインストールチュートリアル

推薦する

MySQLでカーソルトリガーを使用する方法

カーソル選択クエリによって返される行のセットは、結果セットと呼ばれます。結果セット内の行は、入力した...

Linuxシステムの操作レベルの詳細な紹介

目次1. Linuxシステムの操作レベルの概要2. 実行レベルを確認する3. 現在のシステムの動作レ...

Docker ベースの Jenkins のデプロイに関する詳細なチュートリアル

このドキュメントを作成した当時は2019年12月頃で、er2.200が最新バージョンでした。 1.画...

Windows システムに VirtualBox と Ubuntu 16.04 をインストールするための詳細なチュートリアル

1. ソフトウェアの紹介バーチャルボックスVirtualBox は、無料のオープンソース仮想マシン ...

MySQL の従来のソート、カスタム ソート、中国語のピンイン文字によるソート

MySQL の通常のソート、カスタム ソート、中国語のピンイン文字によるソート。実際の SQL を記...

WindowsでcmdからDOSウィンドウに入り、MySQLデータベースにアクセスします。

1. win + R を押して cmd と入力し、DOS ウィンドウに入ります。 2. MySQL...

MySQLグループリンクの使用に関する詳細な説明

MYSQL におけるグループ化とリンクは、データベースの操作やデータのやり取りで最もよく使用される ...

nginx のロードバランシングとリバースプロキシの説明

目次負荷分散負荷分散分類1. DNS 負荷分散2. IP負荷分散3. リンク層の負荷分散4. ハイブ...

MySQL にテーブルが存在するかどうかを確認し、それを一括で削除する方法

1. インターネットで長時間検索しましたが、判定表が存在するかどうかがわからなかったので、漠然と削除...

ウェブページを作る前に、これらのいわゆる仕様を見てみましょう

この記事では、Web ページを作成する前に確認すべき、いわゆる仕様をいくつかまとめました。皆様のお役...

JS におけるメモリと変数の保存についての詳細な説明

目次序文JSマジックナンバー数値の保存バイナリ変換方法なぜ 0.1 + 0.2 !== 0.3 なの...

...

Vue3 の参照と参照の詳細

エディターは、Vue3のデータの関連する問題も共有します。次のような例を見てみましょう。 Vue.c...

Linux クラウド サーバーに JDK と Tomcat をインストールするための詳細な手順 (推奨)

JDKをダウンロードしてインストールするステップ 1: まず、公式 Web サイト http://...

MySQLの一般的なバックアップコマンドとシェルバックアップスクリプトの共有

複数のデータベースをバックアップするには、次のコマンドを使用できます。 mysqldump -uro...