Конфигурация nginx для maxmind geoip2 для ограничения IP-адресов по стране и городу при прохождении локальной сети
Близко, но не сигара!
Попытка настроить сервер Ubuntu 20.04 nginx с geoip2 для ограничения IP-адресов по стране и городу при разрешении доступа к локальной сети. Ниже приведен мой файл nginx.conf для maxmind geoip2.
Ссылки на установленные базы данных maxmind
/etc/nginx/nginx.conf
http {geoip2 /usr/share/GeoIP/GeoLite2-Country.mmdb {
$geoip2_data_country_iso_code country iso_code;
}
geoip2 /usr/share/GeoIP/GeoLite2-City.mmdb {
$geoip2_data_city_name city names en;
}
Этот блок вставляет ограничения IP-кода с использованием трех переменных: $lan, $allowed_country и $allowed_city. В этой конкретной попытке разрешить страну, но ограничить город в этой стране. Например, страна США разрешена, однако для этого теста любой IP-адрес из города Буффало, США, должен быть ограничен.
/etc/nginx/nginx.conf
# permit LAN access
geo $lan {
default 0;
192.168.0.0/24 1;
}
# exclude all countries except the ones listed
map $geoip2_data_country_iso_code $allowed_country {
default 0;
CA 1;
US 1;
SZ 1;
AU 1;
}
#include all cities except the one's excluded
map $geoip2_data_city_name $allowed_city {
default 1;
Buffalo 0;
Ottawa 0;
}
#combine the results and determine if the ip should be blocked
map $lan$allowed_country$allowed_city $deny_ip {
default 0;
000 1;
001 1;
010 1;
}
}
Последний блок сравнивает настройки $lan, $allowed_country и $allowed_city и определяет, следует ли блокировать IP-адрес на основе их объединенных значений. Насколько я понимаю, картографический сервис nginx можно использовать для объединения трех переменных гео-IP и сравнения их объединенных значений, чтобы затем установить другую переменную deny_ip:
- "000" = означает, что локальная сеть, страна и город НЕ разрешены, поэтому deny_ip = 1 (ограничить)
- "001" = если страна ограничена, но город в порядке, то deny_ip = 1 (ограничение)
- "010" = если страна в порядке, но город ограничен, то deny_ip = 1 (ограничение)
Следующий код добавляется в файл виртуальной конфигурации nginx для ограничения доступа к веб-сайту, если $deny_ip = 1
/etc/nginx/сайты-доступны/website_configuration
location / {
if ($deny_ip = 1) {
return 403;
}
try_files $uri $uri/ /index.php?$args;
}
Код работает в основном, но не совсем. Для сценария страна РАЗРЕШЕНА, но город в этой стране ограничен, IP-адрес все еще проходит. При написании этой статьи подтвердил, что страна США РАЗРЕШЕНА, но город Буффало США ограничен, однако в логах по-прежнему видны IP-адреса из Буффало, и я не знаю, что я делаю неправильно.
Буффало, США IP-адрес, которому должен был быть отказано в доступе к веб-сайту, но все же дозвонился?
104.144.66.114 - - [06/Mar/2022:11:46:55 -0700] "GET /picture.php?/1206 HTTP/1.1" 200 4476
Эта настройка действительно добавляет большую гибкость для контроля и ограничения доступа к веб-сайту, и, надеюсь, кто-то в этом сообществе сможет предложить решение, чтобы заставить его работать на 100%