在 Nginx 中,我正在检查 IP 是否来自被封锁的国家/地区。如果是,那么访问者会收到 403。我需要能够添加列入白名单的 IP,以允许他们进入,即使他们属于被阻止的国家/地区。
我更愿意将 nginx.conf 位置的 IP 列入白名单,这样我就不需要更新 30 多个虚拟主机文件。我怎样才能做到这一点?
在 /etc/nginx/sites-enabled 中的每个 nginx 虚拟主机文件中
location / {
if ($allowed_country = no) {
return 403;
}
try_files $uri $uri/ /index.php$is_args$args;
}
国家/地区列表在 /etc/nginx/nginx.conf 中创建
## GEOIP settings
geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
default yes;
RU no;
BR no;
UA no;
PH no;
IN no;
CN no;
}
要对 geoip 国家/地区以及 IP 地址进行过滤,您需要 geo 模块 结果如下:
location / {
if ($allowed_country = no) {
return 403;
}
if ($allowed_ip = no) {
return 403;
}
try_files $uri $uri/ /index.php$is_args$args;
}
加上nginx.conf中的映射
geo $allowed_ip {
default no;
127.0.0.1 yes;
192.168.1.0/24 yes;
}
这应该是可能的,但map指令必须位于http上下文下。
我建议在每个虚拟主机中都有一个 include,将 geoip 设置放在单独的文件中,以更加灵活。
这里以更简化的方式更新了过滤逻辑,确保它使用单一条件检查允许的国家/地区和 IP 地址。另外,它现在与 Cloudflare 的 CDN 兼容。
map $http_cf_connecting_ip $remote_ip {
default $http_cf_connecting_ip;
'' $remote_addr;
}
geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
$geoip2_country_code default=- source=$remote_ip country iso_code;
}
geo $remote_ip $allowed_ip {
default no;
1.2.3.4/32 yes;
5.6.7.8/32 yes;
}
map $geoip2_country_code $access_granted {
default $allowed_ip;
US yes;
SG yes;
}
这应该在服务器/位置上下文下使用
if ($access_granted = no) {
return 403;
}
location / {
try_files $uri $uri/ /index.php$is_args$args;
}