Используйте базу данных GeoIP с nginx для регистрации запросов и ограничения доступа.
Установим веб-сервер nginx.
Установим пакеты geoip-database и libnginx-mod-http-geoip.
Как заблокировать IP-адреса из стран, используя Iptables Geoip Addons
sudo apt install libnginx-mod-http-geoip geoip-database
Убедимся, что модуль geoip включен.
cat /etc/nginx/modules-enabled/50-mod-http-geoip.conf
load_module modules/ngx_http_geoip_module.so;
Определим местоположение базы данных страны.
sudo tee /etc/nginx/conf.d/010-geoip.conf <<EOF
geoip_country /usr/share/GeoIP/GeoIP.dat;
EOF
Определим формат логов, включающий код страны geoip.
sudo tee /etc/nginx/conf.d/020-log_format.conf <<'EOF'
log_format combined_with_country '$remote_addr - $remote_user [$time_local] '
'"$request" $status $body_bytes_sent '
'"$http_referer" "$http_user_agent" "$geoip_country_code"';
EOF
Удалим виртуальный хост по умолчанию.
sudo unlink /etc/nginx/sites-enabled/default
Определим виртуальный хост с помощью пользовательского формата лога.
sudo tee /etc/nginx/sites-available/country_example <<'EOF'
server {
listen 80 default_server;
listen [::]:80 default_server;
access_log /var/log/nginx/country.access.log combined_with_country;
error_log /var/log/nginx/country.error.log;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
EOF
sudo ln -s /etc/nginx/sites-available/country_example /etc/nginx/sites-enabled/
Проверим синтаксис конфигурации.
🌐 Блокирование вредоносных ботов, спама, юзер-агентов, Ransomware на Nginx
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Перезагрузим конфигурацию nginx.
sudo systemctl reload nginx
Проверим
curl -I localhost
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Mon, 23 Oct 2023 22:32:08 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Mon, 23 Oct 2023 20:53:45 GMT
Connection: keep-alive
ETag: "6536dd59-264"
Accept-Ranges: bytes
tail /var/log/nginx/country.access.log
127.0.0.1 - - [23/Oct/2023:22:32:08 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.81.0" "-"
Обновите виртуальный хост, чтобы разрешить только выбранное количество стран.
sudo tee /etc/nginx/sites-available/country_example <<'EOF'
map $geoip_country_code $blocked_country {
PL 0;
DE 0;
US 0;
default 1;
}
server {
listen 80 default_server;
listen [::]:80 default_server;
access_log /var/log/nginx/country.access.log combined_with_country;
error_log /var/log/nginx/country.error.log;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
if ($blocked_country) {
return 403;
}
try_files $uri $uri/ =404;
}
}
EOF
Проверим конфигурацию nginx.
sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Перезагрузим конфигурацию nginx.
Linux: как перезапустить Nginx на Ubuntu / Centos / Docker
sudo systemctl reload nginx
Посмотрим, как это работает.
curl -I localhost
HTTP/1.1 403 Forbidden
Server: nginx/1.18.0 (Ubuntu)
Date: Mon, 23 Oct 2023 22:33:00 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive
tail /var/log/nginx/country.access.log
127.0.0.1 - - [23/Oct/2023:22:32:08 +0000] "HEAD / HTTP/1.1" 200 0 "-" "curl/7.81.0" "-"
127.0.0.1 - - [23/Oct/2023:21:18:46 +0000] "HEAD / HTTP/1.1" 403 0 "-" "curl/7.81.0" "-"
Дополнительные примечания
Nginx, установленный из официального репозитория, требует наличия модуля пакета nginx-module-geoip, который может быть включен в nginx.conf, и структура конфигурации немного отличается.
Основное отличие заключается в том, что он не поддерживает базу данных geoip2.
Версия Ubuntu более старая, но она может использовать базу данных geoip2 с самого начала.
см. также: