Deltahost

Facebook

Rexbike

Strava

🏠 Oleksandr Rudenko blog

🚷 Блокування доступу до сайту за GeoIP

09.03.2022 | Олександр

Update 28.11.2022

24 лютого 2022 року, на мою країну, вже другий раз за 10 років, напали війська сусідньої фашистської козломордої країни. Якщо прагнете зачистити свій інфопростір від таких сусідів — нижче коротка інструкція, за схемою якої обмеження вже працюють на моєму сайті.

Отже, для застосування обмежень буде конфігуруватись web-сервер nginx, та буде потрібен пакет geoipupdate, використовується Linux Ubuntu 18.04.6 LTS.

Встановлення пакету geoipupdate:

# apt install geoipupdate

Далі треба подивитись версію пакета, від цього буде залежить конфігурація та тип ключа:

# dpkg --list | grep -w geoipupdate
ii  geoipupdate                            2.5.0-1                                         amd64        MaxMind GeoIP/GeoIP2 database updates

Я маю стару версію 2.5.0-1, тому і ключ генерував старого типу. Далі треба зареєструватись на сайті MaxMind, і потім сгенерувати ключ.

Сконфігурувати geoipupdate, впишіть свої дані замість нулів у файл /etc/GeoIP.conf:

AccountID 0
LicenseKey 000000000000

Перевірити роботу пакету:

# geoipupdate -v
geoipupdate 2.5.0
Opened License file /etc/GeoIP.conf
AccountID ******
LicenseKey ************
Insert edition_id GeoLite2-Country
Insert edition_id GeoLite2-City
Read in license key /etc/GeoIP.conf
Number of edition IDs 2
url: https://updates.maxmind.com/app/update_getfilename?product_id=GeoLite2-Country
md5hex_digest: 49af9db2ef1bfb6460677d61627a4c60
url: https://updates.maxmind.com/app/update_getipaddr
Client IP address: 2a07:c801:0:1::1
md5hex_digest2 (challenge): 7a71a07932841410edacea515b8a5a63
url: https://updates.maxmind.com/app/update_secure?db_md5=49af9db2ef1bfb6460677d61627a4c60&challenge_md5=7a71a07932841410edacea515b8a5a63&user_id=******&edition_id=GeoLite2-Country
No new updates available
url: https://updates.maxmind.com/app/update_getfilename?product_id=GeoLite2-City
md5hex_digest: 3150397e922344df10a1a0db35f376d9
url: https://updates.maxmind.com/app/update_getipaddr
Client IP address: 2a07:c801:0:1::1
md5hex_digest2 (challenge): 7a71a07932841410edacea515b8a5a63
url: https://updates.maxmind.com/app/update_secure?db_md5=3150397e922344df10a1a0db35f376d9&challenge_md5=7a71a07932841410edacea515b8a5a63&user_id=******&edition_id=GeoLite2-City
No new updates available

Все працює, оновлень немає, перший раз відповідь буде дещо відрізняться. Можливо, треба буде трохи зачекати, поки активується ключ. Типово, оновлення баз GeoIP виконується завдяки скрипту /etc/cron.d/geoipupdate, він виглядає так:

# Regular cron job for the geoipupdate package, used to update GeoIP databases
#
# According to MaxMind: "The GeoIP2 and GeoIP Legacy Country and City databases
# are updated every Tuesday. The GeoIP2 ISP, GeoIP Legacy ISP and Organization
# databases are updated every one to two weeks. All other databases are updated
# on the first Tuesday of each month."

# m h dom mon dow user  command
47 6    * * 3   root    test -x /usr/bin/geoipupdate && /usr/bin/geoipupdate

Якщо його немає, можна автоматизувати оновлення за допомогою crontab, виконать команду:

# echo '0 7 * * 3 root /usr/bin/geoipupdate 2>&1' >> /etc/crontab

Тепер конфігурування nginx. Буде використовуватись помилка 405 для виводу кастомної сторінки відвідувачам.

У корені основного файла конфігурації /etc/nginx/nginx.conf, повинні підключатись плагіни:

include /etc/nginx/modules-enabled/*.conf;

Треба переконатись, що плагін mod-http-geoip2 (або стара версія mod-http-geoip) підключен, файл /etc/nginx/modules-enabled/50-mod-http-geoip2.conf має виглядати так:

load_module modules/ngx_http_geoip2_module.so;

Знову основний файл конфігурації, розділ http. Має містити директиву підключення файлу бази, обмеження, а також, підключення конфігурацій сайтів для GeoIP2:

geoip2 /var/lib/GeoIP/GeoLite2-Country.mmdb {
    auto_reload 1d;
    $geoip2_data_country_iso_code country iso_code;
}
map $geoip2_data_country_iso_code $allowed_country {
    default yes;
    RU no;
    BY no;
}

include /etc/nginx/sites-enabled/*.conf;
Для старої версії GeoIP:
geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
    default yes;
    RU no;
    BY no;
}

include /etc/nginx/sites-enabled/*.conf;

Останні налаштування у файлі сайту /etc/nginx/sites-enabled/domain.conf, розділ server, на початку кожного блоку location — додати строку:

if ($allowed_country = no) { return 405; }

Додати ще один блок location, який буде віддавати кастомну сторінку з помилкою:

location = /405.html {
    internal;
    allow all;
    root /home/user/www/domain;
}

Сторінку помилки треба розмістити у корені сайту, якщо сподобається мій варіант, можна його отримати з мого сайту:

cd /home/user/www/domain
wget https://rudenko.net.ua/pub/files/405.html

Все готово, залишилось лише перезапустити web-сервер nginx:

# /etc/init.d/nginx restart

Тепер кожен кацап та білорус буде знати напрямок, за яким йому треба йти, замість отримання інформації з сайту.

Слава Україні!

Користні посилання

GeoIP Legacy Databases (DAT) — Why? Because of Nginx, Piwik2 and ModSecurity2. To use GeoIP2, Nginx has to be built from source.
Рашизм — англ. Ruscism від англ. «Russia, Russian», — вимовляється раша, — та італ. «fascismo» — фашизм, від якого взято закінчення -изм, Ruscism in english.


Коментарі

⬆️ Наверх сторінки