Как реализовать блокировку доступа по геолокации IP-адреса?

Ответ

Блокировка доступа по стране (GeoIP blocking) реализуется с помощью баз данных, которые сопоставляют IP-адреса с их географическим положением. Это можно сделать на разных уровнях инфраструктуры.

На уровне приложения, например, с использованием фреймворка Flask и библиотеки geoip2, это выглядит так:

from flask import Flask, request, abort
import geoip2.database

app = Flask(__name__)

# Загружаем базу данных GeoLite2 от MaxMind
# Файл GeoLite2-Country.mmdb нужно скачать отдельно
reader = geoip2.database.Reader('path/to/GeoLite2-Country.mmdb')

# Список заблокированных стран в формате ISO 3166-1 alpha-2
BLOCKED_COUNTRIES = {'RU', 'CN', 'KP'}

@app.before_request
def block_by_country():
    # Для тестов на localhost можно использовать '1.2.3.4' вместо request.remote_addr
    ip_address = request.remote_addr
    try:
        response = reader.country(ip_address)
        country_code = response.country.iso_code

        if country_code in BLOCKED_COUNTRIES:
            # Прерываем запрос с кодом 403 Forbidden
            abort(403, description="Access from your country is restricted.")

    except geoip2.errors.AddressNotFoundError:
        # IP не найден в базе (например, локальный), разрешаем доступ
        pass
    except Exception as e:
        # Логируем ошибку, но не блокируем пользователя
        app.logger.error(f"GeoIP lookup failed for {ip_address}: {e}")

# ... остальная часть вашего приложения ...

Важные аспекты и лучшие практики:

  • Уровень блокировки: Реализация на уровне веб-сервера (Nginx с модулем ngx_http_geoip_module) или пограничного шлюза (CDN, WAF) гораздо эффективнее, так как снижает нагрузку на приложение.
  • Надежность: Метод не является 100% надежным из-за использования VPN, прокси и Tor, которые позволяют обходить такие блокировки.
  • База данных: Требуется актуальная база данных GeoIP, например, бесплатная GeoLite2 от MaxMind или коммерческие аналоги.
  • Обработка ошибок: Важно предусмотреть обработку исключений (try...except), чтобы не блокировать легитимных пользователей в случае ошибки определения геолокации.

Ответ 18+ 🔞

Ну, слушай, тут такая тема с блокировкой по стране, это ж, блядь, как в старом анекдоте: "Вход только для своих, а чужим — хуй". Суть в том, что по IP-адресу пытаемся понять, откуда человек, и если он из нежелательной страны — нахуй его.

На уровне приложения, например на Flask, это выглядит примерно так, если не выёбываться:

from flask import Flask, request, abort
import geoip2.database

app = Flask(__name__)

# Качаем эту базу данных GeoLite2 отдельно, блядь, она не волшебная, сама не появится
reader = geoip2.database.Reader('path/to/GeoLite2-Country.mmdb')

# Коды стран, которым мы говорим "иди нахуй". Формат ISO, два буковки.
BLOCKED_COUNTRIES = {'RU', 'CN', 'KP'}

@app.before_request
def block_by_country():
    # Берём IP того, кто стучится
    ip_address = request.remote_addr
    try:
        # Спрашиваем у базы: "Ну чё, мудила, откуда этот IP?"
        response = reader.country(ip_address)
        country_code = response.country.iso_code

        # Если его код в нашем чёрном списке — пиздуй отсюда, 403 тебе в сраку
        if country_code in BLOCKED_COUNTRIES:
            abort(403, description="Access from your country is restricted.")

    except geoip2.errors.AddressNotFoundError:
        # IP в базе не нашли (например, localhost) — ладно, проходи, раз такой непонятный
        pass
    except Exception as e:
        # Что-то пошло не так, логируем ошибку, но пользователя не ебём
        app.logger.error(f"GeoIP lookup failed for {ip_address}: {e}")

# ... дальше твоё приложение живёт своей жизнью ...

Но тут, ёпта, есть нюансы, на которые надо глаза открыть:

  • Где блокировать? Если делать это прямо в приложении — оно будет тратить силы на эту хуйню для каждого запроса. Умные люди ставят блокировку на уровне веб-сервера (Nginx) или на краю сети (CDN/WAF). Там это делается в разы быстрее и приложение не отвлекается на ерунду.
  • Надёжность — пиздец какая низкая. Любой школьник с VPN или Tor обойдёт эту защиту, как хуй через пальцы. Так что это фильтр для ленивых, а не для параноиков.
  • База данных должна быть свежей. IP-адреса как тараканы — плодятся и перемещаются. Качай обновления для GeoLite2 или плати за коммерческую версию.
  • Обработка ошибок — святое. Если база глюкнула или IP не определился, нельзя просто так взять и послать легитимного пользователя. Надо пропустить его и записать в лог, что, мол, "ёперный театр, опять что-то сломалось".