INT 21h

Hi, I am Vladimir Smagin, SysAdmin and Kaptain. Telegram Email / GIT / RSS / GPG

Nginx: ограничиваем доступ к сайту по geoip с исключением IP адресов

№ 11772 В разделе Sysadmin от June 30th, 2022,
В подшивках: ,

Допустим, вы хотите ввести ответных санкций против свободного и демократичного мира, но не против всех, т.к. далеко не все там свободные и демократичные. Например, Телеграм.

Первым что нужно сделать это установить базу данных GeoIP. Как это сделать любой сисадмин в курсе, здесь это писать не нужно. Также хотелось бы сделать отдельный лог файл для всех заблокированных запросов.

Заранее добавим в nginx.conf описание формата лог файла. Я его предпочитаю держать в формате CSV для более легкого парсинга.

log_format csv '"$server_name","$remote_addr","$time_iso8601","$status","$request","$request_time","$upstream_response_time","$http_user_agent","$http_referer","$geoip_country_code3"';

Создаем 2 файла, в первом описываем правила и исключения, второй будем инклудить в секции server.

Назовем первый файл /etc/nginx/geoip.conf и заинклудим его в секцию http. В нем лежат мапы и исключения.

# тут и так все понятно, сами разберетесь
geoip_country /usr/share/GeoIP/GeoIP.dat;

geo $ex {
    default 0;
    149.154.160.0/22 1; #telegram
    95.217.176.215 1; #кто-то еще
}

map $geoip_country_code3 $allowed_country {
    default yes;
    EUE no;
    JPN no;
    USA no;
    UKR no;
    CAN no;
    GBR no;
    TUR no;
    ISL no;
    GRL no;
    DEU no;
    POL no;
    FRA no;
    EST no;
    BGR no;
    AUT no;
    AUS no;
    CZE no;
    DNK no;
    FIN no;
    HRV no;
    HUN no;
    ITA no;
    LTU no;
    LVA no;
    NLD no;
    ROU no;
    SVN no;
    UMI no;
    VGB no;
    VIR no;
    XKX no;
    CYP no;
    FLK no;
    CYM no;
    SHN no;
    AZE no;
    KOR no;
}

# мапаем ошибку 410 так, чтобы переменной geolog передалось значение.
map $status $geolog {
    410  1;
    default 0;
}

# здесь собираем лог файл, если переменная geolog получила значение.
access_log /var/log/nginx/geoblock.log csv if=$geolog;

# ошибка 410 передается когда условия блокировки выполнены и сразу же посетителя отправляем смотреть на банан.
error_page 410 http://7829.selcdn.ru/page-errors/geo.html;

Второй файл geoip_check.conf размещается рядом, он будет инклудиться уже в секции server

# чисто для удобства отладки, не обязательно
add_header X-GEO $geoip_country_code3 always;

# а вот и проверочки. Если IP оказался в списках исключений мы сразу же ставим
# allowed_country в yes и пропускаем запрос дальше в обход второй проверки. 
# В противном случае будет выполнена вторая проверка, которая уже выдаст ошибку 410.
if ($ex = 1) {
    set $allowed_country yes;
}

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

Да вот собственно и вся хитрость. Многие поисковики (например, bing) сканят только из штатов, сайт может быть понижен или удален в их выдаче. Но наши яндексы и другие отличненько работают. Даже гугол пробивается сквозь эти блокировки.

Нет комментариев »

Leave a Reply

Your email address will not be published. Required fields are marked *

*

Облачная платформа

Микроблог перейти


🇷🇺 © Vladimir Smagin, 2005-2023. Копирование материалов без разрешения запрещено. GPG *
Яндекс.Метрика

Fortune cookie: Today's spam: Cure impotence , by improving those weak erections.