在维护网站安全性时,有时候我们需要阻止恶意 IP 地址对服务器的访问。Nginx 提供了强大的机制来实现这一点。下面介绍如何在 Nginx 中精准禁止特定 IP 的访问。
方法 1: 使用 deny 和 allow 指令
最直接的方式是在 Nginx 配置文件中添加deny和allow指令来限制或允许指定 IP 的访问。假设你需要阻止 IP 地址为 123.45.67.89 的访问:
- 打开 Nginx 的配置文件,通常是
/etc/nginx/nginx.conf或特定站点的配置文件。 - 在想要应用规则的位置(比如
server或location区块)添加以下配置:location / { deny 123.45.67.89; # 禁止特定 IP 的访问 # 其他配置... }如果你只想允许特定的 IP 访问,同时拒绝所有其他来源的访问,可以这样设置:
location / { deny all; # 默认拒绝所有人 allow 123.45.67.89; # 只允许特定 IP 访问 # 其他配置... }注意,
allow和deny的顺序很重要;最后一条规则具有最高的优先级。
方法 2: 使用 GeoIP 模块
GeoIP 模块可以让 Nginx 根据 IP 地址判断地理位置,进而实施地理区域的访问控制。然而,基本的 Nginx 分发版并不自带此模块,你需要自行下载安装 GeoIP 数据库和相关模块。
- 下载 GeoLite2-Country 数据库:
wget https://download.maxmind.com/app/geoip_download -O geoip.tar.gz tar xzf geoip.tar.gz - 将数据库文件移动到适当目录:
mv GeoLite2-Country.mmdb /usr/share/GeoIP/ - 更新 Nginx 配置文件,添加以下内容:
geoip_country /usr/share/GeoIP/GeoLite2-Country.mmdb; server { if ($geoip_country_code != "CN") { # 举例,只允许中国IP访问 return 403; } # 其他配置... }请注意,GeoIP 模块需要在全局层级进行声明,才能在整个 Nginx 中可用。
方法 3: 使用 IPset (适用于大量 IP)
如果需要批量处理大量的 IP 地址或者 IP 段,可以使用 Linux 内建的 IPset 工具。创建 IPset,然后在 Nginx 中引用这个 set。
- 创建 IPset:
ipset create bad_ips hash:net family inet hashsize 1024 maxelem 65536 ipset add 123.45.67.89 bad_ips - 在 Nginx 配置文件中添加引用:
map $remote_addr $limit_req { default 0; set $limit_req 1; if ($binary_remote_addr in bad_ips) { set $limit_req 0; } } location / { if ($limit_req = 0) { return 403; } # 其他配置... }
以上就是如何在 Nginx 中精确控制特定 IP 或 IP 段访问的方法。根据不同的场景,选择合适的技术点来增强你的服务器安全性。不过,始终记得定期检查和更新黑名单列表,以应对不断变化的安全威胁。