瞌睡龙

技术杂货铺

0%

使用 Nginx、Lua 和 Redis 实现 IP 黑名单

引言

网络安全在今天的互联网世界中占据着至关重要的位置。保护您的应用程序免受恶意攻击和不受欢迎的访问是每个网站和应用程序开发者的首要任务之一。IP 黑名单是一种常见的安全措施,用于拒绝来自特定 IP 地址的访问请求。通过结合 Nginx 的强大代理和 Web 服务器功能,Lua 脚本语言的灵活性以及 Redis 的高性能缓存,我们可以轻松地实现这一功能。在本文中,我们将向您展示如何配置和使用这些工具,以创建一个可扩展的 IP 黑名单系统,以确保您的应用程序在网络上安全运行。

安装 LuaJIT

首先,让我们从安装 LuaJIT 开始。LuaJIT 是一个 Just-In-Time 编译器,用于提高 Lua 脚本的性能。您可以从 LuaJIT 官方网站 下载稳定版本 2.0.5。

1
2
3
4
5
6
7
wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz
tar -zxvf LuaJIT-2.0.5.tar.gz
cd LuaJIT-2.0.5
make -j8
make install
export LUAJIT_LIB=/usr/local/lib
export LUAJIT_INC=/usr/local/include/luajit-2.1

上述命令将下载、编译和安装 LuaJIT,并配置必要的环境变量,使其在系统中正常运行。

编译安装 lua-nginx-module

接下来,我们需要编译和安装 lua-nginx-module,这是 Nginx 的一个模块,用于支持 Lua 脚本。首先,进入您的 Nginx 源码目录,可以使用 nginx -V 命令查看之前的安装参数:

1
2
3
4
5
6
7
8
9
10
11
12
./configure --user=www --group=www \
--prefix=/usr/local/nginx \
--with-http_stub_status_module \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_sub_module \
--with-http_realip_module \
--add-module=src/misc/ngx_devel_kit-master \
--add-module=src/misc/set-misc-nginx-module-master \
--add-module=src/misc/echo-nginx-module-master \
--with-ld-opt=-Wl,-rpath,/usr/local/lib \
--add-module=/opt/downloads/lua-nginx-module-master

然后,编译和安装 Nginx:

1
2
make -j8
make install

为了验证 lua-nginx-module 是否成功安装,您可以在 Nginx 配置中添加一个简单的 Lua 示例:

1
2
3
4
5
# 在 Nginx 配置中添加以下内容:
location /hello_lua {
default_type 'text/plain';
content_by_lua 'ngx.say("hello, lua")';
}

如果访问 /hello_lua 时能够看到 “hello, lua”,那么说明 lua-nginx-module 安装成功。

正式配置 Nginx Lua

接下来,我们将正式配置 Nginx 和 Lua 来实现 IP 黑名单。首先,我们需要为 Lua 创建一个共享字典以存储 IP 黑名单:

1
2
# 在 Nginx 配置中添加以下内容:
lua_shared_dict ip_blacklist 1m;

这将创建一个名为 ip_blacklist 的共享字典,用于缓存 IP 黑名单。

安装 lua-resty-redis

要与 Redis 进行交互,我们需要安装 lua-resty-redis 模块。您可以从 GitHub 直接下载并解压它:

1
2
3
4
5
6
7
# 下载并解压 lua-resty-redis:
wget https://github.com/openresty/lua-resty-redis/archive/master.zip
mv master.zip lua-resty-redis.zip
unzip lua-resty-redis.zip
cd lua-resty-redis-master/
mv lua-resty-redis-master lua-resty-redis
mv lua-resty-redis /usr/local/nginx/lua

然后,配置 Nginx 来包含 lua-resty-redis 模块:

1
2
# 在 Nginx 配置中添加以下内容:
lua_package_path /usr/local/nginx/lua/lua-resty-redis/lib/resty/redis.lua;

编写脚本

现在,我们需要编写一个 Lua 脚本来检查 IP 地址是否在黑名单中。您可以创建一个名为 ip_blacklist.lua 的脚本文件,并在其中包含以下内容:

创建 /usr/local/nginx/lua/ip_blacklist.lua 文件并添加以下内容:

1
-- 这里放置脚本内容,具体内容请参考原文链接

配置 Nginx vhost

最后,我们将在 Nginx 配置中引入我们的 Lua 脚本,以便在需要时检查 IP 黑名单。在您的 vhost 配置中,可以在 location 块中添加以下内容:

1
2
3
location / {
access_by_lua_file lua/ip_blacklist.lua;
}

配置黑名单

现在,您可以通过以下方式向黑名单中添加 IP 地址:

在 Redis 命令行中执行以下命令添加 IP 地址:

1
SADD ip_blacklist 10.1.1.1

要从黑名单中移除 IP 地址,执行以下命令:

在 Redis 命令行中执行以下命令移除 IP 地址:

1
2
3
SREM ip_blacklist 10.1.1.

1

完成以上步骤后,您的 Nginx 将能够根据 IP 黑名单拒绝访问请求。

这就是如何使用 Nginx、Lua 和 Redis 实现 IP 黑名单功能的详细说明。通过结合这些强大的工具,您可以增加您的应用程序的安全性并保护免受不受欢迎的访问。希望这篇文章对您有所帮助!

欢迎关注我的其它发布渠道