Nginx 中可以使用许多不同的方法来实现 IP 封禁,这里介绍三种常见的方法:
1. 使用 Nginx 内置的 ngx_http_access_module 模块
ngx_http_access_module 模块是 Nginx 内置的模块,它可以用来控制客户端的访问权限,包括允许或禁止某些 IP 访问 Nginx 服务器。
可以在 Nginx 配置文件中设置 allow 和 deny 来限制 IP 访问。例如:
http {
# ...省略其他配置...
# 允许所有 IP 访问
allow all;
# 禁止 IP 为 192.168.1.100 的访问
deny 192.168.1.100;
}
2. 使用 Nginx 的第三方模块 ngx_http_limit_conn_module
ngx_http_limit_conn_module 模块可以用于限制连接速率,防止恶意客户端过多连接服务器,可以通过它来防止 DoS 攻击。该模块的原理是通过限制客户端 IP 地址的连接数来控制访问。
使用该模块需要在 Nginx 配置文件中添加以下配置:
http {
# ...省略其他配置...
# 按照 IP 限制连接数
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
# 每个 IP 最多同时允许 10 个连接
limit_conn conn_limit_per_ip 10;
}
上面的例子中,limit_conn_zone 指令将二进制的远程 IP 地址与一个名为 conn_limit_per_ip 的共享内存区域进行关联,并将其大小限制为 10MB。接下来,limit_conn 指令使用该共享内存区域限制了每个 IP 地址的并发连接数不超过 10 个。
3. 使用第三方模块 ngx_http_accesskey_module
ngx_http_accesskey_module 可以用于生成特殊的签名,可以用来防止非法访问和恶意攻击。它基于密钥的访问控制机制,只有拥有密钥的客户端才能访问服务器。
使用该模块需要在 Nginx 配置文件中添加以下配置:
http {
# ...省略其他配置...
# 指定密钥文件位置和算法
accesskey on;
accesskey_hashmethod md5;
accesskey_arg "key";
accesskey_signature "$remote_addr|$uri|$arg_key|secret_key";
# 禁止 IP 为 192.168.1.100 的访问
deny 192.168.1.100;
}
上面的例子中,accesskey 指令开启了密钥访问控制机制。accesskey_hashmethod 指令指定了加密算法为 MD5,accesskey_arg 指令指定了参数名称为 key,accesskey_signature 指令指定了签名的内容,其中包括远程客户端 IP 地址、访问的 URI、请求参数中的 key 值和一个私钥 secret_key。只有在客户端发送包含正确签名的请求时才允许访问。
总结:
以上是三种常见的在 Nginx 中实现 IP 封禁的方法。其中,使用 ngx_http_access_module 模块的方法简单易懂,但是需要手动维护黑名单。使用 ngx_http_limit_conn_module 可以限制客户端的并发连接数,但是需要合理设置参数。使用 ngx_http_accesskey_module 可以生成特殊的签名进行访问控制,但是需要生成和维护密钥。选择何种方法取决于具体的业务需求和实际情况。